Сетевая служба с поддержкой соединения включает три фазы:
• Создание соединения — во время фазы создания соединения определяется единственный маршрут между исходной и целевой системами. Сетевые ресурсы в это время обычно резервируются, чтобы гарантировать согласованный уровень службы (например, гарантированную пропускную способность).
• Пересылка данных — во время фазы пересылки данные последовательно передаются по определенному на предыдущем этапе маршруту. Данные всегда приходят в целевую систему в том порядке, в котором были посланы.
• Прекращение соединения — во время фазы прекращения соединения созданное соединение, которое больше не требуется, прерывается. Дальнейшая коммуникация между исходной и целевой системами требует создания нового соединения.
Служба с поддержкой соединения имеет два существенных недостатка по сравнению с сетевыми службами без поддержки соединения:
• Статический выбор маршрута — так как весь трафик должен перемещаться по одному и тому же статическому маршруту, отказ в какой-либо точке этого маршрута вызывает отказ соединения.
• Статическое резервирование сетевых ресурсов — гарантированный уровень пропускной способности требует привлечения ресурсов, не предназначенных для других пользователей сети. Если для коммуникации требуется полная непрерываемая пропускная способность, то полоса пропускания используется неэффективно.
Службы с поддержкой соединения используются для передачи данных приложений, которые нетерпимы к задержкам и переупорядочиванию пакетов. Приложения для голоса и видео обычно используют службы с поддержкой соединения.
Сетевая служба без поддержки соединения
Сетевая служба без поддержки соединения не определяет заранее маршрут от источника к системе назначения, упорядочивание пакетов, пропускную способность канала данных и другие гарантированные сетевые ресурсы. Каждый пакет должен быть снабжен полным адресом, так как для различных пакетов на основе множества факторов могут выбираться различные пути доступа через сеть. Каждый пакет передается исходной системой независимо и независимо обрабатывается промежуточными сетевыми устройствами. Служба без поддержки соединения предлагает два важных преимущества относительно службы с поддержкой соединения:
• Динамический выбор маршрута — так как маршруты выбираются для каждого пакета отдельно, трафик можно направить в обход сбойного участка сети.
• Динамическое выделение полосы пропускания — полоса пропускания используется более эффективно, поскольку сетевым ресурсам не выделяют полосу пропускания, которую они не собираются использовать.
Службы без поддержки соединения используются для передачи данных приложений, которые могут выдержать некоторую задержку и переупорядочивание. Приложения, передающие данные, обычно используют службу без поддержки соединения.
Поля источника и места назначения Рассмотрим структуру заголовка TCP. Для этого обратимся к рис. и разберем сегмент TCP, перехваченный сетевым монитором. Первое поле, которое встречается в заголовке TCP,— это порт источника, 16-разрядное поле, используемое для идентификации процесса на исходном компьютере, посылающем сегмент TCP целевому компьютеру. На рис. это 0x04-05 (десятичное 1029). Следующее поле (очевидно) является портом места назначения. Как и порт источника, это также 16-разрядное поле, которое используется для идентификации процесса на принимающей машине. На рисунке это порт telnet 0x17 (23).
Поле порядкового номера Теперь мы переходим к порядковому номеру. 32-разрядное поле используется для идентификации порядкового номера, который соответствует первому байту в этом сегменте. Упорядочивание TCP использует смещение байта в потоке данных для указания, где в потоке находятся данные. Когда флаг SYN (синхронизации) задается во время установления соединения, номер последовательности становится начальным порядковым номером (ISN). Когда данные посылаются, ISN увеличивается на 1. Это сообщает посылающей и принимающей машинам, где в потоке данных они работают.
Поле подтверждения Следующие 32 бита являются полем подтверждения, которое указывает посылающей машине, что предыдущий сегмент был получен без изменений. Это поле имеет значение, только если задан флаг АСК (подтверждение). Это поле очень важно для установленного соединения.
Это четырехразрядное поле используется для указания, где начинается полезная нагрузка TCP. Оно называется также полем длины заголовка, так как после вычисления, где начинаются данные TCP, мы знаем длину заголовка. Длина заголовка TCP (включая параметры) всегда кратна 32 битам и не превосходит 60 байтов. Шесть битов, следующих за полем сдвига данных, зарезервированы и должны быть заданы как 0.
Шесть флагов TCP В заголовке TCP можно установить шесть флагов (см. ниже). Они устанавливаются с помощью одноразрядного поля для каждого из доступных флагов. Поэтому поле флагов занимает в заголовке всего шесть битов. Если флаг не установлен (т.е. сброшен), то в соответствующем поле стоит значение 0.
1. Поле срочности (URG) существенно. При заданном флаге в поле указателя срочности содержатся важные данные. Срочные данные не являются частью обычного потока данных и будут обрабатываться до любых других данных. Срочные данные могут использоваться для прерывания программ и уведомления приложения о событиях десин-хронизации. Они используются также для передачи по сети приложению сообщения, которое не является частью текущего потока данных (данные вне полосы).
2. Поле подтверждения (АСК) существенно, когда задан этот флаг. Когда создано нормальное соединение, флаг АСК будет постоянно в работе.
3. Флаг выталкивания (PSH) указывает, что данные в сегменте и другие полученные данные, которые находятся в буфере получения, немедленно должны быть переданы в приложение. TCP часто будет держать входящие данные в буфере получения, когда буфер заполняется, он передает данные приложению. Это может вызывать проблемы в некоторых приложениях, таких как Telnet, которому необходимо иметь возможность передать клавишный ввод на другую машину. Выталкиваемые данные не должны подтверждаться немедленно, это может произойти при следующей нормальной передаче данных.
4. Флаг сброса (RST) используется для прекращения соединения. Когда на активном соединении получен флаг сброса, это означает, что произошла ошибка, и соединение должно быть принудительно закрыто. Получение сброса при попытке установления соединения означает отказ.
5. Флаг синхронизированного порядкового номера (SYN) используется в начале настройки соединения для создания порядковых номеров и подтверждения. До создания соединения ни одна из машин не знает о порядковых номерах другой машины. В начале общения используется трехходовое квитирование для передачи информации о порядковых номерах. Флаг SYN используется для согласования порядковых номеров.
6. Флаг завершения отправки данных (FIN) "культурно" завершает соединение TCP. Когда одна машина хочет прекратить соединение, она посылает сегмент с установленным флагом FIN. Если обе машины послали сегменты с установленным FIN и подтвердили флаг, соединение завершается.
Поле окна Поле окна содержит 16 битов и используется для указания числа байтов, которое готов принять отправитель сегмента TCP. Эти данные должны начинаться с октета, указанного в поле подтверждения, иначе они будут отвергнуты. Это окно является явным указанием размера буфера TCP на посылающем хосте. Оно также используется для определения максимального порядкового номера, который может быть подтвержден из этого сегмента добавлением номера текущего подтверждения к номеру поля окна.
Контрольная сумма Контрольная сумма является 16-битным числом, представляющим собой двоичное дополнение суммы дополнений до единицы всех 16-битных слов в заголовке TCP и тексте. Если сегмент имеет нечетное число октетов текста и заголовка, то последний октет дополняется справа нулями, пока не будет сформировано 16-битное слово для использования при вычислении контрольной суммы. Важно отметить, что дополнение нулями не передается. Пока контрольная сумма вычисляется, поле контрольной суммы заполняется нулями.
Указатель срочности Поле указателя срочности является 16-битным полем, которое задается равным порядковому номеру последнего октета срочных данных. Оно используется, только когда передаются сегменты с битом URG (срочный). Иначе это поле задается равным нулю (0x0).
Заполнение кадра и параметры Поле параметров является набором из 32 битов, которые используются для хранения параметров TCP. Если параметры не используют все 32-битное поле, оно заполняется нулями.
Процедура создания соединений использует флаг управления синхронизацией (SYN) и включает обмен тремя сообщениями. Этот обмен был назван трехходовым квитированием. Соединение инициируется при встрече прибывающего сегмента, содержащего SYN, и ожидающего входа TCN, которые создаются командой пользователя OPEN. Соответствие локального и внешнего сокетов определяет, когда соединение было инициировано. Соединение становится "установленным", когда номера последовательности синхронизированы в обоих направлениях. Очистка соединения также включает обмен сегментами, несущими в этом случае управляющий флаг FIN.
Протокол не делает никаких ограничений на повторное использование определенного соединения. Соединение определяется парой сокетов. Новые экземпляры соединения будут называться инкарнациями соединения. При этом возникает проблема: "Как TCP идентифицирует сегменты дубликаты из предыдущих инкарнаций соединения?" Эта проблема становится очевидной, если соединение открывается и закрывается в быстрой последовательности или прерывается в связи с нехваткой памяти, а затем восстанавл ивается.
Чтобы избежать путаницы, необходимо воспрепятствовать использованию сегментов из одной инкарнации соединения, в то время как те же самые номера последовательности от предыдущей инкарнации могут по-прежнему присутствовать в сети. Мы хотим гарантировать это, даже если TCP прерывает работу и теряет всю информацию о номерах последовательности, которые он использует. Когда создается новое соединение, используется генератор начального порядкового номера (ISN), который выбирает новый 32- разрядный ISN. Генератор связан с 32-битными часами (возможно, фиктивными), младший бит которых увеличивается каждые четыре миллисекунды. Таким образом, ISN циклически повторяется примерно каждые 4,55 часов. Так как мы предполагаем, что сегменты будут оставаться в сети не дольше, чем максимальное время жизни сегмента (MSL), и что MSL меньше 4,55 часов, то можно считать, что ISN будет уникальным.
Для каждого соединения существует номер посылаемой последовательности и номер получаемой последовательности. Начальный номер посылаемой последовательности (ISS) выбирается посылающим данные TCP, а начальный номер принимаемой последовательности (1RS) узнается во время процедуры создания соединения. Чтобы соединение было установлено или инициализировано, два TCP должны синхронизировать друг с другом начальные номера последовательностей. Это делается при обмене устанавливающими соединение сегментами, несущими управляющий бит, называемый "SYN" (от слова синхронизация), и начальные номера последовательностей. В качестве сокращения сегменты, переносящие бит SYN, также называются "SYN". Следовательно, решение требует подходящего механизма для выбора начального номера последовательности и небольшого привлечения квитирования для обмена ISN.
Синхронизация требует, чтобы каждая сторона посылала свой собственный начальный номер последовательности и получала подтверждение от другой стороны. Каждая сторона должна также получить начальный номер последовательности другой стороны и послать об этом подтверждение.
1. А —> В SYN мой номер последовательности X
2. А <—- В АСК ваш номер последовательности X
3. А <-- В SYN мой номер последовательности Y
4. А —> В АСК ваш номер последовательности Y
Так как шаги 2 и 3 обычно объединяются в одном сообщении, то последовательность называется трехходовым квитированием. На рис. 2.3 показано, как это выглядит в реальной жизни.
Трехходовое квитирование необходимо в связи с тем, что номера последовательности не связаны с глобальными часами сети, и TCP может иметь другие механизмы для выбора ISN. Получатель первого SYN не может узнать, является ли сегмент задержавшимся старым или нет, если он не помнит последний номер последовательности, использованный соединением (что не всегда возможно). Поэтому он должен запросить отправителя проверить, что TCP не создал сегмент, несущий номер последовательности, который может дублироваться старым сегментом, остающимся в сети. TCP должен оставаться спокойным в течение максимального периода жизни (MSL), прежде чем присваивать какие-либо номера последовательности при запуске или восстановлении после ошибки, при которой память используемых номеров последовательности была стерта. Для этой спецификации MSL задается равным двум минутам. Это инженерный выбор, который может быть изменен, если опыт покажет такую необходимость. Отметим, что если TCP повторно инициализирован, но сохранил в памяти номера последовательности, ему вообще не нужно ждать, он должен лишь использовать номера последовательности, превышающие использованные ранее.
Если при аварийном прекращении работы хост не сохраняет никакой информации о последних номерах последовательности, переданных во время активного (т.е. не закрытого) соединения, при отправке любых сегментов TCP будет происходить задержка на период не менее согласованного времени MSL внутренней системы, частью которой является хост. Реализаторы TCP могут нарушать ограничение "времени молчания", но они рискуют тем, что некоторые получатели в Интернете старые данные будут принимать как новые, или отвергать новые данные как старые дубликаты.
TCP использует пространство номеров последовательности всякий раз, когда сегмент формируется и вводится в очередь сетевого вывода на хосте источника. Обнаружение дубликатов и алгоритм упорядочивания в протоколе TCP опирается на уникальное связывание данных сегмента с пространством последовательности, при условии, что номера последовательности не переберут все 2*а значения, прежде чем данные сегмента, связанные с этими номерами последовательности, будут доставлены и подтверждены получателем, и все двойные копии сегментов "исчезнут" из Интернета. Без такого предположения двум различным сегментам TCP могли бы быть присвоены одинаковые или перекрывающиеся номера последовательности, вызывая путаницу у получателя в определении, какие данные являются новыми, а какие старыми. Помните, что каждый сегмент связан с числом порядковых номеров последовательности, равным числу октетов данных в сегменте.
При обычных условиях TCP отслеживает следующий номер последовательности для отправки и самый старый, ожидающий подтверждения, чтобы избежать ошибочного использования номера последовательности, прежде чем первое использование было подтверждено. Однако это не гарантирует, что старые дублирующие данные удаляются из сети. Поэтому пространство последовательности сделано достаточно большим, чтобы сократить вероятность возникновения проблем из-за блуждающего дубликата. При двух Мбит/сек потребуется 4,5 часа для использования 23'' октетов пространства последовательности. Так как максимальное время жизни сегмента в сети, скорее всего, не превышает нескольких десятков секунд, это считается достаточной защитой для будущих сетей, даже если скорости передачи данных вырастут до десятков Мбит/сек. При 100 Мбит/сек время цикла равно 5,4 мин, что, возможно, коротковато, но все еще в пределах разумного.
Однако базовый механизм обнаружения дубликатов и алгоритм упорядочивания в TCP может не сработать, если TCP источника не сохраняет номера последовательности, которые он использовал в последнее время на данном соединении. Например, если бы TCP должен был запускать все соединения с порядкового номера 0, то после аварийного завершения и перезапуска TCP мог бы переформатировать предыдущее соединение (возможно, после разрешения полуоткрытого соединения) и послать пакеты с номерами последовательности, идентичными или перекрывающимися пакетами, все еще находящимися в сети, которые были посланы предыдущей инкарнацией того же соединения. При отсутствии информации о номерах последовательности, использованных определенным соединением, спецификация TCP рекомендует, чтобы источник делал задержку на MSL секунд, прежде чем посылать в соединение сегменты, чтобы дать время сегментам, остающимся в сети от предыдущей инкарнации соединения, исчезнуть из системы. Даже те хосты, которые могут запоминать время дня и использовать его для выбора значений начального номера последовательности, не защищены от этой проблемы (т.е. даже если учитывается время дня для выбора начального номера последовательности в каждой новой инкарнации соединения).
