tanenbaum_seti_all.pages (525408), страница 65
Текст из файла (страница 65)
Размер буфера неограиичеп. И что лучше всего, канал связи между уровнями передачи данных никогда ие теряет и ис искажает кадры. Этот совершенно иерсальпый протокол, который мы пазовом «утопия», показан в листинге 3.2. Протокол состоит из двух процедур, вепбег (отправитель) и гесе>уег (получатель). Процедура вепбег работает иа уровне передачи данных посылающей машииы, а процедура гесетуег — па уровне передачи данных принимающей лташииы. Ни последовательные номера, ии подтверждения ие используются, поэтому МАХ ЯЕЯ ис требуется. Единственным возможным событием является 1гаюе аггт ча1 (то есть прибытие неповрежденного кадра). Процедура вепбег представляет собой бесконечный цикл, пачииак>щийся с оператора нМ1е, посылак>ший данные па линию с максимально возможной скоростью. Тело цикла состоит из трех действий: получен>и пакета (всегда обязательное) с сетевого уровня, формирования исходящего пакета с помогцью перемешюй в и отсылки пакета адресату.
Из служебных полей кадра данный протокол использует только поле 1пбо, поскольку другис поля относятся к обработке опшбок и управлсиию потоком, которые в данном протоколе ис примеияются. Процедура принимающей стороны ничуть ие сложисе. Вначале оиа ожидает, пока что-иибудь произойдет, причем единственно возможным событием в данком протоколе может быть получение неповрежденного пакета. Когда пакст появляется, процедура ню1 Гог еуепг возвращает управлеиие, при этом переменкой ечепг присваивается значение бгаюе аггтча1 (которое все равно игнорируется).
Обращение к процедуре ~гою р)тувтса1 1ауег удаляет вновь прибывший кадр пз аппаратного буфера и помещает его в перемсииук> г. Наконец, порция данных передается сетевому уровню, а уровень передачи данных отпратьляется ждать следующий кадр.
Листинг 3.2. Неограниченный симплексный протокол г* Протокол 1 1угопия) обеспечивает только одностороннюю передачу данных — от отправителя к попучатепю. Предполагается, что в канале связи нет оюибок и что получатель способен игновенно обрабатывать получаемые данные.
Соответственно. отправитель в цикле передаег данные на линию с наксииагъно доступной дпя него скоростью, *г' суребеГ епыю (Ггаюе аггтча1) ечепг Гуре: гх хыыны гивгыхгычи данньгх (/1пс1цбе "ргососо1.Ь" чо1О вепбег1(чо1О) ( )гаже в: расчес Ьц/(ег: /* буфер дпя исходящего кадра */ /* буфер дпя исходящего пакета */ ыпз1е (Сгце) ( 1гож песиогЕ 1ауег(йонг(ег); */ в.щ(о = Ьц(1ег; Со рпуз(са1 )ауег(ая); /* получить у сетевого уровня пакет для передачи /* снопировать его в кадр з для передачи */ /* послать кадр 5 *l /* Иы дни за дняни желчен «Завтра, завтра». Тан тихини шаггни жизнь ползет К послед~ей недописанной странице.
- Макбет, Ч, ч */ чо1б гесе1чег1(чозб) 1гаше г: ечепС Суре ечепС; /* заполняется процедурой ожидания событий. но не используегся здесь '7 иЬ11е (Сгце) ( иа)С 1ог ечепС(аечепС): /* Единственное вознОжнОЕ ссбытие — прибытие кадра. событие /гаже агю ча1 / /гож рпуззса1 )ауег(йг): /* получить прибывший кадр */ Со пегыогк )ауег($г.зп/о): /* передать данные сегЕвсну урОВна */ Симплексный протокол с ожиданием Теперь мы отбросим самое нереальное предположение, использованное в протоколе 1, — способность получающего сетевого уровня мгновенно обрабатывать приходящие данные (или, что то же самое, наличие у получающего уровня передачи данных неограниченного буферного пространства, в которое оц помешает все приходящие кадры).
Сохраняется предположение о том, что в канале связи нет ошибок. Линия связи остается симплексной. Основная проблема, которую нам предстоит решить, — как предотвратить ситуацию, когда отправитель посылает данные быстрее, чем получатель может их обработать. То есть если получателю требуется время о г, чтобы выполнить процедуры Тгояз рьуз)са1 1ауег и со песыогх ) ауег, то отправитель должен передавать со срелней скоростью меньшей, чем один кадр за интервал времени б с Более того, если мы предполагаем, что в принимающей аппаратуре не производится автоматической буферизации, то отправитель не лолжен посылать новый калр ло тех пор, пока старый кадр нс будет считан процедурой Тгош рпуз)оа1 1ауег.
В противном случае новый кадр окажется записанным поверх старого. Элементарные протоколы передачи данных 247 /* Протокол 2 (с ожиданиен) также обеспечивает только одностороннюю переда~у данных. от отправителя к получателю. Снова предполагается, что в канапе связи нет ошибок. Однако на этот раз енкость буфера получателя ограничена, и, кроне того. ограничена скорость обработки данных получателя. Поэтону протокол должен не допускать отправления данных быстрее, чен получатель способен их обработать. */ Суребет ение ((гаже агг1ча)) ечепС Суре: Ф)лс1ибе "ргоСосо).П" чо1б вепбег2(чотб) ( тгаюе в: /* буфер для исходящего калра */ раскас ьи(тег: /* буфер для исходящего паке~а */ ечепс Суре ечепс; /* единственное возиожное событие — прибытие надра (событие Стаже агг1ча1)*/ нЬ!1е (Сгие) ( /гоп петногК 1ауег(аби((ег), */ /* получить у сетевого уровня пакет для передачи в.1пто = Ьи(тег: со рпуэ1са1 1ауег(фв): на)С тот ечепС(аечепС); разрешения '/ /* скопировать его в кадр э для передачи */ /* до свидания, кадрик, до свидания */ /* не продолжать, пока на это не будет получено При некоторых обстоятельствах (например, при синхронной передаче, когда уровень передачи данных принимающей машины обрабатывает всего одну входную линию) может быть достаточно всего лишь вставить задержку в передающую программу протокола Е снизив скорость его работы настолько, чтобы уберечь принимающую сторону от забивания данными.
Однако в реальных условиях обычно каждый уровень передачи данных должен одновременно обрабатывать несколько линий, и время, необходимое на обработку одного кадра, может меняться в довольно значительных пределах. Если разработчик сети может рассчитать наихудшую ситуацию для приемника, он может запрограммировать настолько медленную работу отправителя, что лаже при самой медленной обработке поступающих кадров получатель будет успевать их обрабатывать.
Недостаток такого подхода в его консерватизме. В данном случае использование пропускной способности будет намного ниже оптимального уровня. Исключением может быть только один случай — когда время реакции принимающего уровня передачи данных изменяется очень незначительно. Лучшим решением данной проблемы является обратная связь со стороны получателя. Передав пакет сетевому уровню, получатель посылает небольшой управляющий пакет отправителю, разрешая тем самым посылать следующий кадр.
Отправитель, отослав кадр, должен ждать разрешения на отправку следующего кадра. Протоколы, в которых отправитель посылает олин кадр, после чего ожидает подтверждения, называются протоколами с ожиданием. В листинге 3.3 приведен пример симплексного протокола с ожиданием. Листинг З.З. Симллексный протокол с ожиданием 248 Глава 3. Уровень передачи данных /* /* /* получить прнбывиий кадр */ ,>* передать данные се<едоку уровню */ /* передать пустой кадр, чтобы оазбудгть Как и в протоколе 1, отправитель в начале цикла работы получает пакст от сетевого уровня, формирует из него кадр и отправляет кадр по линии связи.
Однако теперь, в отличие от протокола 1, отправитель должен жлать прибытия кадра с подтверждением, прежде чем оп пойдет на следующую итерацию цикла и обратится к сетевому уровню за слслуюшим пакетом. В данной модели уровень передачи данных отправителя лажс не должен просматривать полученный по линии квлр: его содержимое не имеет значения, поскольку сам кадр означает только одно: подтверждение. Единственное отличие процедуры песе)нег2 от гесез уег1 заключается в том, что после передачи пакета сетевому ур<>вн>о гесс>уег2 посылает кадр подтверждения обратно отправителю, после чего идет на слелуюшу<о итерацию цикла. Поскольку для отправителя важно только прибытие ответного кадра, а нс его содержание, то получателю нс нужно заполнять калр специальной информацией.
Симплексный протокол для зашумленных каналов Теперь рассмотрим реальную ситуацию: канал связи, в котором могут быть ошибки. Кадры могут либо портиться, либо теряться. Однако мы будем предполагать, что если калр будет поврежден при передаче, то приемная аппаратура опРелелит это при подсчете контрольной суммы. Если кадр будет поврежден таким образом, что контрольная сумма совпадет, что очень маловероятно, то этот протокол (и любой другой протокол) передаст неверный пакет сетевому уровню. На первый взгляд может показаться, что нужно лишь добавить таймер к протоколу 2. Получатель булет возвращать подтверждение только в случае получения правильных лапных. Неверные пакеты будут просто игнорироваться.
Через некоторое время у отправителя истечет интервал времени, и он отправит кадр е>це раз. Этот процесс будет повторяться до тех пор, пока кадр, наконец, пс прибудет в целости. В привсленной выше схеме имеется один критический недостаток. Прсжлс чем читать дальше, попытайтесь понять, что же неверно в данном алгоритме. но>О гесе>чег2(уо>О) ( (гаие г, а: еуепс суре евепс.