tanenbaum_seti_all.pages (525408), страница 70
Текст из файла (страница 70)
1. Отправитель посылает кадры с О по 7. 2. Подтверждение для кадра 7 наконец прибывает к отправителю. Протоколы скользящего окна 263 3, Отправитель посылает следующие восемь кадров, снова с номерами с О по 7. 4, Еще одно подтверждение для кадра 7 прибывает к отправителю. Но вот вопрос: все восемь кадров, входящих во второй набор, благополучно дошли до адресата или все они потерялись (включая игнорированные кадры посде ошибочного)? В обоих случаях получатель отправит кадр 7 в качестве подтверждения. У отправителя нет способа отличить один случай от другого, По этой причине максимальное количество неподтвержденных кадров должно быть ограничено числом МАХ БЕЯ, Хотя в протоколе 5 кадры, поступившие после ошибки, не буферизнруются получателем, тем не менее, отправитель должен хранить отправленные кадры в своем буфере, пока не получит на них подтверждение.
Если поступает подтверждение на кадр и, кадры л — 1, л — 2 (то есть все предыдущие кадры) автоматически считаются подтвержденными. Эта особенность наиболее важна в случае потери или повреждения какого-либо калра с подтверждением. Получив подтверждение, уровень передачи данных проверяет, нс освободился ли у него какой-нибудь буфер. Если буфер освобожлается, то заблокированному ранее сетевому уровню можно снова разрешить инициировать события пегиог1 1ауег геабу. Для этого протокола предполагается, что всегда есть обратный трафик, по которому можно отправлять подтверждение. Если же это условие не выполняется, то никакие подтвержлепия отосланы пе будут. Протокол 4 не нужлается в подобном допущении, поскольку за каждым принятым кадром следует обратный, даже если только что уже был отправлен какой-то кадр в сторону отправителя.
В следующем протоколе проблема отсутствия обратного трафика будет решена гораздо элегантней. Поскольку протокол 5 хранит несколько неподтвержденных кадров, ему требуется несколько таймеров, по одному па кадр. Для каждого кадра время считается независимо от других. Все таймеры могут спмулироваться программно, используя единственные аппаратные часы, вызывающие периодические прерывания.
Данные таймеров могут храниться в программе в виде связанного списка, каждый узел которого будет хранить количество временных интервалов системных часов, оставшихся до истечения срока ожидания, номер кадра и указатель на следующий узел списка. Указатель на следующий таймер Номер кадра Интервал времени е тиках Рис.
3.! 2. Программная симуляция работы нескольких таймеров 264 Глава 3. Уровень передачи данных В качестве иллюстрации приводится рис. 3.12, на котором показана программная реализация нескольких таймеров. Предположим, что часы изменяют свое состояние каждые 100 мс. Пусть начальное значение реального времени будет 10:00:00,0, н имеются три таймера тайм-аугов, установленные на время 10:00:00.5, 10:00:01.3 и 10:00:01нй Каждый раз, когда ацпаратныс часы изменяют свое значение, реальное время обновляется п счетчик этих изменений в голове списка уменьшается на единицу. Когда значение счетчика становится равным нулю, инициируется тайм-аут, а узел удаляется из списка, как показано на рис. 3.12, б.
Такая организация таймеров не требует выполнения большой работы прн каждом прерывании от системных часов, хотя при работе процедур в1агт 1)пег и вгор 1)пег требуется сканирование списка. В протоколе у данных процедур имеется входной параметр, означаютций номер кадра, таймер которого нужно запустить или остановить. Протокол с выборочным повтором Протокол 5 хорошо работает, если ошибки встречаются нечасто, однако цри плохой линии он тратит впустую много времени, передавая кадры по два раза.
В качестве альтернативы можно использовать протокол, в котором получатель буферизирует кадры, принятые после потерянного или испорчсшюго калра. Такой протокол нс отвергает кадры только лишь потому, что предыдущий кадр был поврежден или потерян. В этом протоколе и отправитель, и получатель работают с окнами допустимых номеров кадров.
Размер окна отправителя начинается с пуля и растет до некоторого определенного уровня, МАХ ЕЕ(~. Размер окна получателя, напротив, всегда фиксированного размера, равного МАХ ЗЕ)2. Получатель должен иметь буфер для каждого кадра, номер которого находится в пределах окна. С каждым буфером связан бнт, показывающий, занят буфер нли свободен.
Когда прибывает кадр, функция бебыееп проверяет, попал ли его порядковый номер в окно. Если да, то кадр принимается и хранится в буфере. Это действие производится независимо от того, является ли данный кштр следуютцим кадром, ожидаемым сетевым уровнем. Он должен храниться на уровне псрсдачи данных до тех пор, пока все предылутцие кадры не будут переданы сетевому уровню в правильном порядке. Алгоритм протокола показан в листинге 3.7. Листинг 3.7.
Протокол скользящего окна с выборочным повтором /* Протокол б (выборонный повтор) принимает кадры в любом порядке, но передает нх сетевому уровню. соблюдая порядок. С кандым неподтвержденным кадрои связан тайиер. Прн срабатывании тайнера передается повторно только этот кадр а не все неподтвержденные кадры, как в протоколе 5. */ ))бе/тле МЯХ 5ЕО 7 /* должно быть 2"и-1 */ Жег!пе Мд ВОГ5 ПМАХ 5ЕО + 1)/2) ьУребет епвю Пгаюе агг1ча1, схвою егг, 1)юеоыг, петиогх 1ауег геасу, асд ттюеоиЦ ечепт дуре: (/тпс1йбе "рготосо1.)т" Протоколы скользящего окна 265 Ьоо1еап по пай = Сгие; /* отрицательное подтверждение (пад) еще не посылалось */ Звц ПГ О16ЕВС ГГаВЕ = ИАХ 5ЕОч1: /* начальное значекие для сииулятора */ вса(тс Ьоо1еап Ье(ыееп(вец пг а. зец пг Ь.
вец пг с) /* то же, что и в протоколе 5, но коро е и гонятнее */ гевцгп ((а <= Ы ЖЖ (Ь < с)) (( ((с < а) Жд (а = Ы ) () ((Ь < с) 55 (с < а)); ( зсаС)с чотб зепи (гаже((гаже Х1пб ГХ, зец пг главе пг. зеп пг (гаже ехРес(еб, расйеС ЬитгегП) ( /* сфориировать и послать данные. а также положительное или отрицательное подтверждение */ /саве в: /* временная перененная */ в.йтпб = ГХ: /* Х)пб == баСа, асд, или пай */ 1Г (Гх баса) з.того = ьиггег((гаже пг ж ий ВОГ53 з.вец = /гаже пг: /* ииеет значение только для информационных кадров */ в.асй = ((галю ехрессеб + ИАХ 5ЕО) Ж (ИАХ 5ЕО + 1); 1/ (ГХ = лак) по пак = Га1зе; /* один пай на кадр, пожалуйста */ Со рлувтса1 1ауег(дз): /* переслать кадр */ тд (ГХ вЂ” ба(а) вСагС С)жег((гаже пг Ж Мй ВОГ5), в(ор асй С1вег(); //" отдельный кадр с подтверждениеи не нужен */ чо16 ргососо16(чо16) ( вес( пг аск ехресСеб ве(1 пг пехС (гаже Со вепб: вед пг главе ехрессеб: вец пг Соо таг; (пт т; Жгеве г; расдеС оиС Ьи((ИК ВОГ5]; раскеС зп Ьиг(ИВ ВОГ53: Ьоо1еап аггтчеб[ЙВ ВОГ51: вец пг пбиттегеб: /* количество */ ечепС Суре ечепС, /* инициализация */ /* следующий непер подтверждения во входном потоке /* номер следующего посылаеиото кадра */ /* непер следующего ожидаеното входящего кадра */ /* верхний край окна получателя + ) */ /* вначале буфер пуст */ Гог (т = 0; 1 < ИВ ВОГ5; тм+) аггтчеб(т) = Га1зе: ыЫ 1е (Сгие) ( епаЫ е песногй 1ауег(); асх ехрессеб = 0; */ пехС /гаже Со зепи = 0; /гаже ехрес(еб = 0; Соо Гаг = Ий ВОГ5; пби(гегеб = 0: /* нижний край окна отправителя */ /* верхний край окна отправителя + 1 */ /* нижний край окна получателя */ /* верхний край окма получателя ч 1 */ /* индекс пассива буферов */ /* вреиенная перененная */ /* буферы для исходящего потока */ /* буферы для входящего потока */ /* входящая битовая нарта */ использующихся в данный момент выходных буферов 266 Глава 3.
Уровень пврвдвчи данных ыа(С тот ечелС(йечепС): */ яы1Ссп(ечепс) ( саяе песыогК 1ауег геабу: */ /* пять возиажных событий: си. ечепС Суре выше /* получить. сохранить и передать новый кадр саяе тгаше агг)ча): /* прибыл кадр с данныии или с подтверждением */ тгош рцуя1са1 )ауег(яг); /* получить пришедший кадр у физического уровня */ 1[ (г.ц1пб == ба(а) ( /* кадр прибыл в целости */ тт ((г.яец != (гаже ехрестеб) ЖВ по пад) яепб (гаже(пгк. О. (гаже ехрес(еб. оцС Ьцт): е1яе явагС асв С1шег(): ВОЕ5] = тг (Ьесыееп((гаже ехрестеб, г.яец.