Протокол TCP

 

Протокол TCP (Transmission Control Protocol, Протокол управления передачей) описан в RFC 793. Он обеспечивает надежную передачу потока данных, используя сервис передачи дейтаграмм протокола IP. Пакеты, передаваемые протоколом TCP, называются сегментами. Надежность передачи обеспечивается при помощи нумерации байтов потока и подтверждений приема. Все байты исходного потока данных нумеруются (этот номер называется номером в последовательности (sequence number)), и с каждым сегментом передается номер в последовательности его первого байта.

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

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

Сегмент состоит из заголовка и поля данных. Формат заголовка сегмента TCP приведен на рис.

 

Порт отправителя Порт получателя
Номер в последовательности
Номер подтверждения
Смещение данных Резерв Биты управления Окно
Контрольная сумма Указатель срочности
Опции Выравнивание
         

 

Порт отправителя (Source port) и Порт получателя (Destination port) [16 бит] – номера портов на узлах.

Номер в последовательности (Sequence Number) [32 бита] – номер в потоке первого байта данных этого сегмента. Если установлен управляющий бит SYN, то в этом поле содержится начальный номер в последовательности (Initial Sequence Number, ISN) и первый байт данных сегмента имеет номер в потоке ISN+1.

Номер подтверждения (Acknowledgement number) [32 бита] – номер байта в потоке, ожидаемого отправителем данного сегмента. При этом должен быть установлен управляющий бит ACK.

Смещение данных (Data offset) [4 бита] – количество 32-битовых слов в заголовке TCP-сегмента. Минимальное значение поля – 5 (20-ти байтовый заголовок).

Резерв (Reserved) [6 битов] – должны быть заполнены нулями.

Биты управления (Control bits) [6 битов] – от старшего к младшему:

URG (Urgent Pointer field significant) – принимать во внимание поле Указатель срочности

ACK (Acknowledgement field significant) – принимать во внимание поле Номер подтверждения

PSH (Push function) – сегмент содержит “протолкнутые” данные

RST (Reset the connection) – прервать связь

SYN (Synchronize sequence numbers) – синхронизировать номера байтов в потоке

FIN (No more data from sender) – отправитель больше не будет передавать данные

Окно (Window) [16 бит] – размер окна – количество байтов данных, начиная с указанного в поле Номер подтверждения, которые отправитель данного сегмента готов принять.

Контрольная сумма (Checksum) [16 бит] – контрольная сумма всего сегмента (заголовка и данных), вычисляется по алгоритму протокола IP. Как и в UDP, перед вычислением контрольной суммы к сегменту приписывается псевдозаголовок (той же структуры, что и в UDP).

Указатель срочности (Urgent Pointer) [16 бит] – содержит номер первого байта, имеющего обычный статус срочности. При этом должен быть установлен управляющий бит URG.

Опции (Options) [переменный размер] – дополнительная служебная информация. Подобно опция заголовка IP-дейтаграммы, имеют переменную длину и могут вообще отсутствовать.

Выравнивание (Padding) – поле, используемое для доведения размера заголовка до целого числа 32-битовых слов.

 

Каждый раз при установлении соединения модуль TCP создает структуру данных – Блок управления передачей (Transmission Control Block, TCB), хранящую постоянную информацию о соединении (IP-адреса, номера портов, указатели на входной и выходной буферы, очередь повторной отправки и т.д.) и текущие значения переменных, описывающих текущее состояние соединения. К этим переменным относятся:

SND.UNA – не подтвержденная посылка

SND.NXT – следующий сегмент на отправку

SND.WND – окно отправки

SND.UP – указатель срочности для отправляемых данных

SND.WL1 – номер в последовательности, использованный для последней коррекции окна

SND.WL2 – номер подтверждения, использованный для последней коррекции окна

ISS – начальный номер в последовательности для отправки

RCV.NXT – следующий сегмент, который можно принять

RCV.WND – окно приема

RCV.UP – указатель срочности для принимаемых данных

IRS – начальный номер в последовательности для приема

Кроме того, значения некоторых полей заголовка текущего сегмента тоже переносятся в переменные TCB:

SEG.SEQ – номер в последовательности из

SEG.ACK – номер подтверждения

SEG.LEN – длина сегмента

SEG.WND – размер окна

SEG.UP– указатель срочности

SEG.PRC – приоритет

 

TCP-соединение может находиться в разных состояниях:

LISTEN (Прослушивание) – ожидание запроса на соединение

SYN-SENT (Синхронизация отправлена) – ожидание парного запроса на соединение (после того, как был отправлен запрос на соединение)

SYN-RECEIVED (Синхронизация получена) – ожидание подтверждения после обмена запросами на соединение

ESTABLISHED (Установлено) – соединение установлено и может передавать пользовательские данные; основное рабочее состояние

FIN-WAIT-1 (Ожидание завершения 1) – ожидание запроса на завершение соединения или подтверждения своего запроса на завершение соединения

FIN-WAIT-2 (Ожидание завершения 2) – ожидание запроса на завершение соединения

CLOSE-WAIT (Ожидание закрытия) – ожидание запроса на закрытие соединения от своего прикладного процесса

CLOSING (Закрытие) – ожидание подтверждения запроса на закрытие соединения

LAST-ACK (Последнее подтверждение) – ожидание подтверждения запроса на закрытие соединения (в котором содержалось подтверждение запроса на закрытие соединения)

TIME-WAIT (Ожидание) – пауза для уверенности. что дальняя сторона соединения получила подтверждение своего запроса на закрытие соединения

CLOSED (Закрыто) – соединение закрыто

 

14. ПРОТОКОЛЫ И СЛУЖБЫ НА ОСНОВЕ TCP/IP