Вопрос или проблема
Я изучаю модели OSI и TCP/IP и у меня есть некоторые путаницы:
Например, я ввожу этот адрес: 192.168.4.5:9300 в браузере, и все эти ДАННЫЕ передаются на транспортный уровень в двоичном виде. Как уровень TCP в обеих моделях извлекает информацию о порте, такой как src/dest, из ДАННЫХ прикладного уровня?
TCP использует собственный заголовок, который содержит эту информацию:
https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure
Прикладные данные, следующими за заголовком, не содержат такой информации.
IP-адреса источника и назначения содержатся в заголовке инкапсулирующего IP-пакета. TCP-сегмент (заголовок + данные) следует за этим заголовком.
https://en.wikipedia.org/wiki/IPv4#Packet_structure
Как уровень TCP в обеих моделях извлекает информацию о порте, такой как src/dest, из ДАННЫХ прикладного уровня?
Он не извлекает.
Как вы знаете, сетевой протокол (обычно известный как “TCP/IP”) не соответствует модели OSI. Модель OSI имеет транспортный уровень, но TCP не является транспортным уровнем OSI. На самом деле модель OSI, возможно, устарела. Она применялась к в значительной степени устаревшим протоколам, таким как X.25, я бы сказал, что она неактуальна для каких-либо интернет-протоколов, которые активно используются в прошлом или настоящем.
В TCP/IP (V4) заголовок TCP находится в начале части данных IP-пакета. Первые элементы заголовка TCP – это 16-битный номер порта источника и номер порта назначения.
Элемент данных TCP содержит заголовок и данные протокола прикладного уровня. Данные прикладного уровня не нуждаются в номерах TCP-портов и обычно не содержат этой информации.
Например, я ввожу этот адрес: 192.168.4.5:9300 в браузере, и все эти ДАННЫЕ передаются на транспортный уровень в двоичном виде
Однако он не передается как единый двоичный blob. Интерфейс между уровнями не ограничивается этим – он определяется в терминах различных функций (или ‘примитивов’, как их называет OSI), которые нижний уровень предоставляет верхнему уровню, и они могут быть указаны для принятия любого количества параметров, не обязательно только ‘двоичных данных’.
-
Например, ITU-T X.214, также известный как ISO 8072 (что является определением “Транспортной службы” OSI), указывает, что транспортный уровень должен предоставлять функцию
T-CONNECT(src_address, dst_address, [и т.д.], user_data)
в дополнение кT-DATA(user_data)
.(Хотя определения услуг OSI не были написаны для TCP/IP – например, “Транспортный” уровень фактически описывает конкурирующие протоколы OSI TP0-TP4, но они по общему функционалу схожи с TCP интернета.)
-
Аналогично, RFC 9293 (спецификация TCP/IP), конкретно раздел 3.9.1 “Интерфейс пользователя/TCP”, определяет функцию
OPEN (локальный порт, удаленный сокет, активный/пассивный, [и т.д.])
в дополнение кSEND (...)
. -
На практике это обычно реализуется в стиле “BSD-сокетов”, где браузер создает сокет, вызывает
connect(<адрес, порт>)
на сокете (запрашивая TCP выполнить рукопожатие), а затем каждыйsend()
ссылается на уже установленный дескриптор сокета.
Другими словами, адрес и порт указываются как отдельные поля, поэтому нет ничего, что транспортный уровень (или любой нижний уровень, в общем) нужно извлекать.
Ответ или решение
Краткий ответ на ваш вопрос о том, как протокол TCP получает информацию о портах, требует понимания нескольких ключевых аспектов передачи данных в стековых моделях OSI и TCP/IP.
1. Стек протоколов: структура уровней
В стеке TCP/IP использование слоев значительно отличается от модели OSI. Несмотря на то что обе модели имеют транспортный слой, TCP работает не согласно определению OSI, а представляет собой собственный протокол, который используется в интернете. В TCP/IP модель структуры данных и передачи данных четко определена, что позволяет эффективно обрабатывать как адресацию IP, так и сопоставление портов.
2. Как формируется структура данных TCP
Когда пользователи вводят адрес, например, 192.168.4.5:9300
, браузер осуществляет следующие шаги:
- Разделение адреса на компоненты: IP-адрес (192.168.4.5) и номер порта (9300) извлекаются в браузере.
- Создание сокета: Браузер создает сокет, используя системные вызовы, такие как
socket()
иconnect()
, где локальный и удаленный адреса передаются в виде отдельных параметров.
3. Заголовок TCP и информация о портах
TCP использует заголовок в своей структуре для передачи информации о портах. Заголовок содержит 16-битные поля для источника и назначения, что позволяет передать необходимую информацию без необходимости извлечения ее из прикладных данных.
- Структура заголовка TCP: Заголовок TCP помещается в начале сегмента TCP, и в нем находятся следующие поля:
- Порт источника: указывает номер порта, с которого инициируется соединение.
- Порт назначения: указывает номер порта, к которому происходит подключение.
Эти поля помещаются в заголовок автоматически при формировании пакета TCP, и они не извлекаются из прикладной информации, переданной на более высоком уровне.
4. Роль других слоев
При передаче данных через сеть:
- IP-уровень содержит адресацию полностью, и заголовок IP пакета также включает информацию об источнике и назначении.
- TCP, как транспортный протокол, управляет сегментацией и передачей данных между приложениями, используя свои собственные механизмы (например, управление установлением соединения и восстановлением после потери).
5. Заключение
Важно понимать, что TCP не извлекает информацию о портах из данных прикладного уровня. Вместо этого данные передаются вместе с заголовком TCP, который содержит необходимую информацию. При этом взаимодействие между слоями осуществляется через четко определенные интерфейсы и функции, которые отдают приоритет отделению информации по разным уровням вместо передачи данных "с одним куском" в бинарном формате.
Эта структура не только обеспечивает высокую степень управляемости и эффективности, но и позволяет протоколам работать согласованно в сложных сетевых топологиях. Познание особенностей работы TCP и взаимодействия его с другими слоями сетевой модели соответствует современным требованиям в области информационных технологий и обеспечит вам глубокое понимание процесса передачи данных.