СТЕКуемся? Kirion (Kirion@winfo.org) Спецвыпуск Xakep, номер #032, стр. 032-024-2 Настоящее А что представляет собой современный стандарт на стек TCP/IP? Как известно, стек состоит из четырех уровней (в отличие от семиуровневой модели OSI): уровня приложений, транспортного, сетевого и канального уровней. На каждом уровне находятся свои протоколы. Информация, которая передается по сети, проходит по всем уровням протоколов, сверху вниз. На каждом уровне соответствующий протокол дописывает свой заголовок к пакету и передает вниз, до канального уровня, на котором окончательно сформированный кадр отправляется через сетевой интерфейс. Например, такая схема: HTTP>TCP>IP>драйвер сетевого интерфейса>сеть. На канальном уровне находится всего один важный протокол - ARP (Address resolution protocol, RFC 826), который позволяет определять MAC-адрес сетевых интерфейсов. На сетевом уровне правят бал IP (Internet protocol, RFC 791) и вспомогательные протоколы маршрутизации, главными из которых являются ICMP (Internet control message protocol, RFC 792) и IGMP (internet group management protocol, RFC 2236). Протокол IP получает и отправляет датаграммы от одного IP-адреса к другому. При этом протокол не заботится о надежности передачи и не имеет механизма подтверждения - все это есть уже на транспортном уровне. ICMP же используется для передачи служебной и управляющей информации, например, о недостижимости узла или перенаправлении пакетов. А IGMP используется для управления широковещательными (multicast) сообщениями, позволяя узлу сообщать маршрутизаторам о своей принадлежности к группам. Современные стеки поддерживают такие расширения IP, как CIDR (Classless Internet Direct Routing, прямая бесклассовая маршрутизация в Интернет), переходное, но успешное решение до ввода IPv6, и IPsec, протокол шифрования на сетевом уровне. На транспортном уровне у нас два протокола: TCP и UDP. UDP (User datagram protocol, RFC768) - это более простой протокол. Он не контролирует надежность передачи данных и не устанавливает соединение. Зато работает быстрее и генерирует трафик меньше, чем TCP. Применение UDP оправданно, если нужно передать небольшие, но срочные данные (например, DNS-запросы), если имеется хороший канал связи (почти все локальные чаты работают на UDP) или если надежность доставки гарантируется другими средствами (игровые протоколы в основном используют UDP). В остальных случаях используется TCP (Transport control protocol, RFC 793), который обеспечивает надежную доставку сообщений. TCP устанавливает соединение, посылая сегмент с установленным флагом SYN (Synchronize sequence numbers) и Initial Sequence Number (начальный номер последовательности) и получая в ответ сегмент с флагом ACK (Acknowledgment). Это так называемый механизм "TCP handshake". Начальный номер последовательности нужен для нумерации сегментов в установленном соединении: они нумеруются по определенному закону (зависит от реализации стека) и используются для контроля при поступлении (чтобы не пропустить сегмент). Кроме того, для каждого сегмента подсчитывается контрольная сумма, что позволяет обнаружить его повреждение при передаче и запросить новый (по известному номеру последовательности). Ну а уровень приложений - это множество протоколов высокого уровня: тут и HTTP, и FTP, POP3, SMTP, SNMP, SSL и многие другие. Таков современный стек TCP/IP в общем виде. Только вот в таком виде он не имеет будущего. |