Рассмотрим структуру сегмента данных TCP, представленную на рис. 1.2. Здесь и далее под «сегментом TCP» (segment TCP) будем понимать любые данные транспортного уровня, принадлежащие протоколу TCP. Сегмент TCP состоит из заголовка и поля данных. Поле данных содержит информацию прикладного уровня. Размеры сегментов на передающей и принимающей стороне определяются следующими параметрами:

• максимальный размер сегмента передатчика (Sender Maximum Segment size, далее - SMSS): значение максимального размера сегмента, который может быть послан передатчиком без осуще ствления фрагментации на канальном уровне. Значение SMSS зависит от «максимальной длины передаваемого сегмента» (Maximum Transmission Unit, далее - MTU), алгоритма определения маршрута с максимальным значением MTU [Mogul90], «максимального размера сегмента приемника» (Receiver Maximum Segment Size, далее - RMSS), и других факторов. Значение размера не включает в себя размер заголовков TCP/IP и поля «опции» (options), т.е., определяется размер поля данных;

• RMSS: значение максимального размера сегмента, который может быть принят приемником. Это значение определяется в поле «опции» заголовка TCP [RFC793] и задается приемником во время установления соединения. Если значение не определено, то по умолчанию размер RMSS равен 536 байт [RFC 1122]. Значение размера не включает в себя размер заголовков TCP/IP и поля «опции», т.е., определяется размер поля данных;

• максимальный размер сегмента (Maximum Segment Size, далее - MSS): значение максимального размера сегмента, который может быть послан. Значение вычисляется при установлении соединения, как минимальное из SMSS и RKSS. Значение размера не включает в себя размер заголовков TCP/IP и поля «опции», т.е., фактически, определяется размер поля данных. Например, для локальных сетей Ethernet значение MSS устанавливается равным 1460 октет;

• полноразмерный сегмент (Full-sized segment): сегмент данных максимально разрешенного размера.

Заметим, что интерактивные приложения зачастую передают сегменты меньшей длины, чем MSS. Например, приложение удаленного доступа Telnet обычно использует сегменты с длиной ноля данных, равной одному байту. Таким образом, учитывая, что размер заголовка сегмента TCP равен 20 байтам (на 12 байтов больше чем заголовок протокола UDP), для Telnet полный размер сегмента TCP не превышает 21 байта.

Заголовок сегмента TCP содержит следующие поля:

• номера портов источника и приемника (source and destination port numbers), кроме адресации используемые в том числе и для мультиплексирования и демультиплексирования от/к прикладному уровню;

• поле «контрольной суммы длины сегмента» (checksum), позволяющее определять наличие ошибок в сегменте, как в поле данных, так и в заголовке;

• поле «помер сегмента в последовательности» (sequence number) и поле «помер следующего запрашиваемого сегмента» (acknowledgement number), оба длиной по 32 бита, используемые для обеспечения гарантированной доставки данных через ненадежный канал - реализация подробно обсуждается в этой главе ниже;

• поле «размер окна приема» (receive window size) длиной 16 бит, используемое для управления потоком сегментов TCP;

• поле «длина заголовка» (length), длиной 4 бита, определяет длину заголовка сегмента TCP, измеряемую в 32-х битовых словах. Длина заголовка сегмента TCP может варьироваться из-за наличия в нем необязательного поля «опции». В большинстве случаев на практике поле «опции» в заголовке отсутствует и его длина равна 20 байтам;

• поле «опции» (options) является необязательным и может быть использовано либо источником и приемником для определения значения MSS (наиболее частый случай), либо для получения информации о параметрах функционирования сети (timestamping), либо для дополнительных возможностей по управлению соединениями. Для получения дополнительной информации автор рекомендует обратиться к источнику [RFC 1323];

• поле «флаги» (flags), длиной 6 бит, содержит шесть флагов, используемых в служебных целях, соответственно, каждый флаг задается одним битом и является бинарным (т.е. принимает значения 0 или 1):

♦ бит АСК используется для определения того, что данный сегмент является сегментом подтверждения;

♦ биты RST, SYN и FIN используются при установлении и разрушении TCP-соединения - подробно будут рассмотрены ниже;

♦ бит PSH, когда установлен в 1, определяет, что данные, содержащиеся в поле данных сегмента, должны быть переданы на прикладной уровень как можно быстрее;

♦ бит URG, когда установлен в 1, используется стороной передающей этот сегмент для определения высокой важности данных, содержащихся в поле данных этого сегмента. Начало блока важных данных определяется первым битом поля данных этого сегмента, конец определяется 16-битным полем «указатель адреса конца важных данных» (pointer to urgent data). При получении сегмента с установленным битом URG протокол TCP должен известить приложение-приемник о поступлении важной информации и также передать этому приложению значение «указатель адреса конца важных данных».

Отметим, что на практике в реальных сетях флаги РБН и 1ЛЮ, а также поле «указатель адреса конца важных данных» практически не используются. Однако, автор считает необходимым представить информацию о них, чтобы читатель имел представление о тех функциях, которые могут быть реализованы при помощи стандартного протокола ТС Р.

Структура сегмента TCP

Рис. 1.2. Структура сегмента TCP

Протокол tcp | Управление трафиком и качество обслужевания в сети | Управление соединением tcp