Трехэтапное установление связи

Соединение станет активным только после того, как отправитель и получатель обменяются несколькими управляющими пакетами для установки соединения. Данный процесс известен как трехэтапное установление связи (three-way handshake). Его цель – синхронизировать порядковые номера и номера подтверждений для каждой конечной точки в момент установки соединения ТСР.

Рассмотрим этот процесс. Станция А пошлет ТСР активный вызов open для запроса установки соединения с приложением удаленной сетевой станции. Станция А построит заголовок ТСР с установленным битом SYN (бит синхронизации), затем определит начальное порядковое значение (оно не всегда равно 0 и может быть любым; здесь выбрано 100) и разместит его в поле порядкового номера. После заполнения в заголовке ТСР других полей пакет будет отправлен протоколу IP для передачи станции В.

Станция В получит пакет и определит, что это – попытка соединения. Если станция В может принять новое соединение, она пошлет подтверждение станции А, сформировав новый пакет. Станция В установит в заголовке ТСР биты SYN и ACK, показанные на рисунке, поместит свое собственное начальное порядковое значение (200) в поле порядкового значения пакета, а в поле подтверждения будет указано значение 101 (порядковый номер станции А плюс 1, что задает следующий ожидаемый порядковый номер).

Станция А получит ответный пакет и определит, что это подтверждение запроса соединения. Станция построит новый пакет, установив бит АСК, назначит порядковый номер равным 101, укажет номер подтверждения 200 + 1 и отошлет пакет станции В. Как только это произойдет, соединение станет активным, и данные и команды приложения начнут передаваться по нему. Пока по соединению проходят данные и команды, каждая сторона соединения поддерживает свою собственную таблицу порядковых номеров для данных, отсылаемых и получаемых по соединению. Номера всегда следуют в восходящем порядке.

Порядковые значения не обязательно должны начинаться с 0. Скорее всего, этого и не будет. Однако весьма важно заметить, что они, в конце концов, достигнут нулевого значения.

Сегмент ТСР

Любые блоки данных, посылаемые IP, называются сегментами. Такой информационный блок может содержать управляющие данные или данные пользователя. Сегменты используются при установлении соединения, при отсылке и получении данных и подтверждений, при отправке сообщений о размере окна и при закрытии соединения. Сегмент ТСР будет включать в себя заголовок ТСР и данные. Данные, переданные ТСР для отправки, называются потоком, точнее – неструктурированным потоком. Поток – это поток байтов данных, а неструктурированный поток – это поток байтов данных неизвестного типа. Это значит, что ТСР не в состоянии размечать данные, чтобы можно было определить конец записи или тип данных в потоке. Получив поток данных от приложения, ТСР разделит данные на сегменты для передачи удаленной сетевой станции. Сегмент может содержать управляющую информацию или данные – это просто неструктурированный поток байтов данных, отсылаемых целевой станции.

В ТСР допускается размер сегмента до 65535 байт (или длиннее - суперграммы в IPv6), но обычно он гораздо меньше. Протокол Ethernet способен работать только с 1500 байт в поле данных пакета Ethernet (Ethernet v2.0), 1496 байт – для IEEE 802.3 (при использовании IEEE 802.2). Протокол FDDI может обрабатывать максимум 4472 байта данных в пакете, а размер пакета Token Ring варьируется в зависимости от скорости. Для 4 Мбит/с максимальный размер равен 4472 байта, а для 16 Мбит/с – 17800 байт, но обычно принимается значение 4472 байта. Чтобы согласовать размер сегмента, ТСР указывает в одном из полей опций (MSS), расположенных в заголовке ТСР, максимальный размер сегмента, который он может принять, и посылает этот пакет удаленной станции.

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

Так как соединение между станциями А и В теперь имеется (после его успешного трехэтапного установления), ТСР должен управлять им. Первый из методов управления – порядковые номера.

Порядковые номера и подтверждения

Подтверждения не просто задают датаграмму или сегмент ТСР. Задача ТСР – восстановить информацию, переданную отправителем. Следовательно, подтверждение на самом деле определяет позицию в потоке передаваемых данных, так как IP не ориентирован на соединение, и не исключено, что при повторных передачах размер окна окажется отличным от первоначального. Получатель собирает информацию и восстанавливает точную копию передаваемых данных.

Возможно также, что сегменты будут приходить в другой последовательности, и задача ТСР – снова расположить их в порядке отправления. Однако во время этого процесса могут возникать ошибки, и ТСР подтвердит только максимальный правильно принятый непрерывный блок потока.

Снова обратимся к рисунку в разделе «Детали ТСР». ТСР вычисляет порядковый номер каждого байта данных, рассматривая их как единое целое. Для любого следующего байта данных, который необходимо передать, порядковый номер увеличивается на 1. Допустим, между станциями А и В установлено соединение (см. рисунок). Станция А посылает сегмент с порядковым значением 40 станции В. Она знает, что сегмент содержит 4 байта, и поэтому увеличивает свой порядковый номер до 44.

После получения от станции В подтверждения (содержащего номер 44) станция А отправляет станции В второй сегмент, в который входит 7 байт. Порядковый номер станции А увеличивается до 51, и станция А ждет подтверждения от станции В. Стоит заметить, что станция А не обязана ждать этого подтверждения.

В каждом окне передачи будет столько байтов, сколько указано целевым узлом. Порядковый номер устанавливается номером первого байта посылаемой датаграммы – последний полученный в подтверждении от целевого узла номер. Сегмент ТСР (данные) затем передается IP для доставки по сети.

Могут быть отосланы несколько датаграмм при одном подтверждении всех полученных полностью верных сегментов. Это называется включающим или кумулятивным подтверждением. ТСР реализует эту операцию на обеих сторонах соединения. В каждой передаваемой датаграмме будет установлен бит подтверждения в заголовке ТСР. А если бит подтверждения установлен, то ТСР прочитает поле подтверждения для определения номера следующего байта сегмента, который ждут на втором конце соединения. Другими словами, значение в поле подтверждения равно порядковому номеру переданного ранее сегмента плюс количество байтов, успешно принятых в этом сегменте, плюс 1. Номер подтверждения встроен в датаграмму, чтобы сделать ТСР более эффективным. Обычно в сети не используются отдельные датаграммы для подтверждений. Все приходящие байты данных, указанные в поле подтверждения, не требуют персонального подтверждения, считаются хорошими и принимаются получателем.

Поскольку ТСР – это байтовый транспортный протокол, порядковая нумерация и подтверждения для каждого байта данных ТСР должны обеспечивать целостность данных и успешную доставку до цели. ТСР высылает подтверждения для байтов данных ТСР, а не для пакетов, датаграмм или сегментов.