tanenbaum_seti_all.pages (525408), страница 64
Текст из файла (страница 64)
Тип зец лг является целым без знака, используемым для нумерации кадров. Этн последовательные номера могут принимать значения от О до числа МАХ БЕО включительно, которое опрелеляется в каждом протоколе, использующем его. Тнп рзсхег является единицей информации, используемой при обмене ипформацисй между сетевым уровнем и уровнем передачи данных одной машины или двумя равноранговыми сетевыми уровнями.
В нашей модели пакет всегда состоит из МАХ РКТ байт, хотя на практике он обычно имеет переменную длину. Структура 1гзее состоит из четырех полей: 11лб, зец, зс1 и ~лго, — первые трн из которых содержат управляющую информацию, а последнее может солсржать данные, которые необходимо передать. Эти три управляющих поля вместе называются заголовком кадра. Поле х1пЬ сообшает о наличии данных в кадре, так как некоторые протоколы отличают кадры, содсржащис только управляюгцую информацпкь от кадров, содержащих также н данные. Поля вес и зсх используются соответственно лля хранения последовательного номера кадра и подтверждения.
Подробнее их использование будет описано далее. Поле данных кадра, ~ л1о, содержит один пакет. В управляющем кадре поле 1п1о нс используется. В реальной жизни используется поле ~п1о переменной длины, полностью отсутствующее в управляющих кадрах. Важно понимать взаимоотношения между пакетом и кадром. Сетевой уровень создает пакет, принимая сообщение от транспортного уровня и добавляя к нему заголовок сетевого уровня.
Этот пакет передается уровню передачи данных, котоРый включает его в поле 1п1о исходящего кадра. Когда кадр прибывает на пункт назначения, уровень передачи данных извлекает пакет нз кадра и передает его сетевому уровню. Таким образом, сетевой уровень может действовать так, как будто машины обмениваются пакетами напрямую. В листинге 3.1 также перечислен ряд процедур. Это библиотечные процедуРы, детали которых зависят от конкретной реализации, и их внутреннее устройство мы рассматривать не будем. Как уже упоминалось ранее, процедура нз1г ~ог ечел1 представляет собой холостой цикл ожидания какого-нибудь события.
Процедуры 1о пегногх 1ауег и ггоя пегногх 1ауег используются уровнем передачи Элементарные протоколы передачи данных 243 данных для псредачи пакетов сетевому уровню и для получения пакетов от сетевого уровня соответственно. Обратите внимание: процедуры 1гое рПуелса1 1эуег и Со РПуюса1 1ауег используются для обмена кадрами между уровнем передачи данных и физическим уровнем, тогда как процедуры го ле1ногм 1ауег и 1гощ пегногП 1эуег применяются для передачи пакетов между уровнем передачи данных и сетевым уровнем. Другими словами, процедуры 1о пеГногЕ 1ауег и 1гое па~ног~ 1ауег относятся к интерфейсу между уровнями 2 и 3, тогда как процедуры 1гов рПуз1са1 1ауег и Го рПуз~са1 1ауег относятся к интерфейсу между уровнями 1 н 2. В большинстве протоколов предполагается использование ненадежного канала, который может случайно потерять целый кадр.
Для обработки подобных ситуаций передающий уровень передачи данных, посылая кадр, запускает таймер, Если за установленный интервал времени ответ не получен, таймер воспринимает это как тайм-аут, и уровень передачи данных получает сигнал прерывания. В наших примерах протоколов это реализовано в виде значения ечепс=г! яеоо1, возвращаемого процедурой на~ с 1ог етелг.
Для запуска и остановки таймера используются процедуры зтагт 11еег и зтор ь1еег соответственно. Событие С1эеощ может произойти, только если запущен таймер. Процедуру з1эгс 11аег разрешается запускать во время работающего таймера. Такой вызов просто переиннциализирует часы, чтобы можно было начать отсчет заново (до нового тайм-аута, если таковой будет иметь место). Процедуры з1агс ась 11эег и згор ась С1яег используются для управления вспомогательными таймерами при формировании подтверждений в особых обстоятельствах.
Процедуры елээ)е лесноФ 1ауег и о1заэ1е пеСноФ ! ауег используются в более сложных протоколах, где уже не предполагается, что у сетевого уровня всегда есть пакеты для отправки. Когда уровень передачи данных разрешает работу сетевого уровня, последний получает также разрешение прерывать работу первого, когда ему нужно послать пакет. Такое событие мы будем обозначать как етепг=пегногк 1эуег ген. Когда сетевой уровень отключен, он не может инициировать такие события. Тщательно следя за включением и выключением сетевого уровня, уровень передачи данных не допускает ситуации, в которой сетевой уровень заваливает его пакетами, для которых не осталось места в буфере. Последовательные номера кадров всегда находятся в пределах от О до МАХ 5ЕЯ (включительно).
Число МАХ ЮЕЯ различно в разных протоколах. Для увеличения последовательного номера кадров на 1 циклически (то есть с обнулением при постижении числа МАХ ЯЕО) используется макрос 1лс. Он определен в виде макроса, поскольку используется прямо в строке в тех местах программы, где быстродействие является критичным. Как мы увидим позднее в этой книге, производительность сети часто ограничена быстродействием протоколов. Определение простых операций в виде макросов не снижает удобочитаемости пРограммы, увеличивая при этом се быстродействие.
К тому же, поскольку МАХ ЕЕЯ в разных протоколах будет иметь разные значения, то, определив инкремент в виде макроса, можно один и тот же код без проблем использовать в нескольких протоколах. Такая возможность крайне полезна для симулятора. 244 Глава 3. Уровень передачи данных Листинг Э.1. Общие объявления для последующих протоколов. Объявления располагаются в файле рго1осойб т)бег!пе МАХ РКТ )б24 /* определяет размер пакета в байтах */ Суребет епцш (Га!зе, 1гце) Ьоо)еап; Суребе цпзтдпеС тпС зец пг, */ суребеГ з1гцсс (цпвздпеб спаг ба(а[мдх Ркт3;) расхес: /* определение пакета */ (уредеГ епцш (бата.
аск, пах) Ггаше хтпб: /* отпределение типа пакета */ /* ожидать события и вернуть тип события в переиенной ечеп( */ чо!О ыа!т Гог ечеп((ечепт Суре *ечеп(): /* получить пакет у сетевого уровня для передачи по каналу */ что Ггош пе1ыогк )ауег(расйеь *р): /* передать инфориацию нз полу~енного пакета сетевону уровню */ чотб то петыогй )ауег(расяе( *р): /* получить пришедшмй пакет у физического уровня и скопировать его в г */ чо!б Ггош рлуятса) 1ауег(Ггаше *г); /* передать кадр физическоиу уровню для передачи */ чо1о (о рпузтса) 1ауег(ггаше *з); /* запустить таймер и разрешить событие С!шеоцт */ чо1б зсагс с!шег(зец.пг х); /* остановить тайиер и запретить собьпие С!шепот */ чо!б яСар С1шег(зец пг Х): /* запустить вспоиотательный тайиер и разрешить событие асХ С!шеоцс */ чотб з(агс асй т!шег(чо!б): /* остановить вспоиотательныл такмер и запретить событие ась т!шеоцс */ чоЫ в(ор асХ С!вес(чозб): /* разрешить сетевоиу уровню инициировать событие песыогх 1ауег геабу */ чотб епаб)е певыогм !ауег(чотб): /* запретить сетевоиу уровню инициировать событие пепяогй 1ауег геабу */ чозб едзаб)е пе(ыогк 1ауег(чо!б); /* иакрос 1пс развертывается пряно в строке, циклически увеличить переиенную Х */ Йег!пе !пс(Х) зг (Х < МАХ 5Е()) Х = Х ~ 1; е1зе К = 0 (уребег зтгцс1 ( */ /гаже Х!пб Х!пб; вед пг зец; яец пг асй: расве1 1пто: ) /паше; /* ткп ооо1еап */ /* порядковые номера кадров или подтверждений /* данный уровень занимается транспортировкой кадров /* тип кадра */ /* порядковый попер */ /* попер подтверждения */ /* пакет сетевого уровчя */ Элементарные протоколы передачи данных 245 Объявления в листинге 3.1 являются частью всех послелуюших протоколов.
для экономии места и удобства ссылок оии были извлечены и собраны вместе, ио, по идее, оии должны быть объединены с протоколами. В языке С такое объедииеиие производится с помощью директивы прспроцессора >тт пс1ыбе с указаниемм ссылки иа файл ргоаосот.й, в котором помещаются данные определения. Неограниченный симплексный протокол В качестве первого примера мы рассмотрим самый простой протокол. Данг>иге передаются только в одном направлении. Сетевой уровсиь иа передающей и приемкой сторонах находится в состоянии постоянной готовности. Временем обработки можно пренебречь.