110
промежутке времени, в течение которого TCP-пакет может находиться в сети (по сути, это время жизни IP-сегмента). Партнеры обмениваются этими начальными номерами и подтверждают их получение. Во время отправления TCP-пакетов с данными поле «номер в последовательности» содержит сумму начального номера и количества байт ранее переданных данных.
Номер подтверждения (acknowledgement number) — 32-
битовое поле, содержимое которого определяет (косвенно) количество принятых данных из входящего потока к TCP-модулю, формирующему TCP-пакет.
Смещение данных — четырехбитовое поле, содержащее длину заголовка TCP-пакета в 32-битовых словах и используемое для определения начала расположения данных в TCP-пакете.
Флаг URG — бит, установленное в 1 значение которого означает, что TCP-пакет содержит важные (urgent) данные.
Флаг ACK — бит, установленное в 1 значение которого означает, что TCP-пакет содержит в поле «номер подтверждения» верные данные.
Флаг PSH — бит, установленное в 1 значение которого означает, что данные содержащиеся в TCP-пакете должны быть немедленно переданы прикладной программе, для которой они адресованы. Подтверждение для TCP-пакета, содержащего единичное значение во флаге PSH, означает, что и все предыдущие TCPпакеты достигли адресата.
Флаг RST — бит, установливаемый в 1 в TCP-пакете, отправляемом в ответ на получение неверного TCP-пакета. Также может означать запрос на переустановление логического соединения.
Флаг SYN — бит, установленное в 1 значение которого означает, что TCP-пакет представляет собой запрос на установление логического соединения. Получение пакета с установленым флагом SYN должно быть подтверждено принимающей стороной.
Флаг FIN — бит, установленное в 1 значение которого означает, что TCP-пакет представляет собой запрос на закрытие логического соединения и является признаком конца потока данных, передаваемых в этом направлении. Получение пакета с ус-
111
тановленым флагом FIN должно быть подтверждено принимающей стороной.
Размер окна — 16-битовое поле, содержащее количество байт информации, которое может принять в свои внутренние буфера TCP-модуль, отправляющий партнеру данный TCP-пакет. Данное поле используется принимающим поток данных TCPмодулем для управления интенсивностью этого потока: так, установив значение поля в 0, можно полностью остановить передачу данных, которая будет возобновлена только, когда размер окна примет достаточно большое значение. Максимальный размер окна зависит от реализации, в некоторых реализациях максимальный размер может устанавливаться системным администратором (типичное значение максимального размера окна — 4096 байт).
Контрольная сумма — 16-битовое поле, содержащее Internet-контрольную сумму, подсчитанную для TCP-заголовка, данных пакета и псевдозаголовка.
Указатель — 16-битовое поле, содержащее указатель (в виде смещения) на первый байт в теле TCP-пакета, начинающий последовательность важных (urgent) данных.
Дополнительные данные заголовка — последовательность полей произвольной длины, описывающих необязательные данные заголовка. Протокол TCP определяет только три типа дополнительных данных заголовка:
конец списка полей дополнительных данных;
пусто (No Operation);
максимальный размер пакета.
Дополнительные данные последнего типа посылаются в TCP-заголовке в момент установления логического соединения для выражения готовности TCP-модулем принимать пакеты длиннее 536 байтов. В UNIX-реализациях длина пакета обычно определяется максимальной длиной IP-сегмента для сети.
Номер порта
Номера портов играют роль адресов транспортного уровня, идентифицируя на конкретных узлах сети, по сути дела, потребителей транспортных услуг, предоставляемых как протоколом TCP, так и протоколом UDP. При этом протоколы TCP и UDP
112
имеют свои собственные адресные пространства: например, порт номер 513 для TCP не идентичен порту номер 513 для UDP.
Своя собственная адресация на транспортном уровне стека протоколов сетевого взаимодействия необходима для обеспечения возможности функционирования на узле сети одновременно многих сетевых приложений. Наличие в TCP-заголовке номера порта позволяет TCP-модулю, получающему последовательности TCP-пакетов, формировать раздельные потоки данных к прикладным программам.
Взаимодействие прикладных программ, использующих транспортные услуги протокола TCP (или UDP), строится согласно модели клиент-сервер, которая подразумевает, что одна программа (сервер) всегда пассивно ожидает обращения к ней другой программы (клиента). Связь программы-клиента и сервера идентифицируется пятеркой объектов:
используемый транспортный протокол (TCP или UDP);
IP-адрес сервера;
номер порта сервера;
IP-адрес клиента;
номер порта клиента.
Для того, чтобы клиент мог обращаться к необходимому ему серверу, он должен знать номер порта, по которому сервер ожидает обращения к нему (слушает сеть). Для прикладных программ, получивших наибольшее распространение в сетях на основе TCP/IP, номера портов фиксированы и носят название хо-
рошо известных номеров портов (well-known port numbers).
Ниже приводятся примеры хорошо известных номеров портов для некоторых серверов (служб).
Служба Номер порта Протокол
---------------------------------
ftp-data |
20 |
TCP |
ftp |
21 |
TCP |
telnet |
23 |
TCP |
smtp |
25 |
TCP |
time |
37 |
TCP |
time |
37 |
UDP |
finger |
79 |
TCP |
portmap |
111 |
TCP |
|
|
113 |
portmap |
111 |
UDP |
exec |
512 |
TCP |
login |
513 |
TCP |
shell |
514 |
TCP |
who |
513 |
UDP |
talk |
517 |
UDP |
route |
520 |
UDP |
Xserver |
6000 |
TCP |
Программы-клиенты, являющиеся активной стороной во взаимодействии клиент-сервер, могут использовать произвольные номера портов, назначаемые динамически непосредственно перед обращением к серверу (как любые свободные на данном узле).
Любая прикладная программа (будь то клиент или сервер) может открывать для взаимодействия любое количество портов для использования любых транспортных протоколов.
Принцип «скользящего окна»
Протоколы транспортного уровня, обеспечивающие надежную передачу данных, предполагают обязательное подтверждение принимающей стороной правильности полученных данных.
Впростых протоколах сторона, отправляющая данные, отсылает пакет с данными принимающей стороне и переходит в состояние ожидания подтверждения получения правильных данных. Только после приема подтверждения становится возможной следующая посылка. Очевидно, что такой подход использует пропускную способность сети неэффективно.
Впротоколе TCP используется более совершенный принцип скользящего окна (sliding window), который заключается в том, что каждая сторона может отправлять партнеру максимум столько байт, сколько партнер указал в поле «размер окна» заголовка TCP-пакета, подтверждающего получение предыдущих данных.
Принцип скользящего окна обеспечивает опережающую посылку данных с отложенным их подтверждением. Следует отметить недостаток этого механизма: если в течение некоторого времени не будет получено отсроченное подтверждение ранее отправленного пакета, то отправляющий TCP-модуль будет вынужден повторить посылку всех TCP-пакетов, начиная с неподтвер-
114
жденного. Размер окна, как правило, определяется объемом свободного места в буферах принимающего TCP-модуля.
Важные данные
Протокол TCP предусматривает возможность информирования принимающей стороны взаимодействия отправляющей стороной о наличии в TCP-пакете важных данных (urgent data), требующих особого внимания согласно логике прикладной задачи. Отличие важных данных от данных основного потока заключается в том, что принимающая сторона должна, как правило, обработать их прежде ранее полученных, но еще не обработанных данных потока.
Для индикации наличия в TCP-пакете важных данных используется флаг URG TCP-заголовка, местоположение важных данных в теле TCP-пакета определяется полем Указатель TCPзаголовка — оно задает смещение (в стиле языка программирования C) первого байта важных данных в теле TCP-пакета. Ниже на рисунке иллюстрируется расположение важных данных в теле TCP-пакета.
URG=1 указатель |
данные потока важные (urgent) потока |
заголовок TCP пакета |
тело TCP пакета |
Рис. 6.8 — Поле указатель содержит адрес (смещение) важных данных
Протокол TCP предусматривает передачу важных (urgent) данных в рамках общего потока данных (in-band). Существуют протоколы (например, ISO), поддерживающие режим передачи важных (expedited) данных вне общего потока данных (out-band), что в общем случае быстрее.
Этапы TCP-взаимодействия
Взаимодействие партнеров с использованием протокола TCP строится в три этапа:
установление логического соединения;
обмен данными;
закрытие соединения.