tanenbaum_seti_all.pages (525408), страница 164
Текст из файла (страница 164)
Еще одна возможность, предложенная в ЕРС 1106 и широко применяемая сейчас, состоит в использовании протокола выборочного повтора вместо возврата на и. Если адресат получает один плохой сегмент и следом за ним большое количество хороших, у нормального ТСР-протокола в конце концов истечет время ожидания и он передаст повторно все неподтвержденные сегменты, включая те, что были получены правильно. В документе ВЕС 1106 было предложено использовать отрицательные подтверждения (МАК), позволяющие получателю запрашивать отдельный сегмент или несколько сегментов.
Получив его, принимающая сторона может подтвердить все хранящиеся в буфере данные, уменьшая таким образом количество повторно передаваемых данных. Установка ТСР-соединения В протоколе ТСР-соединения устанавливаются с помощью «тройного рукопожатия», описанного в разделе «Установка соединения». Чтобы установить соедине- Транспортные протоколы Интернета: ТСР 616 ние, одна сторона (например, сервер) пассивно ожидает входящего соединения, выполняя примитивы Е(5ТЕ(( и ЯССЕРТ, либо указывая конкретный источник, либо не указывая его.
Другая сторона (например, клиент) выполняет примитив СО((МЕСТ, указывая ТР- адрес и порт, с которым он хочет установить соединение, максимальный размер ТСР-сегмента и, по желанию, некоторые данные пользователя (например, пароль). Примитив СОя)(ЕСТ посылает ТСР-сегмент с установленным битом эгХ и сброшенным битом АСК и ждет ответа. Когда этот сегмент прибывает в пункт назначения, ТСР-сущность проверяет, выполнил ли какой-нибудь процесс примитив С(5ТЕл, указав в качестве параметра тот же порт, который содержится в поле Порт получателя. Если такого процесса нет, она отвечает отправкой сегмента с установленным битом йодля отказа от соединения.
Хост 2 Хост Хост 2 в б Рис. 6.26. установка ТОР-соединения в нормальном случае (в); столкновение вызовов (б) Если какой-либо процесс прослушивает какой-либо порт, та входящий ТСР- сегмент передается этому процессу. Последний может принять соединение или отказаться от него. Если процесс принимает соединение, он отсылает в ответ полтверждение.
Последовательность ТСР-сегментов, посылаемых в нормальном случае, показана на рис. 6.25, а. Обратите внимание на то, что сегмент с установленным битом 5УЖ занимает 1 байт пространства порядковых номеров, что позволяет избежать неоднозначности в их подтверждениях. Если два хоста одновременно попытаются установить соединение друг с другом, то последовательность происходящих при этом событий будет соответствовать рис. 6.25, 6. В результате будет установлено только одно соединение, а не два, так как пара конечных точек однозначно определяет соединение. То есть если оба соединения пытаются идентифицировать себя с помощью пары (х, у), делается всего одна табличная запись для (х, у).
616 Глава 6. Транспортный уровень Начальное значение порядкового номера соединения не равно нулю по обсуждавшимся выше причинам, Используется схема, основанная на таймере, изменяющем свое состояние каждые 4 мкс. Для большей належности хосту после сбоя запрещается перезагружаться ранее чем по прошествии максимального времени жизни пакета. Это позволяет гарантировать, что ни один пакет от прежних соединений не бродит где-нибудь в Интернете. Разрыв соединения ТСР Хотя ТСР-соединения являются полнодуплексными, чтобы понять, как происходит их разъединение, лучше считать их парами симплексных соединений. Каждое симплексное соединение разрывается независимо от своего напарника.
Чтобы разорвать соединение, любая из сторон может послать ТСР-сегмент с установленным в единицу битом гПч', что означает, что у него больше нет данных для передачи, Когда этот ТСР-сегмент получает подтверждение, это направление передачи закрывается. Тем не менее, данные могут продолжать передаваться неопределенно долго в противоположном направлении, Соединение разрывается, когда оба направления закрываются. Обычно для разрыва соединения требуются четыре ТСР-сегмента: по одному с битом гПч' н по одному с битом АСК в каждом направлении. Первый бит АСК и второй бит Р7э(могут также содержаться в одном ТСР- сегменте, что уменьшит количество сегментов до трех. Как при телефонном разговоре, когда оба участника могут одновременно попрощаться и повесить трубки, оба конца ТСР-соединения могут послать ЯМ-сегменты в одно и то же время.
Они оба получают обычные подтверждения, и соединение закрывается. По сути, между одновременным и последовательным разъединениями нет никакой разницы. Чтобы избежать проблемы двух армий, используются таймеры. Если ответ на посланный ЛЛЬсегмент нс приходит в течение двух максимальных интервалов времени жизни пакета, отправитель Гйч'-сегмента разрывает соеднненис. Другая сторона в конце концов заметит, что сй никто не отвечает, и также разорвет соединение. Хотя такое решение и нс идеально, по, учитывая недостижимость идеала, приходится пользоваться тем, что есть.
На практике проблемы возникают довольно редко. Модель управления ТСР-соединением Этапы, необходимые для установки и разрыва соединения, могут быть представлены в виде модели конечного автомата, 11 состояний которого перечислены в табл. 6.6. В каждом из этих состояний могут происходить разрешенные и запрещенные события. В ответ на какое-либо разрешенное событие может осуществляться определенное действие. При возникновении запрещенных событий сообщается об ошибке.
Каждое соединение начинается в состоянии СьОБЕВ (закрытое). Оно может выйти из этого состояния, предпринимая либо активную (СОяя5СТ), либо пассивную (с15ТЕН) попытку открыть соединение. Если противоположная сторона осущест- Транспортные протоколы Интернета: ТСР 61'7 вляет противоположные действия, соединение устанавливается и переходит в со- стояние Е5ТАВИ5НЕТ). Инициатором разрыва соединения может выступить лю- бая сторона. По завершении процесса разьелинения соединение возвращается в состояние СЕ 05Ехх.
Таблица 6.6. Состояния конечного автомата, управляющего ТОР-соединением Состояние ССОЗЕО Описание Закрыто. Соединение не является активным и не находится в процессе установки Ожидание. Сервер ожидает входящего запроса Прибыл запрос соединения. Ожидание подтверждения Запрос соединения послан. Приложение начало открывать соединение Установлено. Нормальное состояние передачи данных Приложение сообщило, что вму больше нечего передавать Другая сторона согласна разорвать соединение Ожидание, пока в сети не исчезнут все пакеты Обе стороны попытались одновременно закрыть соединение Другая сторона инициировала разъединение Ожидание, пока в сети не исчезнут все пакеты ВЗТЕИ ЗУИ ЙСУО ЗУИ ЗЕИТ ЕЗТАВС1ЗНЕО е1и ууд1т т ВИ УУА1Т г Т1МЕО УУА1Т ССОЗ1ИО ССОЗЕ УУА1Т ЫЗТ АСК Конечный автомат показан на рис.
6.26. Типичный случай клиента, активно соединяющегося с пассивным сервером, показан жирными линиями — сплошными для клиента и пунктирными для сервера. Тонкие линии обозначают необычные последовательности событий, Каждая линия на рис. 6,26 маркирована парой событие/действие. Событие может представлять собой либо обращение пользователя к системной процедуре (СОййЕСТ, С!5ТЕй, 5ЕМО или СС05Е), либо прибытие сегмента (ЯМ ЕЕМ, АСК или К5Т), либо, в одном случае, окончание периода ожидании, равного двойному времени жизни пакетов.
Действие может состоять в отправке управляющего сегмента (5УМ, ЕТХ или Я5Т). Впрочем, может не предприниматься никакого действия, что обозначается прочерком. В скобках приводятся комментарии. Диаграмму легче всего понять, если сначала проследовать по пути клиента (сплошная жирная линия), а затем — по пути сервера (жирный пунктир).
Когда приложение на машине клиента вызывает примитив С01т1тЕСТ, локальная ТСР- сущность создаст запись соединения, помечает его состояние как 5УХ 5ЕМТ и посылает Я'Аг-сегмент. Примечательно, что несколько приложений одновременно могут открыть несколько соединений, поэтому свое состояние, хранящееся в записи соединения, имеется у каждого отдельного соединения. Когда прибывает сегмент 5УЖ е АСК, ТСР-сущность посылает последний АСК-сегмент ктройного Рукопожатия» и переключается в состояние Е5ТАВЕ!5НЕО, В атом состоянии можно пересылать и получать данные.
Когда у приложения заканчиваются данные для передачи, оно выполняет примитив СС05Е, заставляющий локальную ТСР-сущность послать Е)Кссегмент и ждать ответного АСК-сегмента (пунктирный прямоугольник с пометкой чактивное 618 Глава 6. Транспортный уровень (Старт) СОМ МЕСТ/Вуй С«0880 С1.08Е/- ЫЗТЕМ/- 1 СЦРВЕ/ ВУМ/Вуй + АСК ЫВТЕй г«ВТ/- 8ЕМ0/ВУМ ВУМ г«СЧ0 ВУМ ВЕМТ ВЧМ/ВЧМ + АСК (одновременное открытие) (Передача данных) 1 ! 1 АСК/- ЕВТАВ«18НЕ0 ВЧМ + АСК/АСК (3-й зтап «тройного рукопокатия») 01.0ЗЕ/»1М ! Г1М/АСК (Пассивное )раз»единение) СьОВЕ/Р(й (Активное разъединение) »1М/АСК С«08!НО Р1М ЧЧА1Т ! Е/Р!М1 АСК/- Р)й+ АСК/АСК Т1МЕ0 ЕГМ/АСК АСК/- Е!й ЧЧА)Т 2 1 АСК/- (Тайм-аут/) СсСВЕ0 (Назад на старт) рис.
6.28. Конечный автомат ТСР-совдинвния. Жирная сплошная линия показывает нормальный путь клиента, Пунктиром показан нормальный путь сервеРа, Тонкими линиями обозначены нвобычныв события Рассмотрим теперь управление соединением с точки зрения сервера. Сервер выполняет примитив !.15Ткй и переходит в режим ожидания запросов соедине- разьединенне»). Когда прибывает подтверждение, происходит переход в состояние г/)Ч ИА1Т 2, и одно направление соединения закрывается.