Единственная неопределенность в данном протоколе может возникнуть между кадром
На стороне отправителя событием, запускающим передачу кадра
Таким образом, должно быть достаточно всего одного бита информации (со значением 0 или 1). В каждый момент времени получатель будет ожидать прибытия кадра
с определенным порядковым номером. Кадр с верным номером принимается, передается сетевому уровню, затем отправляется подтверждение его получения. Номер следующего ожидаемого кадра увеличивается по модулю 2 (то есть 0 становится 1, а 1 — 0). Кадр с неверным номером отбрасывается как дубликат. Однако последнее подтверждение повторяется, чтобы сообщить отправителю, что кадр получен полностью.
Пример подобного протокола приведен в листинге 3.4. Протоколы, в которых отправитель ожидает положительного подтверждения, прежде чем перейти к пересылке следующего кадра, часто называются PAR (Positive Acknowledgement with Retransmission — положительное подтверждение с повторной передачей) или ARQ (Automatic Repeat reQuest — автоматический запрос повторной передачи). Подобно протоколу 2, он также передает данные только в одном направлении.
Листинг 3.4. Протокол с положительным подтверждением и повторной передачей
/* Протокол 3 (PAR) обеспечивает симплексную передачу данных по ненадежному каналу. */
Листинг 3.4
Протокол 3 отличается от своих предшественников тем, что и отправитель, и получатель запоминают номера кадров. Отправитель запоминает номер следующего кадра в переменной next_frame_to_send, а получатель запоминает порядковый номер следующего ожидаемого кадра в переменной frame_expected. Перед бесконечным циклом в каждой процедуре размещена короткая фаза инициализации.
Передав кадр, отправитель запускает таймер. Если он уже был запущен, он настраивается на отсчет нового полного интервала времени. Период выбирается достаточно большим, чтобы даже в худшей ситуации кадр успел дойти до получателя, получатель успел его обработать и подтверждение успело вернуться к отправителю. Только по истечении отведенного времени можно утверждать, что потерялся кадр или его подтверждение, а значит, необходимо послать дубликат. Если время, после которого наступает тайм-аут, сделать слишком коротким, то передающая машина будет повторно посылать слишком много кадров, в которых нет необходимости. Хотя лишние кадры в данном случае не повлияют на правильность приема данных, они повлияют на производительность системы.
После передачи кадра отправитель запускает таймер и ждет какого-либо события. Возможны три ситуации: либо придет неповрежденный кадр подтверждения, либо будет получен поврежденный кадр подтверждения, либо просто истечет интервал времени. В первом случае отправитель возьмет у сетевого уровня следующий пакет и положит его в буфер, поверх старого пакета. Кроме того, он увеличит порядковый номер кадра. Если же прибудет поврежденный кадр подтверждения или время истечет, то ни буфер, ни номер не будут изменены, и будет послан дубликат кадра. В любом случае затем отправляется содержимое буфера (либо следующий пакет, либо дубликат предыдущего).
Когда неповрежденный кадр прибывает к получателю, проверяется его номер. Если это не дубликат, то кадр принимается и передается сетевому уровню, после чего формируется подтверждение. Дубликаты и поврежденные кадры на сетевой уровень не передаются, но при их получении подтверждается прибытие последнего правильного кадра, благодаря чему отправитель понимает, что нужно перейти к следующему кадру или повторить пересылку поврежденного.
3.4. Протоколы скользящего окна