Открытие и закрытие ТСР-соединения

Флаги SYN, ACK, FIN и RST в TCP-заголовке используются при открытии и закрытии ТСР-соединения. Пакеты с этими флагами отправляются в ответ на системные вызовы, которые открывают или закрывают соответствующий сокет. Когда приложение А создает сокет, операционная система координирует установку ТСР-соедипения с приложением В на удаленной машине. Установка ТСР-соедипе- пия состоит в трехэтапном обмене с квитированием (handshake), как показано на рис. 5.5.

Рис. 5.5. Временная диаграмма ТСР-соедииспия

1.       SYN от А к В. А инициирует соединение, отправляя пакет с установленным битом SYN. SYN-иакет содержит начальный порядковый номер для потока в 32-битпом поле порядкового номера. Таким образом, SYN-пакет синхронизирует порядковый помер. SYN-пакет сам по себе является частью потока и имеет первый порядковый номер. Предположим, что SYN-пакет имеет порядковый помер, равный 4500. После этого первый пакет данных от А должен иметь порядковый помер 4501, что идентифицирует нервый байт данных.

2.       SYN-ACK от В к А. После передачи SYN-пакета А ожидает ответа от удаленного хоста. Предположим, что приложение В ожидает запрос на установку ТСР-соединения на определенном порту. Прибытие SYN-пакета от А обусловливает создание сокета и передачу подтверждающего пакета от В к А. В посылает пакет А, в котором установлены флаги SYN и ACK. Флаг SYN инициирует соединение в обратном направлении (от В к А), а флаг ACK подтверждает получение SYN-пакета от А. Номер подтверждения в ТСР-заголов- ке устанавливается равным значению, на единицу большему, чем начальный порядковый помер в SYN-пакете от А. Как и SYN-пакет от А, пакет SYN-ACK содержит начальный порядковый номер. Этот порядковый помер отмечает начало потока байтов, передающихся от В к А, и не имеет отношения к начальному порядковому номеру для трафика от А к В.

3.       ACK от А к В. После поступления накета SYN-ACK установление соединения от А к В завершается, и операционная система информирует приложение А, что соединение было установлено. С этого момепта приложение А может начать запись и чтепие из сокета. Однако в данный момент приложение В не зпаег, получило ли приложение А пакет SYN-ACK. Третья часть в трехэтапном взаимодействии состоит в отправке пакета ACK от А к В для подтверждения создания соединения от В к А. АСК-пакет от А имеет помер подтверждения на единицу больший, чем начальный порядковый иомер в пакете SYN-ACK от В. После получения этого накета приложение В может передавать данные через сокет приложению А.

Операционная система выбирает различные начальные порядковые номера для ТСР-соедииепий. Посмотрим, что произойдет, если каждое ТСР-соединение ис- нользуег в качестве начального порядкового номера 0. Предположим, что по ТСР-соединепию между А и В по сети передается ожидающий обработки накет, что сопровождается большой задержкой времеии. В конце копцов, пакет будет повторно передан и доставлен получателю. Предположим также, что А и В закрывают ТСР-соединеиие, как только передача данных заканчивается. После этого А и В могут установить иовое TCP-соединение с теми же номерами портов, что и для старого соединения. Допустим, что после установления нового соединения повторный пакет, принадлежащий старому соединению, достигает, наконец, места назначения. В этой ситуации получатель может ошибочпо ассоциировать старый пакет с новым соединением и доставить данные приложению. Если иовое соединение имеет другой начальный порядковый номер, то получатель сможет распознать, что задержанный пакет не принадлежит этому упорядоченному потоку байтов.

ТСР-соединение может быть завершено на любой стороне. Приложение инициирует закрытие TCP-соединения путем закрытия соответствующего сокета. Завершение соединения Обычно осуществляется путем четырехэтапного обмена. Если приложение В закрывает сокет первым, как показано на рис. 5.5, эти четыре этана заключаются в следующем:

1.       FIN от В к А. Приложение В закрывает сокет, что приводит к передаче пакета с установленным флагом FIN. С этого момента В не передает каких-либо новых данных. Тем не менее, В ответственно за гарантированную, упорядоченную доставку предыдущих данных, отправленных приложению А. Так что операционная система, под управлением которой выполняется приложение В, продолжает повторную передачу утерянных пакетов иогока. Кроме того, В может продолжать получать и подтверждать получение пакетов от А. Подобно пакету SYN, иакет FIN от В занимает один помер в пространстве порядковых номеров.

2.       ACK от А к В. После получения этого пакета А передает пакет ACK с номером подтверждения, который на единицу больше, чем порядковый помер в пакете FIN от В. Выделение порядкового иомера флагу FIN позволяет А подтвердить получение флага, даже если пакет FIN не содержит каких-либо данных.

3.       FIN от А к В. После того, как приложение А прочитает все байты из сокета, следующая операция чтения покажет, что был достигнут копец данных. В этот момент приложение А будет знать, что В не предполагает передавать каких-либо дополнительных данных. Раз так, приложение А закрывает свой сокет, что приводит к передаче пакета FIN приложению В.

4.       ACK от В к А. После получения пакета FIN В передает пакет ACK для подтверждения закрытия соединения от А к В. После получения пакета ACK А становится известно, что В получило пакет FIN. С этого момента соединение закрыто. Передача каких-либо новых данных между А и В потребует открытия нового ТСР-соедииения.

Следует отметить, что возможна ситуация, когда оба приложения инициируют закрытие соединения одновременно. В этом случае приложения будут отправлять свои FIN-пакеты параллельно. Для полного закрытия соединения оба этих FIN-na- кета должны быть подтверждены.

Четырехэтапный обмен пакетами FIN и ACK является обычным способом закрытия ТСР-соединеиия. Однако TCP-заголовок также содержит флаг RST для сброса соединения в особых ситуациях. Предположим, хост получает пакет данных TCP для соединения, которое не существует, т.е. IP-адреса и номера портов в заголовках IP и TCP не соответствуют какому-либо активному сокету этого хоста. В этом случае хост отвечает пакетом RST. Рассмотрим другую ситуацию. Допустим, что приложение посылает пакет SYN на определенный порт другого хоста. Если ни одно из приложений хоста-получателя не ожидает запросов на этом порту, то хост также отвечает пакетом RST. В качестве примера предположим, что на компьютере www.foo.com отсутствует Web-сервер. Если пет программы, нрослушивающей запросы на порту 80, то хост отправит RST-пакег отправителю, который пытается открыть TCP-соединение. Операдиониая система на отправляющей машине должна уведомить приложепие, что попытка создать сокет была неудачной.

Источник: Web-протоколы. Теория и практика. — M.: ЗАО «Издательство БИНОМ», 2002 г. – 592 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100