Порты и сокеты

Протоколы транспортного уровня

В набор TCP/IP входит два протокола транспортного уровня: TCP и UDP. TCP ориентирован на соединение и обеспечивает приложениям надежный сервис с гарантированной доставкой данных, подтверждением приема пакетов, управлением потоком данных, обнаружением и коррекцией ошибок. TCP предназначен для передачи с побитовой точностью больших объемов данных, например, программных файлов. Протокол UDP на соединение не ориентирован, обеспечивает ненадежный сервис и используется в основном для обмена короткими запросами и ответами. Неудивительно, что TCP, выполняя свои функции, генерирует большой объем управляющего трафика, тогда как накладные расходы, связанные с использованием UDP, относительно невелики.

Два протокола транспортного уровня из набора TCP/IP обеспечивают приложениям разный уровень обслуживания. Как TCP, так и UDP генерирует единицы данных PDU (protocol data unit), передаваемые внутри дейтаграмм IP. TCP выполняет функции, которых нет у IP, поэтому два этих протокола дополняют, но не дублируют друг друга. Комбинация UDP и IP обеспечивает минимальный транспортный сервис с низким уровнем накладных расходов.

Протокол TCP

Набор протоколов TCP/IP назван по комбинации протоколов TCP и IP, которые в паре отвечают за большую часть трафика в сети TCP/IP. Все интернет-приложения, например, браузеры, FTP-клиенты, программы для работы с электронной почтой, используют протокол TCP для чтения больших объемов данных с серверов. TCP описан в документе RFC 793, опубликованном рабочей группой IETF в 1981 г.

Заголовок TCP

Протоколы транспортного уровня инкапсулируют данные, полученные от протоколов прикладного уровня, добавляя к ним свой заголовок, как это делают и протоколы более низких уровней. Часто протоколы прикладного уровня передают TCP больше данных, чем вмещает отдельный пакет, поэтому TCP разбивает данные на несколько сегментов (segments). Совокупность сегментов, составляющих единую транзакцию, называется последовательностью (sequence). К каждому сегменту добавляется собственный заголовок TCP (рис. 7.1), после чего он передается на сетевой уровень для передачи в отдельной дейтаграмме. Когда все сегменты достигают целевого компьютера, он восстанавливает из них исходную последовательность.

Source Port Destantiun Port
SequenceNumber
Acknowledgment Number
Data Offset Reserved Control Bits Window
Checksum Urgent Pointer
  Options
  Data
       

Рис. 1. Формат сообщения TCP

Функции полей сообщения TCP таковы.

Source Port (2 байта) — идентификатор процесса в передающей системе, который сгенерировал информацию в поле данных.

Destination Port (2 байта) — идентификатор процесса в принимающей системе, которому предназначается информация в поле данных.

Sequence Number (4 байта) — задает положение данных в сегменте относительно всей последовательности.

Acknowledgment Number (4 байта) — в сообщениях с подтверждением приема это поле задает номер в последовательности следующего сегмента, ожидаемого принимающей системой.

Data Offset (4 бита) — количество 4-байтовых слов в заголовке TCP.

Reserved (6 бит) — не используется.

Control Bits (6 бит) — 6 однобитовых флагов, определяющих функцию сообщения.

Window (2 байта) — максимальное число байтов, которое компьютер способен принять от подключенной к нему системы.

• Checksum (2 байта) — код CRC, вычисленный передающей системой. Целевая система использует его для обнаружения ошибок в заголовке TCP, данных и частях заголовка IP.

• Urgent Pointer (2 байта) — если задан управляющий бит срочности (URG), в этом поле указано, какие данные в сегменте получатель должен считать срочными.

• Options (переменной длины) — может содержать информацию, связанную с необязательными параметрами конфигурации TCP.

• Data (переменной длины) — может содержать один сегмент из последовательности, сгенерированной протоколом прикладного уровня.

Порты и сокеты

Как и у протоколов сетевого и канального уровней, одна из важнейших функций протокола транспортного уровня заключается в идентификации протокола или процесса, сгенерировавшего переносимые им данные. В TCP и UDP идентификация осуществляется по номеру порта (port), который назначен данному процессу организацией IANA

(Internet Assigned Numbers Authority). Номера портов опубликованы в RFC 1700. Кроме того, список часто используемых портов содержится в текстовом файле SERVICES, поставляемом с каждым клиентом TCP/IP. Когда пакет TCP/IP достигает цели, протокол транспортного уровня, принявший дейтаграмму, считывает номер порта из поля Destination Port и передает информацию из поля данных программе или протоколу, ассоциированному с этим портом.

Всем основным приложениям Интернета присвоены номера портов, которые называются хорошо известными портами (well-known ports). Их список приведен в таблице 7.1. Например, порт Web-сервера — 80, а порт сервера DNS — 53. TCP и UDP поддерживают отдельные списки номеров хорошо известных портов. Например, протокол FTP использует порты TCP 20 и 21. Так как на транспортном уровне протокол FTP пользуется только протоколом TCP, другие протоколы прикладного уровня могут использовать порты 20 и 21 с протоколом UDP. В некоторых случаях протокол прикладного уровня может пользоваться обоими протоколами транспортного уровня. DNS, например, связан как с портом TCP 53, так и с портом UDP 53.

Адресуя трафик другой системе, TCP/IP-система использует комбинацию IP-адреса и номера порта, которая называется сокетом (socket).

Хорошо известные порты, опубликованные в RFC 1060, относятся, главным образом, к серверам. Поскольку связь с данным сервером инициирует обычно клиент (а не наоборот), клиентам постоянные номера портов не нужны. На время связи с конкретным сервером клиентская программа обычно случайным образом выбирает временный номер порта (ephemeral port number). IANA контролирует только номера портов в пределах от 1 до 1023, поэтому временные номера портов принимают значения от 1024 и выше. Сервер, получивший пакет от клиента, использует значение из поля Source Port заголовка TCP, чтобы адресовать ответ правильному временному порту клиентской системы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: