Э. Таненбаум - Компьютерные сети. (4-е издание) (PDF) (1130118), страница 64
Текст из файла (страница 64)
Отправитель запоминает номер следующего кадра в переменной next_frame_to_send, а получатель запоминает порядковый номер следующего ожидаемого кадра в переменной frame_expected. Передбесконечным циклом в каждой процедуре размещена короткая фаза инициализации.Передав кадр, отправитель запускает таймер. Если он уже был запущен, оннастраивается на отсчет нового полного интервала времени. Период выбираетсядостаточно большим, чтобы даже в худшей ситуации кадр успел дойти до получателя, получатель успел его обработать и подтверждение успело вернуться к отправителю.
Только по истечении отведенного времени можно утверждать, чтопотерялся кадр или его подтверждение, а значит, необходимо послать дубликат.Если время, после которого наступает тайм-аут, сделать слишком коротким, топередающая машина будет повторно посылать слишком много кадров, в которыхнет необходимости. Хотя лишние кадры в данном случае не повлияют на правильность приема данных, они повлияют на производительность системы.После передачи кадра отправитель запускает таймер и ждет какого-либо события. Возможны три ситуации: либо придет неповрежденный кадр подтверждения, либо будет получен поврежденный кадр подтверждения, либо просто истечет интервал времени.
В первом случае отправитель возьмет у сетевого уровняследующий пакет и положит его в буфер поверх старого пакета. Кроме того, онувеличит порядковый номер кадра. Если же прибудет поврежденный кадр подтверждения или подтверждение не придет вовсе, то ни буфер, ни номер не будутизменены и будет послан дубликат кадра.Когда неповрежденный кадр прибывает к получателю, проверяется его номер.Если это не дубликат, то кадр принимается и передается сетевому уровню, послечего формируется подтверждение. Дубликаты и поврежденные кадры на сетевойуровень не передаются.252Глава 3. Уровень передачи данныхПротоколы скользящего окнаВ предыдущих протоколах информационные кадры передавались только в однусторону. В большинстве практических ситуаций требуется передача данных в обоих направлениях.
Один из способов получения дуплексной передачи данных заключается в создании двух отдельных симплексных каналов связи, по которымданные передаются в противоположных направлениях. При этом получается дваотдельных физических канала, каждый из которых имеет прямой канал для данных и обратный канал для подтверждений. В обоих случаях пропускная способность обратных каналов почти не используется. В результате пользователь платит за два канала, но использует емкость одного.Более прогрессивной идеей представляется использование одного канала дляпередачи данных в обоих направлениях.
В конце концов, ведь в протоколах 2 и 3кадры уже передавались по каналу в двух направлениях, а обратный канал обладает той же пропускной способностью, что и прямой. В такой модели кадры сданными от машины А для машины В перемешиваются с кадрами подтверждений от А к В. Получатель может отличить кадр с данными от кадра с подтверждением по специальному полю kind заголовка кадра.Помимо чередования кадров с подтверждениями и информационных кадров,возможно и другое улучшение протокола.
Приняв кадр с данными, получательможет не посылать сразу кадр с подтверждением, а подождать, пока сетевой уровень даст ему следующий пакет. Подтверждение добавляется к исходящему информационному кадру с помощью поля аск заголовка кадра. В результате дляпередачи подтверждения почти не будет затрачено ресурсов. Подобная техниканазывается piggybacking (комбинированная, или ярусная, перевозка).Основное преимущество совмещения передачи прямых и обратных пакетовзаключается в улучшенном использовании пропускной способности канала.
Поле аск в заголовке кадра занимает всего несколько бит, тогда как отдельный кадрпотребует заголовка и контрольной суммы. Кроме того, чем меньше количествоприбывающих кадров, тем меньше прерываний работы программы, связанных сэтим событием, и, возможно, меньше буферов у получателя (в зависимости отспособа организации программного обеспечения получателя). В следующем рассматриваемом нами протоколе расходы на совмещение передачи прямых и обратных пакетов составляют всего 1 бит заголовка кадра. Эти расходы редко превышают несколько бит.Однако при совмещении передачи прямых и обратных пакетов в протоколепоявляются новые проблемы.
Как долго должен уровень передачи данных ждатьпакета, с которым следует переслать подтверждение? Если уровень передачи данных будет ждать дольше, чем отправитель, то последний пошлет кадр повторно,что неприемлемо. Если бы уровень передачи данных мог предсказывать будущее, он бы знал, ждать ему пакета или отправлять подтверждение отдельным кадром. Это, конечно, невозможно, поэтому следует установить еще один интерваложидания (меньший, чем интервал ожидания отправителя), по истечении которого подтверждение отправляется отдельным кадром. Если же сетевой уровеньПротоколы скользящего окна253успеет передать уровню передачи данных пакет, то подтверждение будет отослано вместе с этим пакетом в одном кадре.Следующие три протокола являются двунаправленными и принадлежат к классу протоколов скользящего окна (sliding window). Как будет показано далее,они отличаются друг от друга эффективностью, сложностью и требованиями кразмерам буфера.
Во всех протоколах скользящего окна каждый исходящийкадр содержит порядковый номер (варьирующийся от 0 до некоего максимума).Поскольку на этот номер обычно отводится поле размером п бит, максимальноезначение номера составляет 2" — 1. В протоколах скользящего окна с ожиданиемобычно на это поле отводится всего один бит, что ограничивает порядковый номер значениями 0 и 1, однако в более сложных версиях может использоватьсяпроизвольное значение п.Сущность всех протоколов скользящего окна заключается в том, что в любоймомент времени отправитель работает с определенным набором порядковых номеров, соответствующих кадрам, которые ему разрешено посылать.
Про такиекадры говорят, что они попадают в посылающее окно. Аналогично получательработает с принимающим окном, соответствующим набору кадров, которые емупозволяется принять. Окно получателя и окно отправителя не обязаны иметьодинаковые нижний и верхний пределы и даже не обязаны быть одного размера.Размеры одних протоколов фиксируются, а размеры других могут увеличиваться или уменьшаться по мере передачи или приема кадров.Хотя данные протоколы предоставляют уровню передачи данных большуюсвободу в вопросе, касающемся порядка передачи и приема кадров, требованиедоставки пакетов сетевому уровню принимающей машины в том же прядке, вкотором они были получены от сетевого уровня передающей машины, сохраняется.
Также сохраняется аналогичное требование к физическому уровню, касающееся сохранения порядка доставки кадров. То есть физический уровень долженфункционировать подобно проводу, доставляя все кадры в том порядке, в котором они были посланы.— Порядковые номера в окне отправителя соответствуют кадрам, которые ужеотправлены, но на которые еще не получены подтверждения.
Получаемому отсетевого уровня пакету дается наибольший порядковый номер, и верхняя граница окна увеличивается на единицу. Когда поступает подтверждение, на единицувозрастает нижняя граница окна. Таким образом, окно постоянно содержит список неподтвержденных кадров.Так как кадры, находящиеся в окне отправителя, могут быть потеряны или повреждены во время передачи, отправитель должен хранить их в памяти на случай возможной повторной передачи. Таким образом, если максимальный размеркадра равен п, то отправителю потребуется п буферов для хранения неподтвержденных кадров.
Если окно достигает максимального размера, уровень передачиданных должен отключить сетевой уровень до тех пор, пока не освободится буфер.Окно принимающего уровня передачи данных соответствует кадрам, которыеон может принять. Любой кадр, не попадающий в окно, игнорируется без какихлибо комментариев. Когда прибывает кадр с порядковым номером, соответствующим нижнему краю окна, он передается на сетевой уровень, формируется под-254Глава 3. Уровень передачи данныхПротоколы скользящего окнатверждение и окно сдвигается на одну позицию.
В отличие от окна отправителя,окно получателя всегда сохраняет свой изначальный размер. Окно единичногоразмера говорит о том, что уровень передачи данных может принимать кадрытолько в установленном порядке, однако при больших размерах окна это не так.Сетевому уровню, напротив, данные всегда предоставляются в строгом порядке,независимо от размера окна уровня передачи данных.На рис.
3.9 показан пример для окна с максимальным размером 1. Вначалекадров в окне нет, поэтому само окно пустое и его верхний и нижний края совпадают.255простая ситуация. Начинающая машина получает первый пакет от своего сетевого уровня, создает из него кадр и посылает его. Когда этот (или другой) кадрприбывает, получающий уровень передачи данных проверяет, не является лиэтот кадр дубликатом, аналогично протоколу 3.
Если это тот кадр, который ожидался, он передается сетевому уровню и окно получателя сдвигается вверх.Л и с т и н г 3 . 5 . 1-битовый протокол скользящего окна/* Протокол 4 (скользящее окно) является дуплексным и более надежным, чем протокол 3.*/f d e f i n e MAX_SEQ I/* в протоколе 4 должно быть равно 1 */typedef enum {frame_arrival.
cksum_err, timeout} event_type;finclude "protocol.h"Оvoid protocol4 (void){ПолучательРис. 3.9. Скользящее окно размера 1 с 3-битовым порядковым номером: начальнаяситуация (а); после отправки первого кадра (б); после приема первого кадра (в);после приема первого подтверждения (г)seq_nr next_frame_to_send:seq_nr frame_expected;frame r. s:packet buffer;event_type event:/*/*/*/*только 0 или 1 */только 0 или 1 */временная переменная */текущий посланный пакет */next_frame_to_send = 0:frame_expected = 0;from_network_layer(&buffer);s.info = buffer:s.seq = next_frame_to_send;s.ack = 1 - frame_expected:данных */to_physical_layer(&s):start_timer(s.seq);/*/*/*/*/*/*номер следующего кадра в исходящем потоке */номер ожидаемого кадра */получить первый пакет у сетевого уровня */подготовить первый кадр для передачи */вставить порядковый номер в кадр */подтверждение, посылаемое «верхом» на кадре/* послать кадр по каналу *//* запустить таймер ожидания подтверждения */while (true) {wait_for_event(&event):/* ждать возможного события: frame_arrival, cksum_"err или timeout */if (event = frame_arrival) • /* кадр прибыл в целости */from_physical_layer(&r); /* получить кадр */Протокол однобитового скользящего окнаПрежде чем рассматривать общий случай, изучим протокол скользящего окнас максимальным размером окна, равным 1.