Автор работы: Пользователь скрыл имя, 13 Декабря 2009 в 16:25, Не определен
Реферат
Модуль UDP отслеживает появление вновь прибывших датаграмм, сортирует их и распределяет (демультиплексирует) в соответствии с портами назначения. На рис. 5.2 показан поток данных, следующий сквозь сетевой уровень и модуль UDP к прикладным программам.
Что такое транспортный протокол?
Транспортный протокол (Transport Control Protocol, TCP) наряду с протоколом IP — один из наиболее распространенных в Интернет. Так же, как и UDP, TCP служит для передачи данных между сетевым и прикладным уровнями сетевой модели. По сравнению с UDP TCP устроен гораздо сложнее. И это понятно — ведь ему приходится обеспечивать надежную, потоковую, ориентированную на соединение службу доставки данных. Другими словами, TCP сам следит за доставкой данных, а также за правильной последовательностью передаваемых пакетов. В отличие от TCP протокол пользовательских датаграмм (UDP) доставки данных не гарантирует. Не обеспечивает он и правильной последовательности прихода датаграмм.
TCP пытается оптимизировать пропускную способность сети, то есть увеличивает производительность доставки пакетов в Интернет, насколько это вообще возможно. Для этого он динамически управляет потоком данных в соединении. Если буфер приемника данных на принимающем конце переполняется, TCP просит передающую сторону снизить скорость передачи.
Рассмотрим, каким
образом протокол управления транспортировкой
пользуется услугами IP для передачи данных
между двумя компьютерами. Может показаться
странным, что TCP умудряется пользоваться
ненадежным IP и при этом оставаться надежным.
Также может казаться удивительным, что
TCP, пользуясь не ориентированным на соединение
IP, остается ориентированным на соединение.
Наконец, как получается, что TCP доставляет
данные в виде потока байтов, тогда как
IP пересылает датаграммы? Последующие
абзацы ответят на все эти вопросы и устранят
возможные недоразумения. Постигая секреты
TCP, вы должны помнить о том, что его данные
всегда переносит IP. To есть данные TCP всегда
упаковываются в IP-датаграммы.
Обеспечение надежности
Для обеспечения надежной доставки и правильной последовательности данных в потоке TCP пользуется подтверждениями. Как только пункт назначения принимает блок данных, он передает подтверждение о приеме источнику данных. Источнику данных это сообщение говорит: «Все в порядке. Я принял твои данные». Каждый раз при передаче сообщения модуль TCP запускает специальный таймер. По истечении заданного в нем времени и не получении подтверждения TCP повторяет попытку передать свое сообщение. На рис. 5.3 схематично показана работа такой системы.
Рис. 5.3. Передача данных с простым подтверждением о доставке
К несчастью, простое подтверждение о доставке, изображенное на рис. 5.3, работает исключительно неэффективно. Одна из сторон соединения вынуждена все время ждать появления подтверждения о доставке от другой стороны. Вскоре вы узнаете, что на самом деле TCP не использует такую простейшую схему подтверждения, при которой пакеты и подтверждения следуют по очереди друг за другом.
Что такое скользящее окно?
TCP не посылает один пакет, ожидая прихода подтверждения, чтобы послать следующий. Вместо этого он использует принцип «скользящего окна». Этот принцип позволяет послать несколько сообщений и только потом ожидать подтверждения. «Скользящее окно» проиллюстрировано на рис. 5.4.
Рис. 5.4. Скользящее окно TCP
Что такое транспортный протокол?
Выражаясь образно, TCP как бы накладывает окно на поток данных, ожидающих передачи, и передает все данные, попавшие в окно. Приняв подтверждение о доставке всех данных, TCP перемещает окно дальше по потоку и передает следующие попавшие в него сообщения. Работая сразу с несколькими сообщениями, TCP может одновременно «выставить» их на сетевой канал и только потом ожидать прихода подтверждения. Метод скользящего окна значительно увеличивает производительность соединения, а также эффективность циклов обмена сообщениями и подтверждениями об их доставке. Рис. 5.5 иллюстрирует цикл обмена сообщение-подтверждение TCP.
Рис. 5.5. Передача сообщений и подтверждений о доставке по схеме скользящего окна
Передатчик и приемник на рис. 5.5 используют скользящее окно шириной в три пакета. То есть передатчик сначала высылает три пакета и только после ждет прихода подтверждения. Приняв подтверждение о доставке третьего последнего пакета, передатчик может посылать следующие три.
TCP регулирует полосу пропускания сети, договариваясь с другой стороной о некоторых параметрах потока данных. Причем процесс регулировки происходит на протяжении всего соединения TCP. В частности, регулировка заключается в изменении размеров скользящего окна. Если сеть загружена не сильно и вероятность столкновения данных минимальна, TCP может увеличить размер скользящего окна. При этом скорость выдачи данных на канал увеличивается и соединение становится более эффективным, поскольку через сеть проходит больше данных за одно и то же время.
Если, наоборот, вероятность столкновения данных велика, TCP уменьшает размер скользящего окна. Если размер скользящего окна, изображенного на рис. 5.4, принять равным восьми пакетам при обычном сетевом трафике, то в худших условиях, когда Интернет сильно загружен, его размер может уменьшиться до пяти. Наоборот, когда данных в сети немного, размер окна может увеличиться, например, до 10—20 пакетов.
Имейте в виду, что представленная на рис. 5.4 и описанная в предыдущих абзацах схема несколько упрощена. На самом деле TCP задает размер окна в байтах. То есть размер окна по умолчанию может равняться нескольким тысячам байтов, а не восьми, десяти и двенадцати байтам, как в предыдущем примере. Как правило, модуль TCP передает несколько сегментов, прежде чем скользящее окно заполнится целиком. Большинство систем в Интернет устанавливают окно равным по умолчанию 4096 байтам. Иногда размер окна равен 8192 или 16384 байтам.
Сообщение TCP
Блок данных TCP принято называть сообщением или сегментом. Оба эти термина вполне корректны и широко употребляются в литературе, посвященной Интернет. Мы, однако, по причинам, которые обсудим ниже, на протяжении всей книги будем употреблять термин «сегмента. TCP рассматривает свои данные в качестве однородного, неделимого потока. Тем не менее для доставки данных он вынужден использовать IP-датаграммы. Прикладной программе, однако, совершенно не обязательно знать, что ее поток данных переносят датаграммы. TCP делает этот процесс прозрачным для всех приложений, работающих через него.
Где бы вы не встретили термин «сообщением, относящийся к TCP, можете смело подставлять туда термин «сегмента. Почему? Потому, что каждое сообщение TCP, доставленное датаграммой протокола Интернет, является на самом деле ТСР-сегментом. Сегмент TCP состоит из TCP-заголовка, TCP-опций и данных, переносимых сегментом. На рис. 5.6 изображена структура сегмента TCP. Несмотря на то, что заголовок показан состоящим как бы из нескольких уровней, на самом деле он является последовательным потоком данных, длиной как минимум в 20 байтов. В табл. 5.2 кратко описано назначение каждого поля заголовка TCP. Способы применения каждого поля будут обсуждены в следующих абзацах.
Таблица 5.2. Назначение полей заголовка TCP
Поле заголовка | Назначение |
Порт-передатчик | Обозначает порт протокола приложения-источника данных. |
Порт-приемник | Обозначает
порт протокола приложения- |
Номер последовательности | Определяет первый байт данных в области данных сегмента TCP. |
Номер подтверждения | Определяет следующий байт данных, который приемник рассчитывает получить из входного потока. |
Длина заголовка | Длина TCP-заголовка, измеренная в 32-разрядных словах. |
Флаг URG | Если установлен, извещает принимающий модуль TCP о том, что в сегменте находятся данные для неотложной обработки. |
Флаг АСК | Указание принимающему модулю TCP на то, что поле номер подтверждения содержит соответствующие данные. |
Флаг PSH | Требование принимающему модулю TCP передать данные приложению-получателю немедленно. |
Флаг RST | Запрос принимающему модулю TCP сбросить соединение. |
Флаг SYN | Запрос принимающему модулю TCP синхронизировать номера последовательности. |
Флаг FIN | Сообщение принимающему модулю TCP об окончании передачи. |
Размер окна | Сообщение принимающему модулю TCP о количестве байтов, которое способен принять модуль-передатчик. |
Контрольная сумма TCP | Служит для обнаружения поврежденных при передаче данных. |
Указатель на неотложные данные | Указывает на последний байт данных, требующих неотложной обработки, находящихся в области данных сегмента TCP. |
Опции | Обычно используются совместно с опцией максимальная длина сегмента (MSS). |
Установление 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 клиента получает начальное сообщение-ответ от сервера, он должен посылать «подтверждение подтверждения». (На самом деле клиент подтверждает запрос сервера на синхронизацию обмена.)