Э. Таненбаум - Компьютерные сети. (4-е издание) (DJVU) (1130092), страница 65
Текст из файла (страница 65)
Таким образом, сетевой уровень может действовать так, как будто машины обмениваются пакетами напрямую. В листинге ЗА также перечислен ряд процедур. Это библиотечные процедуры, детали которых зависят от конкретной реализации, и их внутреннее устройство мы рассматривать не будем. Как уже упоминалось ранее, процедура иэ1г ~ог ечепЬ представляет собой холостой цикл ожидания какого-нибудь события. Процедуры го пегиог1 1ауег и асов пеьиог1 1ауег используются уровнем передачи Элементарные протоколы передачи данных 243 данных для передачи пакетов сетевому уровню и для получения пакетов от сетевого уровня соответственно. Обратите внимание: процедуры ргое рнузрса1 1ауег и со рпузаса1 1ауег используются для обмена кадрами между уровнем передачи данных и физическим уровнем, тогда как процедуры Со пеСногк 1ауег и тгое пеСногх 1ауег применяются для передачи пакетов между уровнем передачи данных и сетевым уровнем.
Другими словами, процедуры Со пегногк 1ауег рр тгое пеСногк 1ауег относятся к интерфейсу между уровнями 2 и 3, тогда как процедуры Сгоо рнушса1 1ауег и Со раугпса1 1ауег относятся к интерфейсу между уровнями 1 и 2. В большинстве протоколов предполагается использование ненадежного канала, который может случайно потерять целый кадр. Для обработки подобных ситуаций передарощий уровень передачи данных, посылая кадр, запускает таймер, Если за установленный интервал времени ответ не получен, таймер воспринимает это как тайм-аут, и уровень передачи данных получает сигнал прерывания. В наших примерах протоколов это реализовано в виде значения ечепС=С1щеовг, возвращаемого процедурой ею С рог ечепС.
Для запуска и остановки таймера используются процедуры зСагС Саеег и зСор С1еег соответственно. Событие С1ееовС может произойтн, только если запущен таймер. Процедуру ССагС С1 еег разрешается запускать во время работающего таймера. Такой вызов просто переинициализируег часы, чтобы можно было начать отсчет заново (до нового тайм-аута, если таковой будет иметь место). Процедуры асагс аск среег и асор асс с1арег используются для управления вспомогательными таймерами при формировании подтверждений в особых обстоятельствах. Процедуры епав1е пеСногк 1ауег и ор эаЫе пеСногк 1ауег используются в более сложных протоколах, где уже не предполагается, что у сетевого уровня всегда есть пакеты для отправки.
Когда уровень передачи данных разрешает работу сетевого уровня, последний получает также разрешение прерывать работу первого, когда ему нужно послать пакет. Такое событие мы будем обозначать как ечепС=пеСногх 1ауег геайу. Когда сетевой уровень отключен, он не может инициировать такие события. Тщательно следя за включением и выключением сетевого уровня, уровень передачи данных не допускает ситуации, в которой сетевой уровень заваливает его пакетами, для которых не осталось места в буфере. Последовательные номера кадров всегда находятся в пределах от О до МАХ БЕ~ (включительно).
Число МАХ БЕД различно в разных протоколах. Для увеличения последовательного номера кадров на 1 циклически (то есть с обнулением при достижении числа МАХ БЕ0) используется макрос рпс. Он определен в виде макроса, поскольку используется прямо в строке в тех местах программы, где быстродействие является критичным. Как мы увидим позднее в этой книге, производительность сети часто ограничена быстродействием протоколов. Определение простых операций в виде макросов не снижает удобочитаемости программы, увеличивая при этом ее быстродействие. К тому же, поскольку МАХ БЩ в разных протоколах будет иметь разные значения, то, определив инкремент в виде макроса, можно один и тот же код без проблем использовать в нескольких протоколах.
Такая возможность крайне полезна для симулятора. 244 Глава 3. Уровень передачи данных Лиотинг 3.1. Общие объявления для последующих протоколов. Объявления располагаются в файле рготосо).П //бе/тле МАХ РКТ 1024 /* опрелеляет Разиер пакета в бай~ах "/ Суребет епца Сга1зе, Сгце) Ьоо1еап; Суребет цпзтрпед тпс вец пг: */ суребег зсгцсс Сцпзтйпед спаг басаЕмдх Ркт):) расхес: /" определение паке~а */ суребег епца Спаса. аск лак) /гаже хтпоп /* отпределение типа пакета */ /" ожидать события и вернут~ тип события в переменной ечепС */ чо!б ыатС Гог ечепс/ечепС Суре *ечепС).
/* получить пакет у сетевого уровня для передачи по каналу */ чотб Ггоа песыогй 1ауег(раскеС *р); /* передать информацию из полученного пакета сетевоиу уровню */ чотб Со песыогй 1ауег(расйеС *р): /* получить пришедший пакет у физического уровня и скопировать его в г */ чотб Ггоа рлузтса1 1ауег(/гаже *г); /* передать кадр физическому уровню для передачи */ чотд Со РПуз1са1 1ауег//гаже *з): /* запустить тайиер и разрешить собьпие с1аеоцс */ чотб всагс Стаег(вод пг Х): /* остановить тайнер и запретить событие Стаеоцс "/ чо10 асор С1аег(вец пг Х)г /* запустить вспомогательный таймер и разрешить событие аск Стаеоцс */ чотб всагС аск Стаег(чотб): /* остановить вспоиогательный таймер и запрети~ь событие асх стаеоцс */ чо1/1 асор асй СтаегСчотб); /* Разрешить сетевоиу уровню инициировать событие петыогй 1ауег геабу */ чо1б епаб)е пебиогк )ауеггчотб); /* запРетить сетевоиу уровню инициировать событие песыогк 1ауег геабу */ чотб бтзаб)е песыогй 1ауег/чотб); /* иакрос тпс развертывается прямо в строке: циклически увеличить переиенную Х */ ябв/1ПЕ тПСГК) 1/ Гк < МАХ ОЕО) К = Х ч 1: Е1ЗЕ Х = 0 Суреает зтгцсС 1 */ /гаже Хтпд К1пб: зец пг зец: зец пг асй; раскеС тпго: ) /гаже.
/* тип Ьоо1еап */ /* порядковые ноиера кадров или подтвеождений /" данный уровень занимается транспорткровкой кадров /* тип надра */ /* порядновый ноиео */ /* попер подтверждения */ /* пакет сетевого уровня */ Элементарные протоколы передачи данных 246 Объявления в листинге 3.1 являются частью всех последующих протоколов. для экономии места и удобства ссылок они были извлечены и собраны вместе, но, по идее, они должны быть объединены с протоколами. В языке С такое объединение производится с помощью директивы препроцессора тгт пс1цде с указанием ссылки на файл ргогасобй, в котором помещаются данные определения. Неограниченный симплексный протокол В качестве первого примера мы рассмотрим самый простой протокол.
Данные передаются только в одном направлении. Сетевой уровень на передающей и приемной сторонах находится в состоянии постоянной готовности. Временем обработки можно пренебречь. Размер буфера неограничен. И что лучше всего, канал связи между уровнями передачи данных никогда не теряет и не искажает кадры. Этот совершенно нереальный протокол, которьш мы назовем «утопия», показан в листинге 3.2. Протокол состоит пз двух процедур, зепбег (отправтгтель) и сосет уег (получатель). Процедура вепбег работает на уровне передачи данных посылающей машины, а процедура гесш уег — на уровне передачи данных принимающей машины.
Ни последовательные номера, ни подтверждения не используются, поэтому МАХ БЕО не требуется. Единственным возможным событием является бгаюе вггт хат. (то есть прибытие неповрежденного кадра). Процедура вепбег представляет собой бесконечный цикл, начинаютцийся с оператора нлт1е, посылающий данные на линию с максимально возможной скоростью. Тело цикла состоит из трех действий; получения пакета (всегда обязательное) с сетевого уровня, формирования исходящего пакета с помощью переменной з и отсылки пакета адресату.
Из служебных полей кадра данный протокол использует только поле тп1о, поскольку другие поля относятся к обработке ошибок и управлению потоком, которые в данном протоколе не применяются. Процедура принимающей стороны ничуть не сложнее. Вначале оца ожидает, пока что-нибудь произойдет, причем единственно возможным событием в данном протоколе может быть получение неповрежденного пакета. Когда пакет появляется, процедура иатс уог ечепг возвращает управление, при этом переменной ечепб присваивается значение Угаюе аггтчз1 (которое все равно игнорируется). Обращение к процедуре Угрю рггувтса1 1ауег удаляет вновь прибывший кадр из аппаратного буфера и помещает его в переменную г.
Наконец, порция данных передается сетевому уровню, а уровень передачи данных отправляется ждать следующий кадр. Листинг 3.2. Неограниченный симплексный протокол (* Протокол 1 (утопия) обеспечивает толька одностороннюю передачу данных — от отправителя к получателю. Предполагается, что в канале связи нет ошибок и что получатель способен игновенно обрабатывать получаеине данные. Соответственно. отправитель в цикле передает данные нв линию с иаксииагжно доступной для него скоростью.