* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Стек TCP/IP
23 февраля 2009

Физический и канальный уровень полностью реализуются сетевой картой (или модемом, или другим устройством, выполняющим ту же функцию) и её драйвером. Здесь действительно достигнута настолько полная абстракция, что программист обычно не задумывается о том, какая используется сеть. Поэтому мы также не будем в данной работе останавливаться на этих двух уровнях.
В реальной жизни не все протоколы соответствуют модели OSI. Особенно это касается старых протоколов. Существует такое понятие, как стек протоколов - набор протоколов разных уровней, которые совместимы друг с другом. Эти уровни не всегда точно соответствуют тем, которые предлагает модель OSI, но определённое разделение задач на уровни в них присутствует. В данной работе мы сосредоточимся на стеке протоколов, который называется TCP/IP (нередко можно услышать словосочетание "протокол TCP/IP" - это не совсем корректно: TCP/IP не протокол, а стек протоколов). Название этот стек получил по названию двух самых известных своих протоколов - TCP и IP.
IP расшифровывается как Internet Protocol. Это название иногда ошибочно переводят как "протокол интернета" или "протокол для интернета". На самом деле когда разрабатывался этот протокол, никакого интернета ещё и в помине не было, поэтому правильный перевод - межсетевой протокол. История появления этого протокола связана с особенностями работы сети Ethernet. Эта сеть строится по принципу шины, когда все компьютеры подключены, грубо говоря, к одному проводу. Если хотя бы два компьютера попытаются одновременно передавать данные по общей шине, возникнет неразбериха, поэтому все шинные сети строятся по принципу "один говорит - все слушают". Очевидно, что требуется какая-то защита от т.н. коллизий - ситуаций, когда два узла одновременно пытаются передавать данные.
Разные сети решают проблему коллизий по-разному. В промышленных сетях, например, обычно используется маркер - специальный индикатор, который показывает, какому узлу разрешено сейчас передавать данные. Узел, называемый мастером, следит за тем, чтобы маркер вовремя передавался от одного узла к другому. Маркер исключает возможность коллизий. Ethernet же является одноранговой сетью, в которой нет мастера, поэтому в ней используется другой подход: коллизии допускаются, но существует механизм их разрешения, заключающийся в том, что, во-первых, узел не начинает передачу данных, если видит, что другой узел уже что-то передаёт, а во-вторых, если два узла одновременно пытаются начать передачу, то оба прекращают попытку и повторяют её через случайный промежуток времени. У кого этот промежуток окажется меньше, тот и захватит сеть (или за этот промежуток времени сеть будет захвачена кем-то ещё).
При большом числе компьютеров, сидящих на одной шине, коллизии становятся слишком частыми, и производительность сети резко падает. Для борьбы с этим используются специальные устройства - роутеры. Роутер является узлом, подключенным одновременно к нескольким сетям. Пока остальные узлы каждой из этих сетей взаимодействуют только между собой, роутер никак себя не проявляет, и эти сети существуют независимо друг от друга. Но если компьютер из одной сети посылает пакет компьютеру другой сети, этот пакет получает роутер и переправляет его в ту сеть, в которой находится адресат, или в которой находится другой роутер, способный передать этот пакет адресату.
На канальном уровне существует адресация узлов, основанная на т.н. MAC-адресе сетевой карты (MAC - это сокращение Media Access Control). Этот адрес является уникальным номером карты, присвоенной ей производителем. Очевидно неудобство такого способа адресации, т.к. по MAC-адресу невозможно определить положение компьютера в сети, т.е. куда направлять пакет. Кроме того, при замене сетевой карты меняется адрес компьютера, что также не всегда удобно. Поэтому на сетевом уровне определяется собственный способ адресации, не связанный с аппаратными особенностями узла. Отсюда следует, что роутер должен понимать протокол сетевого уровня, чтобы принимать решение о передаче пакета из одной сети в другую, а протокол, в свою очередь, должен учитывать наличие роутеров в сети и предоставлять им необходимую информацию. Протокол IP был одним из первых протоколов сетевого уровня, который решал такую задачу, и с его помощью стала возможной передача пакетов между сетями. Поэтому он и получил название межсетевого протокола. Впрочем, название прижилось: в некоторых статьях MSDN'а сетевой уровень (network layer) называется межсетевым уровнем (internet layer). В протоколе IP, в частности, вводится важный параметр для каждого пакета: максимальное число роутеров, которое он может пройти, прежде чем попадёт к адресату. Это позволяет защититься от бесконечного блуждания пакетов по сети.
Здесь следует заметить, что сеть Ethernet ушла далеко вперёд по сравнению с моментом создания протокола IP и теперь организована сложнее, поэтому не следует думать, что в предыдущих абзацах изложены все принципы работы этой сети (их изложение выходит за рамки данной статьи). Тем не менее, протокол IP по-прежнему используется, а компьютеры по-прежнему видят в сети не только свои, но и чужие пакеты. На этом основана работа т.н. снифферов - программ, позволяющих одному компьютеру читать пакеты, пересылаемые между двумя другими компьютерами.
Для адресации компьютера протокол IP использует уникальное четырёхбайтное число, называемое IP-адресом. Впрочем, более распространена форма записи этого числа в виде четырёх однобайтных значений. Система назначения этих адресов довольно сложна и призвана оптимизировать работу роутеров, обеспечить прохождение широковещательных пакетов только внутри определённой части сети и т.п. Мы здесь не будем разбирать эту систему, потому что в правильно настроенной сети программисту не нужно знать эти тонкости: достаточно знать, что каждый узел имеет уникальный IP-адрес, для которого принята запись в виде четырёх цифровых полей, разделённых точками, например, 192.168.200.217. Также следует знать, что адреса из диапазона 127.0.0.1-127.255.255.255 задают т.н. локальный узел: через эти адреса могут связываться программы, работающие на одном компьютере. Таким образом, обеспечивается прозрачность местонахождения адресата. Кроме того, один компьютер может иметь несколько IP-адресов, которые могут использоваться для одного и того же или разных сетевых интерфейсов.
Кроме IP, в стеке TCP/IP существует ещё несколько протоколов, решающих задачи сетевого уровня. Эти протоколы не являются полноценными протоколами и не могут заменить IP. Они используются только для решения некоторых частных задач. Это протоколы ICMP, IGMP и ARP.
Протокол ICMP (Internet Control Message Protocol - протокол межсетевых управляющих сообщений) обеспечивает диагностику связи на сетевом уровне. Многим знакома утилита ping, позволяющая проверить связь с удалённым узлом. В основе её работы лежат специальные запросы и ответы, определяемые в рамках протокола ICMP. Кроме того, этот же протокол определяет сообщения, которые получает узел, отправивший IP-пакет, если этот пакет по каким-то причинам не доставлен.
Протокол называется надёжным (reliable), если он гарантирует, что пакет будет либо доставлен, либо отправивший его узел получит уведомление о том, что доставка невозможна. Кроме того, надёжный протокол должен гарантировать, что пакеты доставляются в том же порядке, в каком они отправлены, и дублирования сообщений не происходит. Протокол IP в чистом виде не является надёжным протоколом, т.к. в нём вообще не предусмотрены средства уведомления узла о проблемах с доставкой пакета. Использование ICMP также не делает IP надёжным, т.к. ICMP-пакет является частным случаем IP-пакета, и также может не дойти до адресата, поэтому возможны ситуации, когда пакет не доставлен, а отправитель об этом не подозревает.
Протокол IGMP (Internet Group Management Protocol - протокол управления межсетевыми группами) предназначен для управления группами узлов, которые имеют один групповой IP-адрес. Отправка пакета по такому адресу можно рассматривать как нечто среднее между адресной и широковещательной рассылкой, т.к. такой пакет будет получен сразу всеми узлами, входящими в группу.
Протокол ARP (Address Resolution Protocol - протокол разрешения адресов) используется для установления соответствия между IP- и MAC-адресами. Каждый узел имеет таблицу соответствия. Исходящий пакет содержит два адреса узла: MAC-адрес для канального уровня и IP-адрес для сетевого. Отправляя пакет, узел находит в своей таблице MAC-адрес, соответствующий IP-адресу получателя, и добавляет его к пакету. Если в таблице такой адрес не найден, отправляется широковещательное сообщение, формат которого определяется протоколом ARP. Получив такое сообщение, узел, чей IP-адрес соответствует искомому, отправляет ответ, в котором указывает свой MAC-адрес. Этот ответ также является широковещательным, поэтому его получают все узлы, а не только отправивший запрос, и все узлы обновляют свои таблицы соответствия.
Строго говоря, правильное функционирование протоколов сетевого уровня - задача администратора системы, а не программиста. В своей работе программист чаще всего использует более высокоуровневыми протоколами и не интересуется деталями реализации сетевого уровня.
Протоколами транспортного уровня в стеке TCP/IP являются протоколы TCP и UDP. Строго говоря, они решают не только задачи транспортного уровня, но и небольшую часть задач уровня сессии. Тем не менее, они традиционно называются транспортными. Эти протоколы рассматриваются в следующих разделах данной статьи.
Уровни сессии, представлений и приложения в стеке TCP/IP не разделены: протоколы HTTP, FTP, SMTP и т.д., входящие в этот стек, решают задачи всех трёх уровней. Мы здесь не будем рассматривать эти протоколы, потому что при использовании сокетов они в общем случае не нужны: программист сам определяет формат пакетов, отправляемых с помощью TCP или UDP.
Новички нередко думают, что фраза "программа поддерживает соединение через TCP/IP" полностью описывает то, как можно связаться с программой и получить данные. На самом деле необходимо знать формат пакетов, которые эта программа может принимать и отправлять, т.е. должны быть согласованы протоколы уровня сессии и представлений. Гибкость сокетов даёт программисту возможность самостоятельно определить этот формат, т.е., по сути дела, придумать и реализовать собственный протокол поверх TCP или UDP. И без описания этого протокола организовать обмен данными с программой невозможно.
Всё, что было написано в этом разделе статьи, а также в предыдущем, можно и не знать, но, тем не менее, успешно использовать сокеты в своих программах. Но для программиста, на мой взгляд, очень важно понимание картины в целом, поэтому я и вставил эти два раздела.


Теги: HTTP, FTP, SMTP, TCP, IP Borland Delphi

Статьи по теме:

LanguageStr
Окна рабочего стола
Связь между ЛВС посредством мостов
Панель HTML Table
Базы данных, СУБД, дифференциальные файлы
AddIndex
PhysicalRecNo
Основы CLS
Тема циклы
Свойство PrintIfEmpty
Свойство FooterBand
Разрешение и запрет
Использование адресной книги
ЛВС — информационно-вычислительные системы. Классификация ЛВС
Свойство Alignment
| Borland Delphi | Alex |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | Borland Delphi | Стек TCP/IP. Регион сайта: Москва и Санкт-Петербург