В этом разделе рассмотрим, каким образом устанавливается и разрушается соединение TCP. Это необходимо сделать по двум причинам. Во-первых, функция установления соединения является одной из важнейших особенностей, отличающих протоколы транспортного уровня TCP и UDP. Во-вторых, процесс установления соединения, особенно в беспроводных сетях [Kouch03], может вносить существенные задержки в процесс гарантированной доставки данных между двумя хостами, что, в свою очередь, снижает качество обслуживания.
Далее предположим, что некоторое приложение, функционирующее в рамках хоста (далее будем его назвать клиентом), для гарантированной передачи данных желает установить соединение TCP с другим процессом, функционирующим и рамках другого хоста (далее его будем называть сервером). Приложение клиента сначала должно сообщить протоколу TCP своего транспортного уровня (далее - клиент TCP) о том, что оно желает установить соединение с некоторым процессом сервера. После этого клиент TCP приступает к процедуре установления соединения с протоколом TCP сервера (далее - сервер TCP) в следующем порядке: Шаг 1: клиент TCP посылает серверу TCP служебный сегмент, не содержащий данных прикладного уровня. В заголовке этого сегмента значение бита SYN устанавливается в 1, далее такой сегмент будем называть SYN-сегментом. Кроме того, в этом сегменте клиент TCP также должен определить начальный номер последовательности для нумерации последующих сегментов
(принципы нумерации сегментов обсуждены ниже) client_isn
и поместить его в поле заголовка «номер сегмента в последовательности». Далее SYN-сегмент передается на сетевой уровень и отправляется серверу TCP.
Шаг 2: предположим, что SYN-сегмент был безошибочно доставлен серверу TCP и распакован. Пусть сервер TCP готов поддержать соединение, для этого он должен определить параметры и ресурсы для устанавливаемого соединения и послать соответствующий сегмент клиенту TCP. Этот сегмент, также как SYN-сегмент, не должен содержать данных прикладного уровня, но необходимо, чтобы в нем содержались следующие данные: бит SYN, установленный в 1, поле «номер следующего запрашиваемого сегмента» со значением, установленным в client_isn + 1, а также информация о собственном начальном номере server isn в поле «номер сегмента в последовательности». Далее такой сегмент будем называть SYNACK-сегмент.
Шаг 3: после получения клиентом TCP сегмента SYNACK, клиент должен определить параметры и ресурсы для устанавливаемого соединения. После этого клиент TCP посылает серверу TCP еше один сегмент, таким образом подтверждая, что соединение установлено, в котором поле «номер следующего запрашиваемого сегмента» принимает значение server_isn + 1, а бит SYN устанавливается в 0.
После завершения этих трех шагов клиент и сервер могут обмениваться данными с гарантированной их доставкой через протокол TCP. Бит SYN каждого сегмента данных должен иметь значение 0.
На рис. 1.3 представлена описанная последовательность прохождения сообщений между клиентом и сервером. Англоязычный термин, определяющий установление соединения TCP, переводится как «тройное рукопожатие» (three way handshake).
Рис. 1.3. Установление соединения TCP
После того как клиент и сервер установили соединение, осуществляется обмен данными прикладного уровня, по окончании которого соединение TCP должно быть разрушено. Либо клиент, либо сервер должен инициировать этот процесс - предположим, что в рассматриваемом случае это делает клиент (см. рис. 1.4). Клиент должен послать сообщение (служебный сегмент), информирующее сервер об инициализации разрушения соединения: в этом сегменте значение бита FIN должно быть установлено в 1. Приняв этот сегмент, сервер посылает сегмент подтверждения безошибочной доставки служебного сегмента сервера. Затем клиент посылает собственный служебный сегмент разрушения соединения с битом FIN, установленным в 1. Клиент подтверждает получение служебного сегмента разрушения соединения от сервера. После прохождения подобной последовательности сообщений клиент ТСР и сервер ТСР уничтожают данные, связанные с разрушенным соединением (параметры, переменные и т.п.).
Рис. 1.4. Разрушение соединения TCP
За время существования соединения TCP, протокол TCP и на стороне клиента, и на стороне сервера переходит из одного состояния в другое. На рис. 1.5.о и 1.5.б представлены диаграммы переходов состояний для обычной реализации протокла TCP на стороне клиента и сервера, соответственно. Проанализируем их.
Первым сотоянием клиента TCP является состояние CLOSED. Приложение инициирует новое соединение TCP, в результате чего посылается SYN-сегмент, после чего клиент TCP переходит в состояние SYN SENT. Пребывая в этом состоянии, клиент TCP ожидает поступления сегмента SYNACK от сервера TCP, подтверждающего установление нового соединения. Получив этот сегмент, клиент TCP, завершая стадию установления соединения «тройное рукопожатие», отсылает сегмент, подтверждающий прием сегмента SYNACK и переходит в состояние ESTABLISHED (соединение установлено). Находясь в этом состоянии, клиент имеет возможность посылать и принимать сегменты данных к/от сервера TCP.
При разрушении соединения, пусть в нашем случае оно было инициировано клиентом TCP, как было показано выше, клиент посылает служебный сегмент с установленным битом FIN в 1 и переходит в состояние ожидания сегмента подтверждения разрушения соединения от сервера TCP FIN WAIT1. После получения ожидаемого сегмента подтверждения клиент переходит в состояние ожидания служебного сегмента разрушения соединения с установленным битом FIN в 1 от сервера TCP FIN_WAIT_2.
После получения ожидаемого сегмента клиент TCP переходит в состояние TIME WAIT. Состояние TIME_WAIT позволяет осуществить повторную передачу подтверждения сегмента разрушения соединения, пришедшего от сервера TCP, если предыдущий сегмент подтверждения был потерян. Время, которое проводит клиент TCP в состоянии TIME_WAIT, зависит от реализации, но обычно оно сотавляет 30 секунд, 1 минуту или 2 минуты. По истечении заданного промежутка времени соединение считается закрытым (разрушенным).
Поняв диаграмму переходов состояний протокола TCP на стороне клиента, достаточно легко понять и сторону сервера. Автор предполагает, что читатель сможет справиться с этой задачей сам.
Представленные диаграммы переходов состояний предполагают стандартный обмен сообщениями между клиентом и сервером. Зачастую на практике можно столкнуться с достаточно сложными алгоритмами поведения как клиента, так и сервера, например, попытка осуществления разрушения соединения одновременно клиентом и сервером. В ^еуепБОЗ] заинтересованный читатель найдет достаточное количество интересных примеров и дополнительной информации о протоколе ТСР.
⇐Структура сегмента tcp | Управление трафиком и качество обслужевания в сети | Обеспечение гарантированной доставки данных⇒