Основные теоретические сведения

Протокол TCP (Transmission Control Protocol, Протокол контроля передачи) обеспечивает доставку данных между прикладными процессами, запущенными на узлах, взаимодействующих по сети. Стандартное описание TCP содержится в RFC-793.

TCP – является протоколом с установлением соединения. Он находится на транспортном уровне стека TCP/IP, между протоколом IP и прикладным уровнем (приложением). Протокол IP занимается пересылкой дейтаграмм по сети, никак не гарантируя доставку, целостность или порядок прибытия информации; все эти задачи возложены на протокол TCP.

При получении дейтаграммы, в поле Protocol указан код протокола TCP. Модуль IP передает данные этой дейтаграммы модулю TCP. Эти данные представляют собой TCP-сегмент, содержащий TCP-заголовок и данные пользователя (прикладного процесса). Модуль TCP анализирует служебную информацию заголовка, определяет, какому именно процессу предназначены данные пользователя, проверяет целостность и порядок прихода данных и подтверждает их прием другой стороне. По мере получения правильной последовательности неискаженных данных пользователя они передаются прикладному процессу.

Протокол TCP обеспечивает работу одновременно нескольких соединений. Каждый прикладной процесс идентифицируется номером порта. Заголовок TCP-сегмента содержит номера портов процесса-отправителя и процесса-получателя. При получении сегмента модуль TCP анализирует номер порта получателя и отправляет данные соответствующему прикладному процессу. Назначение номеров портов прикладным процессам осуществляется либо централизованно, если эти процессы представляют собой популярные службы (номер порта сервера электронной почты - 25, сервера FTP - 21), либо локально. Локальное присвоение номера порта заключается в том, что разработчик просто связывает с ним любой доступный, произвольно выбранный числовой идентификатор. Протокол ведет для каждого порта две очереди: очередь пакетов, поступающих в данный порт из сети (процедура мультиплексирования) и очередь пакетов отправляемых данным портом в сеть (процедура демультиплексирования).

Совокупность IP-адреса и номера порта называется сокетом (socket). Сокет уникально идентифицирует прикладной процесс в Интернет. Например, сокет сервера электронной почты на хосте 194.84.124.4 обозначается как 194.84.124.4:25.

Единицей данных протокола TCP является сегмент. Информация, поступающая к протоколу в рамках логического соединения от протоколов более высокого уровня, рассматривается протоколом TCP как неструктурированный поток байтов. Поступающие данные буферизируются средствами TCP. Для передачи на сетевой уровень из буфера «вырезается» некоторая непрерывная часть данных, которая и называется сегментом. Не все сегменты будут одного и того же размера, однако оба участника соединения должны договориться о максимальном размере сегмента, который они используют. Этот размер выбирается таким образом, чтобы при упаковке в IP-пакет он помещался туда целиком. Структура заголовка TCP пакета показана на рисунке 2.1.

Здесь:

· Порт источника и порт приемника - 16-битовые поля, содержащие номера портов источника и адресата TCP-пакета, соответственно.

· Номер в последовательности (sequence number) – 32-битовое поле, содержимое которого косвенно определяет положение данных TCP-пакета внутри исходящего потока данных.

В момент установления логического соединения каждый из двух партнеров генерирует свой начальный "номер в последовательности", основное требование к которому - не повторяться в промежутке времени, в течение которого TCP-пакет может находиться в сети (по сути, это время жизни IP-сегмента). Партнеры обмениваются этими начальными номерами и подтверждают их получение. Во время отправления TCP-пакетов с данными поле "номер в последовательности" содержит сумму начального номера и количества байт ранее переданных данных.

· Номер подтверждения (acknowledgement number) – 32-битовое поле, содержимое которого косвенно определяет количество принятых данных от входящего потока к TCP-модулю, формирующему пакет.

· Смещение данных – четырехбитовое поле, содержащее длину заголовка TCP-пакета в 32-битовых словах и используемое для определения начала расположения данных в TCP-пакете.

· Флаг URG – установленное в 1 значение показывает, что TCP-пакет содержит важные (urgent) данные.

· Флаг ACK – установленное в 1 значение показывает, что TCP-пакет содержит верные данные в поле "номер подтверждения".

· Флаг PSH – установленное в 1 значение показывает, что данные содержащиеся в TCP-пакете должны быть немедленно переданы прикладной программе, для которой они адресованы. Подтверждение для TCP-пакета, содержащего единичное значение во флаге PSH, означает, что и все предыдущие TCP-пакеты достигли адресата.

· Флаг RST – установлен в 1 в пакете, отправляемом в ответ на получение неверного TCP-пакета. Также может означать запрос на переустановление логического соединения.

· Флаг SYN – установленное в 1 значение означает, что TCP-пакет представляет собой запрос на установление логического соединения. Получение пакета с установленным флагом SYN должно быть подтверждено принимающей стороной.

· Флаг FIN – установленное в 1 значение показывает, что TCP-пакет представляет собой запрос на закрытие логического соединения и является признаком конца потока данных, передаваемых в этом направлении. Получение пакета с установленным флагом FIN должно быть подтверждено принимающей стороной.

· Размер окна – 16-битовое поле, содержащее количество байт, которые может принять TCP-модуль, отправляющий партнеру данный пакет. Это поле используется принимающим поток данных TCP-модулем, для управления интенсивностью этого потока. Так, установив значение поля в 0, можно полностью остановить передачу данных, которая будет возобновлена, только если размер окна примет достаточно большое значение.

· Контрольная сумма - 16-битовое поле, содержащее контрольную сумму, подсчитанную для TCP-заголовка, данных пакета и псевдо заголовка.

· Указатель - 16-битовое поле, содержащее указатель (в виде смещения) на первый байт в теле TCP-пакета, начинающий последовательность важных (URG) данных.

· Дополнительные данные заголовка- последовательность полей произвольной длины, описывающих необязательные данные заголовка. Протокол TCP определяет только три типа дополнительных данных заголовка:

- конец списка полей дополнительных данных;

- пусто (No Operation);

- максимальный размер пакета.

Протоколы транспортного уровня, обеспечивающие надежную передачу данных, предполагают обязательное подтверждение принимающей стороной правильности полученных данных.

В протоколе TCP используется принцип "скользящего окна" (sliding window), который заключается в том, что каждая сторона может отправлять партнеру максимум столько байт, сколько партнер указал в поле "размер окна".

Принцип "скользящего окна" обеспечивает "опережающую" посылку данных с "отложенным" их подтверждением. Следует отметить недостаток этого механизма: если в течение некоторого времени не будет получено "отсроченное" подтверждение ранее отправленного пакета, то отправляющий TCP-модуль будет вынужден повторить посылку всех TCP-пакетов, начиная с неподтвержденного.

Размер окна, как правило, определяется объемом свободного места в буфере принимающего TCP-модуля.

Этап взаимодействия компьютеров с использованием протокола TCP строится в три этапа:

o установление логического соединения;

o обмен данными;

o закрытие соединения.

Наши рекомендации