Протокол управления передачей (TCP — Transmission Control Protocol) приблизительно соответствует транспортному уровню модели OSI, но содержит и некоторые функции сеансового уровня. С его помощью реализуется организация сеанса связи между двумя пользователями в сети. Кроме того, в его функции включается исправление ошибок и, что очень важно, преобразование информации к виду дейтаграмм, передача дейтаграмм и отслеживание их прохождения по сети. TCP служит также для организации повторной передачи потерянных дейтаграмм и обеспечения их надежности. Наконец, в компьютере-адресате TCP извлекает сообщение из дейтаграммы и направляет его прикладной программе-адресату. Протокол TCP, как и протокол дейтаграммы пользователя UDP, считаются протоколами поставщика услуг, причем TCP является протоколом, ориентированным на соединение, в то время как UDP - не ориентированный на соединение протокол.

Оба они опираются на услуги протокола IP, но могут транспортироваться через сетевые уровни Х.25, ISDN или Frame Relay.

Рассматриваемые в параграфе 10.7 прикладные протоколы FTP, TELNET, NNTP и др. помещают данные в протокольные блоки данных PDL, уже упоминавшиеся в этом и в первом томах. В зависимости от контекста, на разных уровнях для этих PDL используются различные термины. Иногда блок данных PDL, передаваемый от транспортного уровня TCP к сетевому уровню IP, называется «сегментом». Термин «дейтаграмма» используется применительно к PDU, передаваемым из сетевого уровня IP в Ethernet. В протоколах, не ориентированных на соединение, например, в UDP, дейтаграммы зачастую называются «блоками данных», передаваемыми из IP на уровень звена данных. Если блок данных прошел через разные уровни и передается на физический уровень, он считается «кадром». Если блок данных прошел через сеть, он называется «пакетом». Эти термины и определения следует рассматривать не как охватывающий все и вся стандарт, а как попытку согласования различных терминологий, а более откровенно - как расплату за ранее принятое автором опрометчивое решение собрать в одной монографии разнообразные телекоммуникационные протоколы, терминология для каждого из которых имеет свою исторически обусловленную специфику.

Функционально, впрочем, все выглядит весьма просто. Для создания дейтаграммы протокол TCP добавляет к поступающим от прикладного уровня данным заголовок, содержащий управляющую информацию. Протокол IP добавляет к дейтаграмме свой заголовок, содержащий дополнительные инструкции. Локальная сеть вводит в дейтаграмму свою управляющую информацию в виде еще одного заголовка. Таким образом, дейтаграмма включает в себя три отдельных заголовка, каждый из которых содержит управляющую информацию различного назначения: Ethernet-заголовок, IP-заголовок и TCP-заголовок. Структура TCP-заголовка изображена на рис. 10.2.

Поля порта источника (source port) и порта назначения (destination port) содержат номера портов взаимодействующих программ. Это связано с тем, что адресация на уровне протокола TCP предназначена, скорее, для передачи дейтаграмм между логическими объектами внутри компьютера, чем для фактического соединения пользователя с сетью. Более того, и рассматриваемый в следующем параграфе адрес IP тоже не является физическим адресом, а характеризует соединение с сетью и идентифицирует пользователя. Поэтому номера портов назначения и источника представляют собой числа длиной 16 битов, идентифицирующие приложения, которые используют услуги TCP (например, FTP, TELNET, протоколы электронной почты SMTP, POP3 и т.п.). Номера порта от 0 до 255 определены заранее и не могут задаваться операторами, а номера после 255 могут произвольно определяться для каждой конкретной сети. Примеры фиксированных номеров портов, определяемые протоколом TCP: данные FTP - 20; управление FTP - 21; TELNET - 23; протокол SMTP - 25; сервер имен главного компьютера - 42; сервер имен домена - 53; почтовый протокол РОР2 - 109.

Порядковый номер блока данных (sequence number) длиной 32 бита используется для проверки того, что все блоки данных получены. Если принятый порядковый номер не соответствует очередности и срабатывает таймер TCP, все неподтвержденные блоки данных должны быть переданы повторно. Следует отметить, что предусматривается только положительное подтверждение, а отрицательных подтверждений не существует. Номер подтверждения (acknowledgement number) следует за порядковым номером и идентифицирует следующий ожидаемый порядковый номер.

Поле смещения данных (4 бита) определяет, где начинаются данные заголовка TCP, т.е. сколько 32-битовых слов находится в заголовке, предшествующем полю данных пользователя.

Несколько однобитовых полей, следующих за полем смещения данных, используются для обработки блока данных TCP. Бит срочности URG обозначает, что указатель срочности сообщения содержит значащую информацию. Указатель срочности представляет собой поле 16 битов, идентифицирующее смещение в поле данных пользователя, которое содержит срочные данные. Бит подтверждения АСК указывает на присутствие подтверждения в поле номера подтверждения и уведомляет приемное устройство о том, что этот номер подтверждает ранее полученные последовательности. Бит внеочередной обработки PSH аналогичен биту срочности. Он уведомляет принимающий главный компьютер о том, что полученный блок данных должен обрабатываться немедленно. Бит восстановления RST вызывает восстановление сеанса. Обычно это означает, что все очереди, связанные с сеансом, отключаются и все присоединенные счетчики и таймеры устанавливаются в нуль. Бит синхронизации SYN используется, когда устанавливается логическое соединение, и указывает на то, что порядковые номера должны быть синхронизированы. Бит завершения FIN указывает на то, что данных для посылки больше нет и сеанс должен быть закрыт Затем сеанс должен быть завершен, а ресурсы освобождены для другого сеанса.

Поле окна (16 битов) используется в течение установления сеанса. Стороны должны согласовывать, какое число блоков данных может быть послано до подтверждения. Это число называется размером окна и определяется размером очереди и объемом обработки данных, уже полученных от других сеансов. Размер окна не может быть изменен после того, как сеанс установлен

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

Поле опций может содержать самую разную информацию, например, максимальный размер ТСР-дейтаграммы. В конце заголовок дополняется нулями до размера, кратного 32-битовому слову.

В заключение данного параграфа предлагается тезисное описание некоторых процедур протокола TCP.

Соединение устанавливается с помощью команды OPEN с аргументами в виде IP-адреса и номера порта удаленного процесса. Команда OPEN используется в обоих случаях: когда процесс намерен передавать информацию и когда он ожидает поступления информации. Процедура установления соединения использует специальный флаг синхронизации SYN и состоит из трех тактов квитирующих сообщений, позволяющих синхронизировать потоки данных Завершение соединения осуществляется обменом пакетами, содержащими команду FIN.

Для проверки того, что все данные, переданные на уровень TCP, отправлены, существует функция «проталкивания пакета» - PUSH-функция. Назначение этой функции и PUSH-флага состоит только в «проталкивании» данных к пользователю, минуя механизм кэширования и не производя никаких дополнительных группировок или других действий над данными.

Механизм присвоения порядкового номера каждому передаваемому пакету данных и проверки подтверждения доставки аналогичен уже рассмотренным ранее в этой книге подобным механизмам. Этот механизм позволяет протоколу TCP работать с поврежденными, потерянными, дублированными или поступившими с изменением порядка следования пакетами.