Порядковые номера в окне отправителя соответствуют кадрам, которые уже отправлены, но на которые еще не получены подтверждения. Получаемому от сетевого уровня пакету дается наибольший порядковый номер, и верхняя граница окна увеличивается на единицу. Когда поступает подтверждение, на единицу возрастает нижняя граница окна. Таким образом, окно постоянно содержит список неподтвержденных кадров.
Так как кадры, находящиеся в окне отправителя, могут быть потеряны или повреждены во время передачи, отправитель должен хранить их в памяти на случай возможной повторной передачи. Таким образом, если максимальный размер окна равен
Окно принимающего канального уровня соответствует кадрам, которые он может принять. Любой кадр, попадающий в окно, помещается в буфер получателя. Когда прибывает кадр с порядковым номером, соответствующим нижнему краю окна, он передается на сетевой уровень, и окно сдвигается на одну позицию. Любой кадр, не попадающий в окно, удаляется. В любом случае формируется подтверждение, для того чтобы отправитель мог понять, как ему действовать дальше. Обратите внимание, что окно единичного размера говорит о том, что канальный уровень может принимать кадры только в установленном порядке, однако при больших размерах окна это не так. Сетевому уровню, напротив, данные всегда предоставляются в строгом порядке, независимо от размера окна уровня передачи данных.
На рис. 3.11 показан пример для окна с максимальным размером 1. Вначале кадров в окне нет, поэтому само окно пустое и его верхний и нижний края совпадают, однако с течением времени ситуация меняется. В отличие от окна отправителя, окно получателя всегда сохраняет первоначальный размер, поворачиваясь по мере приема и передачи на сетевой уровень очередного кадра.
Рис. 3.11. Скользящее окно размера 1 с 3-битовым порядковым номером:
3.4.1. Протокол однобитового скользящего окна
Прежде чем рассматривать общий случай, изучим протокол скользящего окна с максимальным размером окна, равным 1. Такой протокол использует метод ожидания, поскольку, отослав кадр, отправитель, прежде чем послать следующий кадр, должен дождаться подтверждения.
Данный протокол приведен в листинге 3.5. Как и другие протоколы, он начинается с определения некоторых переменных. Переменная next_frame_to_send содержит номер кадра, который отправитель пытается послать. Аналогично переменная frame_expected хранит номер кадра, ожидаемого получателем. В обоих случаях, возможными значениями могут быть только 0 и 1.
Листинг 3.5. 1-битовый протокол скользящего окна
Листинг 3.5
В нормальной ситуации только один канальный уровень может начинать передачу. Другими словами, только одна из программ должна содержать обращения к процедурам to_physical_layer и start_timer вне основного цикла. Начинающая машина получает первый пакет от своего сетевого уровня, создает из него кадр и посылает его.
Когда этот (или другой) кадр прибывает, получающий канальный уровень проверяет, не является ли этот кадр дубликатом, аналогично протоколу 3. Если это тот кадр, который ожидался, он передается сетевому уровню, и окно получателя сдвигается вверх.
Поле подтверждения содержит номер последнего полученного без ошибок кадра. Если этот номер совпадает с номером кадра, который пытается передать отправитель, последний понимает, что этот кадр успешно принят получателем и что он может пересылать следующий кадр. В противном случае он должен продолжать попытки переслать тот же кадр.
Теперь давайте изучим протокол 4 и посмотрим, насколько он устойчив к нестандартным ситуациям. Предположим, что машина
Когда первый неповрежденный кадр прибудет на машину