logo search
Varianty / SETI2

ПротоколTcp

Протокол TCP(TransmissionControlProtocol, Протокол управления передачей) описан вRFC793. Он обеспечивает надежную передачу потока данных, используя сервис передачи дейтаграмм протоколаIP. Пакеты, передаваемые протоколомTCP, называются сегментами. Надежность передачи обеспечивается при помощи нумерации байтов потока и подтверждений приема. Все байты исходного потока данных нумеруются (этот номер называется номером в последовательности (sequencenumber)), и с каждым сегментом передается номер в последовательности его первого байта.

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

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

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

Порт отправителя

Порт получателя

Номер в последовательности

Номер подтверждения

Смещение данных

Резерв

Биты управления

Окно

Контрольная сумма

Указатель срочности

Опции

Выравнивание

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

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

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

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

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

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

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

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

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

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

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

FIN(Nomoredatafromsender) – отправитель больше не будет передавать данные

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

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

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

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

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

Каждый раз при установлении соединения модуль TCPсоздает структуру данных – Блок управления передачей (TransmissionControlBlock,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(Закрыто) – соединение закрыто