Главная | Главная по ССПД |
6.2.Элементы транспортного протокола
6.4. Транспортные протоколы в Internet: TCP и UDP
6.4.1.Сервис TCP
6.4.2.Протокол TCP
6.4.3.Заголовок сегмента в TCP
6.4.4.Управление соединениями в TCP
6.4.5.Стратегия передачи в TCP
6.4.6.Управление заторами в TCP
6.4.7.Управление таймером в TCP
6.4.8.Протокол UDP
Транспортный протокол - это центральный протокол во всей иерархии протоколов. Именно он обеспечивает надежную передачу данных от одного абонента в сети другому. Здесь мы рассмотрим достаточно подробно организацию, сервис, протоколы и производительность.
Здесь мы рассмотрим какие виды сервиса транспортный уровень предоставляет прикладному, как характеризуется качество предоставляемого сервиса, как обеспечивается доступ из прикладного уровня к транспортному, как выглядит интерфейс.
Единственной целью транспортного уровня - обеспечить эффективный, надежный и дешевый сервис для пользователей на прикладном уровне. Для этого он использует сервис, предоставляемый сетевым уровнем. То что выполняет работу транспортного уровня называется транспортным агентом. Транспортный агент может располагаться в ядре операционной системы, в отдельном процессе пользователя, в библиотеке сетевого приложения, на карте сетевого интерфейса. В некоторых случаях оператор сети может предоставлять надежный транспортный сервис, при котором транспортный агент располагается на специальной интерфейсной машине на границе подсети, к которой подключены хосты. На рис. 6-1 показаны взаимно расположения сетевого, транспортного и прикладного уровня.
Подобно тому, как сетевой уровень имеет два вида сервиса: ориентированный на соединения и нет, транспортный так же имеет сервис, ориентированный на соединения и без соединений. Адресация и управление потоком схожи на обоих уровнях.
Тогда возникает вопрос: Если сервис сетевого уровня столь схож с сервисом транспортного, то зачем два разных уровня? Причина этого состоит в том, что сетевой уровень - это часть подсети передачи данных, которой управляет оператор подсети. Что будет если сетевой уровень предоставляет ненадежный сервис, ориентированный на соединения? Предположим, что он часто теряет пакеты? Что делать если маршрутизатор время от времени отказывает?
У пользователя подсетью нет средств для решения проблемы если она возникла. Для того, чтобы ему дать такую возможность надо поверх сетевого пустить еще один уровень, который позволит исправлять качество сетевого уровня. Если транспортному уровню придет сообщение, что соединение на сетевом уровне неожиданно было разорвано, то он может установить новое сетевое соединение с помощью которого выяснить что произошло, какие данные были переданы, а какие нет и т.п.
Существо транспортного уровня в том, чтобы сделать сервис транспортного уровня более надежным, чем сетевого. Другое важное соображение в том, что прикладная программа, опираясь на транспортный сервис, становится независимой от сети и может работать в сети с любым сервисом.
В силу приведенных доводов первые четыре уровня называют поставщиками транспортного сервиса, а все что выше четвертого - пользователями транспортного сервиса.
Мы уже встречались с понятием качества сервиса при рассмотрении сетевого уровня, где рассматривали набор параметров, с помощью которых можно охарактеризовать это понятие. Транспортный уровень позволяет пользователю определить желаемые, допустимые и минимальные значения для различных параметров в момент установки соединения. Далее сам транспортный уровень будет решать сможет ли он с помощью сетевого сервиса удовлетворить запросы пользователя и до какой степени. На рис. 6-2 перечислены основные параметры сервиса. Заметим, что лишь немногие сети поддерживают все эти параметры.
Параметры качества сервиса определяются пользователем в момент установления транспортного соединения. Указывается желаемое и минимальное значение. Если требуемое качество недостижимо, то транспортный уровень сразу сообщает об этом пользователю даже не обращаясь к получателю сообщения. При этом пользователю сообщается что попытка установить соединение прошла неудачно и причины неудачи.
Процедура согласования параметров качества сервиса называется согласованием возможностей.
Примитивы транспортного уровня позволяют пользователя получить доступ к транспортному сервису. Транспортный сервис аналогичен сетевому. Между ними существует одна большая разница - сетевой сервис по природе своей не надежен. Задача транспортного сервиса, как раз, обеспечить надежную доставку сообщений. Два процесса, соединенные между собой ничего не должны знать о том как физически они соединены. Один помещает данные на вход другого, другой получает их. Задача транспортного уровня спрятать от них все детали передачи, исправления ошибок и т.п.
Транспортный сервис может быть как ориентированный на соединения, так и нет. Дейтаграммный транспортный сервис возможен, но это редкость, поэтому мы будем рассматривать транспортный сервис, ориентированный на соединения.
Другое важное отличие между сетевым и транспортным сервисами - кто их использует. Сетевой - использует транспортный, а вот транспортный - использует пользователь, прикладные программы. Поэтому он должен быть ориентирован на пользователя: удобен, прост в использовании.
Общее представление о примитивах транспортного сервиса дает рис. 6-3. Этот пример содержит основные виды примитивов для установления соединения, передачи данных и разрыва соединения, что вполне достаточно для многих приложений.
Использование этих примитивов может быть продемонстрировано следующим образом. Сервер приложения выполняет примитив LISTEN, в результате чего он блокируется до поступления запросов от клиентов. Клиент для установления соединения выполняет примитив CONNECT. Транспортный агент на стороне клиента блокирует клиента и посылает пакет с запросом на установление соединения серверу.
Напомним, что транспортные агенты обмениваются пакетами, которые имеют специальное название - Transport Protocol Data Unit (TPDU). Взаимосвязь между кадрами, пакетами и TPDU показана на рис. 6-4.
По примитиву CONNECT транспортный агент на стороне клиента шлет TPDU CONNECTION REQUEST. Транспортный агент сервера, видя что сервер заблокирован по LISTEN, разблокирует сервер и посылает CONNECTION ACCEPTED TPDU. После этого транспортное соединение считается установленным. После этого наступает обмен данными с помощью примитивов SENT и RECEIVE.
По окончании обмена соединение должно быть разорвано. Есть два варианта разрыва соединения: симметричный и асимметричный. Асимметричные предполагает, что для разрыва соединения одна из сторон посылает DISCONNECT TPDU. Получив этот TPDU, другая сторона считает соединение разорванным.
При симметричном разрыве каждое направление закрывается отдельно. Когда одна сторона посылает DISCONNECT TPDU это значит, что с ее сторона больше данных не будет. На рис. 6-5 показана диаграмма состояний при установлении и разрыве соединения.
На рис. 6-6 показан другой набор примитивов - сокеты Беркли. Здесь два основных отличия от того, что мы только что рассмотрели. Первое - создается точка подключения соединения (SOCET), которой прис. аивается адрес (BIND). Второе - LISTEN не блокирующий примитив. Он создает очередь, если несколько клиентов будут обращаться за соединением в одно и то же время.
Транспортный сервис реализует транспортный протокол, который используют взаимодействующие транспортные агенты. Транспортный протокол в чем-то схож с канальным. Однако между ними много различий:
Транспортный протокол должен решать следующие проблемы:
Проблема адресации состоит в том, как указать с каким удаленным прикладным процессом надо установить соединение? Обычно для этого используется транспортный адрес, по которому прокладной процесс может слушать запросы на соединение. Мы будем использовать термин TSAP - Transport Service Access Point. Аналогичное понятие существует и на сетевом уровне - IP адрес - SAP для сетевого уровня.
На рис. 6-8 показано взаимосвязь ТSAP и NSAP. Он же иллюстрирует сценарий использования ТSAP для установления соединения между двумя удаленными процессами. В этой иллюстрации в целом все правильно. Не ясно лишь как прикладной процесс на хост 1 узнает, что интересующий его сервер подключен к ТSAP 122 на хост 2? Одно из возможных решений - данный сервер всегда подключен к ТSAP 122 и все об этом знают.
Это решение хорошо работает для часто используемого сервиса, но как быть прикладным процессам пользователя? Одно из решение, используемых в Unix, показано на рис. 6-9. Оно называется протоколом установления начального соединения. На каждой машине есть специальный сервер процессов, который как бы представляет все процессы исполняемые на этой машине. Этот сервер слушает несколько ТSAP куда могут поступить запросы на ТСР соединение. Если нет свободного сервера, способного выполнить запрос, то соединение устанавливается с сервером процесса, который переключит соединение на нужный сервер, как только он освободится.
Однако, есть случаи когда этот подход с сервером процессов не работает. Например, файл сервер. Другое решение - сервер имен. Пользователь устанавливает соединение с сервером имен, для которого ТSAP известен, и передает ему имя сервиса. В ответ сервер имен шлет надлежащий ТSAP.
Пусть пользователь узнал ТSAP, но как он узнает на какой машине этот ТSAP расположен, какой сетевой адрес надо использовать? Ответ заключается в структуре ТSAP адреса, где заключается вся необходимая информация.
Проблема установления транспортного соединения сложно потому, что пакеты могут теряться, храниться и дублироваться на сетевом уровне.
Тяжелый пример, установление соединения с банком для перевода денег с одного счета на другой. Пакеты-дубли могут вызвать повторное соединение и вторичный перевод денег. Проблема здесь в задержках и появлении пакетов дубликатов. Как быть?
Одно из возможных решений - временное ТSAP. Когда оно использовано, использованный адрес более не возникает. При этом решении не работает модель с сервером процессов на рис. 6-9.
Другое решение - каждому транспортному соединению сопоставлять уникальный номер. Когда соединение разрывается этот номер заносится в специальный список. К сожалению этот список может расти бесконечно. Кроме этого в случае сбоя машины он может быть потерян и тогда ...
Другой подход - не двигать пианино к себе, а самому подвинуться к нему: ограничить время жизни пакетов. Это можно достичь тремя путями:
Заметим, что последний метод требует синхронизации маршрутизаторов в сети.
На практике нам надо обеспечить, чтобы умерли не только сами пакеты, но и уведомления о них. Это значит, что надо ввести величину Т такую, что по ее истечении в сети не осталось ни самого пакета ни уведомления о нем.
При ограничении времени жизни пакета можно построить безопасный способ установления соединения. Этот метод был предложен Томлинсоном. Его идея состоит в том, что все машины в сети оснащены таймерами. Каждый таймер двоичный счетчик достаточно большой разрядности, равной или превосходящей разрядность последовательных чисел, используемых для нумерации пакетов. Тогда при установлении соединения младшие несколько разрядов берутся в качестве начального номера. Главное чтобы последовательности не приводили к переполнению счетчика и его обнулению. Эти номера можно потом использовать для управления потоком, в протоколе скользящего окна.
Проблема возникает когда машина восстанавливается после сбоя. Транспортный агент не знает в этот момент какое последовательное число использовать. Для того чтобы избежать повторного использования порядкового номера вводится специальная величина по времени, которая образует запрещенную область последовательных номеров(см. рис. 6-10).
Другая нетривиальная проблема - надежное установление соединения: пакеты ведь могут пропадать. Для ее решения Томлинсон предложил процедуру троекратного рукопожатия (рис. 6-11)
Разрыв соединения как уже было сказано может быть асимметричным или симметричным. Асимметричный разрыв может привести к потере данных (см.рис. 6-12). Симметричный разрыв каждая сторона проводит самостоятельно, когда она передала весь имеющийся объем данных. Однако, определить этот факт не всегда просто. Здесь есть одна проблема, которая называется проблемой двух армий (см.рис. 6-13).
Внимательно изучив его мы придем к выводу, что ни одна армия не начнет атаки до тех пор, пока на получит подтверждения на подтверждение и та до бесконечности. На самом деле, можно доказать, что нет протокола, который безопасно разрешает эту ситуацию. На рис. 6-14 показаны четыре сценария разрыва соединения.
В Internet есть два основных транспортных протокола: TCP - ориентированный на соединение и UDP - не ориентированный на соединение.
TCP (Transmission Control Protocol) - специально созданный протокол, чтобы обеспечить надежную передачу точка-точка потока байтов через не надежную сеть. ТСР был сознательно разработан так, чтобы он мог устойчиво и эффективно функционировать в условиях internet, нескольких сетей. На каждой машине, поддерживающей ТСР есть ТСР агент либо в виде части ядра ОС, либо как часть процесса пользователя, который управляет ТСР потоками и доступом к IP.
ТСР получает поток данных от прикладного процесса, дробит их на части не более 64К ( на практике не более 1500) и отправляет их как отдельные IP дейтаграммы.
Поскольку IP уровень не гарантирует доставку каждой дейтаграммы, то в задачу ТСР входит определение потери и повторная передача. Дейтаграммы могут поступать к получателю в неправильном порядке и опять-таки задача ТСР восстановить этот порядок.
Доступ к ТСР сервису происходит через сокет. Сокет состоит из IP адреса хоста и 16 разрядного локального номера на хосте, называемого порт. Порт - это TSAPдля ТСР. Каждое соединение идентифицируется парой сокетов, между которыми оно установлено.
Порты с номерами до 256 зарезервированы для стандартного сервиса. Например, если надо обеспечить FTP передачу файла, то надо соединяться на 21 порт, где находится FTP демон. Для TELNET - 23 порт. Полный список таких портов можно найти в RFC 1700.
Все ТСР соединения - дуплексные, т.е. передача идет независимо в оба направления. Нет ТСР соединений от одного ко многим.
ТСР обеспечивает поток байтов, а не поток сообщений. Напомним, это значит что границы сообщений не поддерживаются автоматически в потоке.
Когда приложение передало данные ТСР, то они могут быть отправлены сразу, а могут быть за буферезованы - это решает ТСР агент. Однако, в ряде случаев надо, чтобы они были отправлены сразу. Для этого в заголовке ТСР пакета есть флаг PUSH. Если он установлен, это говорит о том, что данные должны быть переданы немедленно.
Наконец последняя возможность ТСР сервиса, которую здесь стоит упомянуть - срочные данные. Если для данных установлен флаг URGENT, то все данные после этого по данному соединению передаются сразу и не буферизуются. Когда срочные данные поступаю к получателю приложение прерывается и ему передаются эти данные.
Каждый байт в ТСР соединении имеет 32 разрядный номер. Поэтому даже в сети на 10Мб/сек потребуется не менее часа, чтобы исчерпать все номера. Этиномера используются для всех пакетов на соединении: уведомления, данные, управление окнами.
ТСР агенты обмениваются сегментами данных. Каждый сегмент имеет заголовок от 20 байтов и более ( по выбору) и тело произвольной длины. ТСР агент решает какой длины может быть тело. Два фактора ограничивают длину сегмента. Первый - длина сегмента не должна превышать максимальную длину IP пакета - 65К байт. Второй - каждая сеть имеет максимальную единицу передачи MTU и каждый сегмент должен помещаться в MTU. В противном случае маршрутизаторам придется применять фрагментацию.
Основным протоколом, используемым ТСР агентом является протокол скользящего окна. Это значит, что каждый посланный сегмент должен быть подтвержден. Одновременно с отправление сегмента взводится таймер. Подтверждение придет либо с очередными данными в обратном направлении, если они есть, либо без данных. Подтверждение будет нести порядковый номер очередного ожидаемого сегмента. Если таймер исчерпается прежде чем придет подтверждение, то сегмент посылается повторно.
Несмотря на кажущуюся простоту, ТСР протокол достаточно сложен и должен решать следующие основные проблемы:
Заголовок ТСР сегмента показан на рис. 6-24. Его многочисленные флаги мы будем рассматривать по ходу изложения.
Установление ТСР соединения происходит по протоколу трехкратного рукопожатия. Флаги SYN и ASK в заголовке сегмента используются для обозначения CONNECTION REQUEST и CONNECTION ACCEPED. Флаг RST используется для обозначения REJECT.
На рис. 6-26 показаны ситуации при установлении соединения. Случай b показывает ситуацию, когда два хоста одновременно пытаются установить соединение между двумя одинаковыми сокетами. Посколку каждое соединение идентифицируется парой сокетов, то будет установлено только одно из соединений.
Таймер для последовательных номеров сегментов тактируется с частотой 4 (сек, а максимальное время жизни ракета - 120 сек.
ТСР соединение как уже говорилось дуплексное, т.е. в каждом направлении данные передаются независимо и соединение разрывается независимо. Если в очередном сегменте флаг FIN = 1, то в этом направлении данных больше не будет При получении подтверждения для этого сегмента соединение в этом направлении считается разорванным. В другом направлении передача может продолжаться сколь угодно долго. Если подтверждения на первый FIN нет, то попытки продолжаются до трех раз, после чего соединение считается разорванным.
На рис. 6-27 и 6.28 представлена процедура установления и разрыва соединения в виде диаграммы конечного автомата.
Управление окнами в ТСР не связано прямо с поступлением подтверждений. На рис. 6-29 показан случай взаимодействия для буфера в 4096 байт.
Когда поле WIN=0 отправитель может послать сегмент в двух случаях. Первый - если это URGENT данные. Второй, однобайтовый сегмент, чтобы заставить получателя показать текущее состояние буфера. Это очень важно так, как позволяет обойти тупик.
Заметим, что ТСР не требует сразу передавать сегмент как только данные поступили. Эту свободу ТСР использует чтобы повысить свою производительность. Поэтому, часто при реализации ТСР вводят специальную задержку на посылку подтверждения и состояния окна, чтобы дать отправителю накопить буфер для отправки.
Здесь есть одна неприятность. Если на стороне получателя приложение будет медленно считывать буфер , например, по байтно, отправитель будет вынужден отправлять короткие сегменты и не эффективно расходовать пропускную способность.
Здесь мы рассмотрим как в ТСР предусмотрена работа при перегрузках. Основная идея очень проста - при возникновении перегрузки не посылать новых пакетов. В ТСР это реализуется динамически с помощью механизма окон.
Прежде всего как ТСР обнаруживает перегрузку - рост число time out. Если эта величина превышает некоторый предел, являющийся параметром протокола, то это фиксируется как перегрузка.
На рис. 6-31 дана иллюстрация ситуации когда отправителю не разрешается передавать много данных. Это может быть по двум причинам.
Нехватка буфера на стороне получателя. Перегрузка в сети.
В Internet эти ситуации различаются как объем в сети и объем у получателя. Поэтому каждый отправитель поддерживает два окна - обычное окно отправителя и окно перегрузки. Каждое показывает количество байтов, которое отправитель может послать. Фактически отправляемое количество - минимум из двух величин.
Сначала окно перегрузки полагают равным одному максимальному сегменту. Если сегмент успешно (без time out) был предан, то окно перегрузки увеличивается в двое. Это увеличение будет происходить до тех пор пока, либо не наступит time out и произойдет возврат к предыдущему значению, либо не будет достигнут размер окна отправителя.
Этот алгоритм называемый slow start- медленный старт реализован с модификацией, показанной на рис. 6-32.
Здесь основная проблема как удачно выбрать величину time out. Идея используемого алгоритма - вводится специальная переменная RTT, значение которой постоянно модифицируется, чтобы получить оптимальное значение time out. Если при очередной передаче подтверждение поступило прежде, чем наступил time out значение этой переменной немного уменьшают, если больше - увеличивают. Были проведены специальные тщательные исследования того как это надо делать.
Internet поддерживает также транспортный протокол без соединений - UDP (User Data Protocol). Этот протокол инкапсулирует сегменты в виде дейтаграмм и шлет их через сеть. Структура UDP сегмента показана на рис. 6-34.
6.1.3.Примитивы транспортного уровня
6.2.Элементы транспортного протокола
6.2.1. Адресация
6.2.2.Установление соединения
6.2.3.Разрыв соединения
6.4. Транспортные протоколы в Internet: TCP и UDP
6.4.1.Модель сервиса TCP
6.4.2.Протокол TCP
6.4.3.Заголовок сегмента в TCP
6.4.4.Управление соединениями в TCP
6.4.5.Стратегия передачи в TCP
6.4.6.Управление заторами в TCP
6.4.7.Управление таймером в TCP
6.4.8.Протокол UDP
Главная | Главная по ССПД |