Э. Таненбаум - Компьютерные сети. (4-е издание) (DJVU) (1130092), страница 160
Текст из файла (страница 160)
В этом случае соединение остается в состоянии 1ШЕ, ожидая пакета СЛСЕ кЕООЕ5Т. 666 Глава Б. Транспортный уровень Состояние Простой Ожидание В очереди Установлено Отправление Получение Рвэьединенив РН -/Просюй РЗ: А1/Установ- лено Р2: А2/Простой /Установ ено ЫЗТЕМ Р1: -/Простой Р1: АЭ/ Ожидание СОММЕСТ Р4: А5/Простой Р4: Аб/Разъеди- нение 018СОММЕС Р5: Ат/Усмн ов- лено Р5: Аб/Отпра- вление Ав/Получение НЕСЕ1ЧЕ РЗ: А1/Установена РЗ А4/В очерел Запрос соединения /уствнов ено Запрос принят А10/Уствнов- /П лена А10/Ус/янов- А10/Установлено пено -/Проста" Запрос разъединения -/Простой Подтвержде разьедннен ия А12/Установ- лено Пакет данных Ат/Установ- лено А11/Установ- лено Кредит ыиросто Тайм-вут Првднхвты действия мления) рис. 6.16.
Пример протокола как конечного автомата. у каждой ячейки матрицы может быть предикат, действие и новое состояние, Тильда означает, что основнов действие не предпринималось. Черта над предикатом означает отрицание предиката. Пустые ячейки соответствуют невозможным или неверным событиям Следует отметить, что выбор используемых состояний обусловлен не только самим протоколом.
В нашем примере нет состояния 115ТЕ/У1/у'С, которое вполне могло бы следовать после вызова примитива ~15Т5М. Состояния 11БТЕ/у11/1С нет потому, что оно связано с полем ззниси соединения, а примитив П5т5М не создает Р1; Таблица соединений полная Р2: Выполняется запрос соединения РЗ: Выполняется примитив ЫЗТЕМ Р4: Выполняется запрос разъединения Р5; Кредит ес/ъ А1: Поспать ппдтВЕРждение соединения А2: Ждать запрос соединения АЗ: Поспеть гкщтверзщвние соединения А4: Запустить таймер А5: Послать подтверждения разъединения Аб: Послать запрос разъединения ослвть соо щение Аб: ждать кредита Ав: Поглвть крепит дт 0: установить Флаг азапрос разъединения получен> А11: Записать кредит А12: Принять сообщение Простой транспортный протокол 697 записи соединения.
Почему же7 Потому что мы решили использовать в качестве идентификаторов соединений номера виртуальных каналов сетевого уровня, а для примитива Е15ТЕИ номер виртуального канала в конечном счете выбирается сетевым уровнем, когда прибывает пакет САП РЕООЕ5Т. Действия с А1 по А 12 представляют собой значительные действия, такие как отправление пакетов и запуск таймера. В таблице не перечислены менее значимые события, как, например, инициализация полей записи соедчтнения.
Бели действие включает активизацию спящего процесса, то действие, следующее за активизацией, также учитывается. Например, если прибывает пакет САСС РЕОБЕ5Т и процесс находился в состоянии ожидания этого пакета, то передача пакета САСС ЯССЕРТ, следующая за активизацией, рассматривается как часть реакции на прибытие пакета САСС РЕООЕ5Т. После выполнения каждого действия соединение может переместиться в новое состояние, как показано на рис. 6.16. Представление протокола в аиде матрицы состояний обладает тремя преимуществами. Во-первых, такая форма значительно упрощает программисту проверку всех комбинаций состояний и событий при принятии решения о том, не требуется ли какое-либо действие со стороны протокола. В рабочих версиях протокола некоторые комбинации использовались бы для обработки ошибок.
В матрице, показанной на рисунке, не проведено различия между невозможными и запрещенными состояниями. Например, если соединение находится в состоянии ожидания (чта111пй), то событие 015СОИМЕСТ является невозможным, так как пользователь блокирован и не может выполнять никакие примитивы. С другой стороны, в состоянии передачи (зепйпй) получение пакета данных не ожидается, так как кредит на них не отпускался. Прибытие пакета данных в этом состоянии является ошибкой протокола.
Второе преимущество представления протокола в виде матрицы состоит в его реализации. Можно представить себе двумерный массив, в котором элемент а[11Ы является указателем или индексом процедуры обработки события 1 в состоянии 7'. При этом можно написать транспортную сушность в ниде короткого цикла ожидания события. Когда событие происходит, берется соответствуюгцее соединение и извлекается его состояние, При известных значениях события и состояния транспортная сущность просто обращается к массиву а и вызывает соответствующую процедуру обработки.
Результатом такого подхода будет более регулярное и систематическое строение программы, нежели в нашем примере транспортной сущности. Третье преимущество использования конечного автомата заключается в способе описания протокола. В некоторых стандартных документах протоколы описываются как конечные автоматы того же вида, что и на рис. 6.17. Создать работающую транспортную сущность по такому описанию значительно легче, чем по многочисленным разрозненным документам.
Основной недостаток подхода на основе конечного автомата состоит в том, что он может оказаться более сложным для понимания, чем приведенный ранее в листинге пример программы. Однако частично эту проблему можно решить, изобразив конечный автомат в виде графа, как это сделано на рис. 6.17. В98 Глава б. Транспортный уровень рнс. 6.17. Прнмвр протокола в виде графа. для простоты переходы, нв нзмвняющнв состояние соединения, были опущены Транспортные протоколы Интернета: 00Р В Интернете нашли применение два основных протокола транспортного уровня, один из которых ориентирован на соединение, другой — нет.
В следующих разделах мы изучим их. Протоколом без установления соединения является 1)1)Р. Протокол ТСР, напротив, ориентирован на соединение. Так как 1)ЭР— зто, на самом деле, просто 1Р с добавлением небольшого заголовка, мы изучим сперва его. Рассмотрим также два практических применения 1)РР. Основы 00Р Среди набора протоколов Интернета есть транспортный протокол без установления соединения, 1ЛЭР (1)зег 1)атайгагл Ргогосо! — пользовательский дейтаграммный протокол).
1)РР позволяет приложениям отправлять инкапсулированные 1Р-дейтаграммы без установления соединений. 00Р описан в ВЕС 768. Транспортныв протоколы Интернета: ОРР 599 С помощью протокола 1Л)Р передаются сегменты, состоящие из 8-байтного заголовка, за которым следует поле полезной нагрузки. Заголовок показан на рис. 6.18. Два номера портов служат для идентификации конечных точек внутри отправляющей и принимающей машин. Когда прибывает пакет П1)Р, содержимое его поля полезной нагрузки передается процессу, связанному с портом назначения. Это связывание происходит при выполнении примитива типа В1Х1), Это было продемонстрировано в листинге 6.1 применительно к ТСР (в (Л)Р процесс связывания происходит точно так же). В сущности, весь смысл использования 1Л) Р вместо обычного 1Р заключается как раз в указании портов источника и приемника.
Без этих двух полей на транспортном уровне невозможно было бы определить действие, которое следует произвести с пакстом. В соответствии с полями портов производится корректная доставка сегментов. гг Рно. 6.18. Заголовок 00Р Информация о порте источника требуется прежде всего при создании ответа, пересылаемого отправителю. Копируя значения поля Пора исглочника из входящего сегмента в поле Порт назначения исходящего сегмента, процесс, посылающий ответ, может указать, какому именно процессу на противоположной стороне он предназначается. Поле Длина 0РР содержит информацию о длине сегмента, включая заголовок и полезную нагрузку. Контрольная сумма (л)Р не является обязательной.
Если она не подсчитывается, ее значение равно 0 (настоящая нулевая контрольная сумма кодируется всеми единицами). Отключать функцию подсчета контрольной суммы глупо, за исключением одного случая — когда нужна высокая производительность (например, при передаче оцифрованной речи). Наверное, стоит прямо сказать о том, чего 1ЛЗР не делает. Итак, 1ЛЭР не занимается контролем потока, контролем ошибок, повторной передачей после приема испорченного сегмента. Все это перекладывается на пользовательские процессы.
Что же он делает? 1Л)Р предоставляет интерфейс для 1Р путем демультиплексирования нескольких процессов, использующих порты. Это все, что он делает. Для процессов, которым хочется управлять потоком, контролировать ошибки и временные интервалы, протокол ()1)Р— это как раз то, что доктор прописал. Одной из областей, где 1Л)Р применяется особенно широко, является область клиент-серверных приложений. Зачастую клиент посылает короткий запрос серверу и надеется получить короткий ответ.
Если запрос или ответ теряется, клиент по прошествии определенного временного интервала может попытаться еше раз. Это позволяет не только упростить код, но и уменьшить требуемое количе- 600 Глава Б. Транспортный уровень ство собщений по сравнению с протоколами, которым требуется начальная настройка. ПХВ (Роша1п Хаше Яузгеш — служба имен доменов) — это приложение, которое использует 1П)Р именно так, как описано ранее. Мы изучим его в главе 7.
В двух словах, если программе нужно найти 1Р-адрес по имени хоста, например, аав.св.Ьег1ха!еу.еЩ она может послать ()1)Р-пакет с этим именем на сервер 1)ХК Сервер в ответ на запрос посылает ()РР-пакет с 1Р-адресом хоста. Никакой предварительной настройки не требуется, как не требуется и разрыва соединения после завершения задачи. По сети просто передаются два сообшения. Вызов удаленной процедуры В определенном смысле процессы отправки сооб|цения на удаленный хост и получения ответа очень похожи на вызов функции в языке программирования. В обоих случаях необходимо передать один или несколько параметров, и вы получаете результат. Это соображение навело разработчиков на мысль о том, что можно попробовать организовать запросно-ответное взаимодействие по сети, выполняемое в форме вызовов процедур.
Такое решение позволяет упростить и сделать более привычной разработку сетевых приложений. Например, представьте себе процедуру с именем 9е1 ! Р асогезэ(иая хоста), работающую посредством отправки (1ПР-пакетов на сервер РХ8, ожидания ответа и отправки повторного запроса в случае наступления тайм-аута (если одна из сторон работает недостаточно быстро). Таким образом, все детали, связанные с особенностями сетевых технологий, скрыты от программиста.
Ключевая работа в этой области написана в !984 году Бирреллом (В1гге!1) и Нельсоном (Хе1зоп). По сути дела, было предложено разрешить программам вызывать процедуры, расположенные на удаленных хостах. Когда процесс на машине 1 вызывает процедуру, находящуюся на машине 2, вызывающий процесс машины 1 блокируется и выполняется вызванная процедура на машине 2.
Информация от вызывающего процесса может передаваться в виде параметров и приходить обратно в виде результата процедуры. Передача сообщений по сети скрыта от программиста. Такая технология известна под названием КРС (Кешоге Ргосег(иге Са!1 — удаленный вызов процедуры) и стала основой многих сетевых приложений. Традиционно вызывающая процедура считается клиентом, а вызываемая — сервером. Мы и здесь будем называть их так же. Идея КРС состоит в том, чтобы сделать вызов удаленной процедуры максимально похожим на локальный вызов, В простейшем случае для вызова удаленной процедуры клиентская программа должна быть связана с маленькой библиотечной процедурой, назьгваемой клиентской заглушкой, которая отображает серверную процедуру в пространство адресов клиента.