Рефераты. Протоколы транспортного уровня

Установление TCP-соединения

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

Определенная система обмена сообщениями-подтверждениями соединения TCP является частью более общего процесса синхронизации обмена данными. Не будет системы — соединение может не состояться. В следующих абзацах описываются поля TCP-заголовка, служащие для обмена подтверждениями. Для установления и прекращения соединения, а также для отправки и получения подтверждений TCP заголовок имеет поля «номер последовательности», «номер подтверждения» и поля флагов. Каждый раз, желая что-нибудь передать по протоколу TCP, программа-приложение запрашивает модуль TCP установить соединение. Модуль TCP в свою очередь шлет сообщение TCP с установленным флагом SYN (синхронизации) удаленному порту, с которым программа-клиент хочет установить соединение.

Флаг синхронизации указывает принимающей стороне (серверу, например), что программа-клиент желает установить соединение. Вместе с флагом SYN, сооб­щение TCP несет в себе 32-битный номер последовательности, размещенный модулем TCP в поле «номер последовательности». TCP-модуль сервера отвечает сегментом TCP с установленными флагом подтверждения (АСК) и номером подтверждения. Для того чтобы разобраться в процедуре установления соеди­нения TCP, необходимо понимать смысл номеров последовательности и подтвер­ждения. В следующем разделе процедура установления соединения и смысл соответствующих номеров изучаются более подробно.

Что такое начальный номер последовательности?

Мы уже отмечали выше, что обе стороны соединения TCP должны идентифи­цировать информацию в потоке данных для того, чтобы корректно слать и принимать подтверждения о доставке. Номер последовательности — это то, как TCP обозначает данные. Сетевые компьютеры пользуются разнообразными методами для выбора начального номера последовательности (для наших целей, однако, эти методы несущественны). Вы можете рассматривать начальный номер последовательности как случайное число. Значение начального номера последо­вательности не играет никакой роли.

Начальный номер последовательности представляет собой число, пересылаемое модулем-передатчиком TCP модулю-приемнику TCP. Передавая начальный номер, TCP-модуль как бы сообщает корреспонденту: «Эй, я хочу установить с тобой соединение. Нумерация данных в потоке от меня начинается с этого числа».

Сервер-приемник сообщения, получив запрос на установление соединения, тоже не сидит сложа руки. Он посылает обратно сообщение, содержащее его собст­венный начальный номер. Модуль TCP генерирует какое-либо число, совершен­но не зависящее от числа, посланного TCP-клиентом. Другими словами, сервер как бы сообщает: «Привет! Я получил твой запрос на TCP-соединение и высы­лаю номер, с которого начнется нумерация моих собственных данных».

Все TCP соединения являются дуплексными. Данные следуют в обоих направ­лениях одновременно. Поток данных в одном направлении совершенно не зависит от потока данных в противоположном. В силу дуплексной природы соединения оба модуля TCP должны учитывать и нумеровать данные в каждом направлении по-разному, а значит, обрабатывать два начальных номера после­довательности.

Подтверждение доставки данных

В TCP-заголовке самого первого, начального, сообщения-ответа сервера модуль TCP устанавливает два флага: синхронизации (SYN), чтобы известить модуль TCP клиента о том, что в сообщении содержится начальный номер последова­тельности сервера, и подтверждения (АСК), чтобы заставить клиента изучить содержимое поля «подтверждение».

TCP-модуль сервера использует номер последовательности, принятый от клиен­та, чтобы сконструировать на его основе собственный номер подтверждения. Номер подтверждения всегда указывает на номер сообщения, которое сервер рассчитывает получить следующим. Таким образом, в начальном сообщении-от­вете сервера содержится номер последовательности клиента, увеличенный на единицу.

Предположим, например, что модуль TCP клиента, запрашивающего соедине­ние, шлет номер последовательности, равный 1000. В ответ от сервера он получит начальное сообщение с числом 1001, установленным в поле подтверждения. Для модуля-клиента это выглядит, как будто сервер сказал: «Кстати, следующее сообщение, которое я от тебя ожидаю, должно иметь номер 1001».

Соединение установлено!

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

Сообщение, посланное TCP-модулем клиента, тоже будет содержать установ­ленный флаг «подтверждение». В поле «номер подтверждения» TCP-модуль клиента размещает начальный номер последовательности, принятый от сервера, увеличенный на единицу. (Теперь TCP-модуль клиента не устанавливает флаг синхронизации, так как обе стороны соединения уже синхронизировались, то есть договорились о начальных номерах своих последовательностей.) Другими словами, между TCP-модулями происходит обмен данными, состоящий из трех стадий:

1. TCP-модуль клиента пытается установить TCP-соединение, посылая запрос на синхронизацию, содержащий среди прочего начальный номер последова­тельности.

2. TCP-модуль сервера подтверждает прием запроса на установление соедине­ния и в свою очередь шлет клиенту запрос на синхронизацию с собственным начальным номером последовательности.

3. TCP-модуль клиента подтверждает прием запроса сервера на синхрони­зацию.

Что такое номер последовательности?

Номер последовательности однозначно идентифицирует байт данных в потоке данных TCP. Как следует из названия, номера последовательности последова­тельны, то есть следуют один за другим. Однако номера последовательности разных соединений TCP необязательно начинаются с одного и того же числа. Номер последовательности, устанавливаемый в каждом сегменте TCP, иденти­фицирует первый байт в сообщении. То есть является смещением относительно начала потока данных. Номер последовательности — то же самое, что счетчик переданных байтов. Он как бы говорит: «Первый байт этого пакета — это номер байта (номер последовательности) в потоке данных».

Предположим, что программа-клиент желает передать 2000 байтов данных посредством TCP. Предположим, что произведена синхронизация и следующий номер последовательности будет равен 1251. Предположим так же, что длина данных в сегменте равна 500 байтам. Произойдут следующие события:

1. Модуль TCP клиента передает сегмент TCP, содержащий байты с 1 по 500. Номер последовательности, записанный в поле «номер последовательности» сегмента, равен 1251.

2. Модуль TCP клиента передает сегмент TCP, содержащий байты с 501 по 1000. Номер последовательности равен 1751.

3. Следующий сегмент, посланный модулем TCP клиента, содержит байты с 1001 по 1500 с номером последовательности, равным 2251.

4. Наконец, модуль TCP клиента передает данные с 1501 байта по 2000 и устанавливает номер последовательности равным 2751.


TCP-модуль сервера в нашем примере шлет следующие сообщения:

1. Приняв первый сегмент от клиента, TCP-модуль сервера отвечает пакетом-подтверждением с номером подтверждения 1751. Сервер как бы говорит:

«Эй, я принял твои данные, и следующий сегмент, который я надеюсь получить, должен содержать номер последовательности 1751».

2. Приняв второй сегмент, TCP-модуль сервера шлет номер подтверждения, установленный в 2251.

3. Приняв третий сегмент, TCP-модуль сервера шлет номер подтверждения, равный 2751.

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

Дуплексные сетевые службы

Как уже отмечалось, соединение TCP является дуплексным. Это значит, что данные следуют одновременно в обоих направлениях. Данные, следующие в одном направлении, совершенно не зависят от данных, следующих в противо­положном. Поскольку обмен данными TCP является дуплексным, TCP-модулям необходимо подсчитывать получаемые и передаваемые данные раздельно, и номера последовательности для обоих потоков будут разными.

Если вышесказанное не произвело на вас впечатления, давайте рассмотрим поток данных с точки зрения одной из сторон соединения. Предположим, что мы рассматриваем поток данных со стороны TCP-модуля клиента. С точки зрения TCP-модуля клиента номер последовательности отсчитывает или идентифици­рует данные, посылаемые клиентом в сторону TCP-модуля сервера. Номер подтверждения в сегментах, посланных TCP-модулем клиента, с его точки зрения идентифицирует данные, принятые от TCP-модуля сервера. На рис. 5.7 изображен поток данных и номера последовательности так, как они выглядят со стопоны TCP-модуля клиента.

Рис. 5.7. Идентификация данных и их поток с точки зрения TCP-модуля клиента 137

Окончание соединения TCP

Соединение TCP заканчивается обменом пакетами, состоящего из двух стадий. Каждая из сторон, как сервер, так и клиент, может предложить другой закончить соединение. Для этого сторона-инициатор обмена высылает пакет с установлен­ным флагом «окончание обмена» (FIN). В силу дуплексной природы протокола TCP оба потока данных независимы, и должны быть завершены по отдельности. Если вам приходилось программировать в UNIX, последнее утверждение преды­дущего абзаца может показаться подозрительным. Когда в UNIX закрывается соединение, дальнейший обмен по нему становится невозможен. Соединение TCP работает по-другому. Даже после закрытия соединения (завершения пере­дачи данных) одной из сторон соединения она в состоянии продолжать прием данных от другой стороны соединения.

Мысль принимать данные после закрытия соединения кажется странной на первый взгляд. На самом деле, установленный в пакете флаг FIN является сигналом, означающим, что одна сторона прекратила передачу данных. Приход сообщения-подтверждения от другой стороны означает, что обе стороны догово­рились прекратить обмен данными в одном направлении. Начиная с этого момента одна из сторон соединения будет молчаливо принимать данные, не делая никаких замечаний по их поводу, а другая молчаливо посылать, не ожидая никаких комментариев. Окончание (закрытие) TCP-соединения — двухступен­чатый процесс. Одна сторона выполняет активное закрытие, а другая — пассивное. Закрытие активно, если вызвано по инициативе данной стороны, и, наоборот, пассивно, если вызвано противоположной стороной соединения. Сто­рона, первой высылающая пакет с установленным флагом «окончание соедине­ния», является активной. Как правило, модуль TCP, принявший пакет с установленным флагом «окончание соединения», инициирует пассивное окон­чание соединения. Это просто значит, что пассивная сторона также посылает сообщение с установленным флагом окончания. Другими словами, сторона, принявшая сообщение об окончании первой, отвечает: «Хорошо, если тебе нечего больше послать, то и мне тоже нечего послать тебе». После того как обе стороны выслали друг другу сообщения об окончании и получили подтверждения о доставке этих сообщений, соединение TCP считается действительно закончен­ным (закрытым).

Страницы: 1, 2, 3, 4



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.