Протокол Go-back-N позволяет передатчику посылать несколько сегментов данных, обозначим их число через N (в протоколе TCP используется переменная cwnd), подряд, не дожидаясь прихода сегмента подтверждения АСК. Здесь необходимо сделать ремарку, что под передатчиком, в отличие от источника, здесь и далее будем понимать функцию протокола транспортного уровня TCP, ответственную непосредственно за посылку сегментов, а под ресивером, в отличие от приемника, соответственно, функцию протокола транспортного уровня TCP, ответственную непосредственно за прием сегментов TCP. Предположим, что все сегменты транспортного уровня пронумерованы в соответствии с правилами, изложенными выше. Рассмотрим буфер транспортного уровня передатчика, в котором находятся сегменты данных (рис. 1.8). Условно разобьем сегменты данных на четыре класса: посланные и подтвержденные, посланные и неподтвержденные, готовые к посылке, но непосланные и неготовые к посылке. Введем переменные, определяющие границы этих классов:
• base: номер самого старого посланного, но неподтвержденного сегмента;
• nextseqnum: номер первого готового к посылке, но непослан-ного сегмента (следующего сегмента, который будет послан).
Таким образом, теперь мы имеем возможность определить четыре интервала, каждый из которых соответствует своему классу сегментов. Номера из интервала [0, base] соответствует номерам сегментов, которые уже посланы и подтверждены, номера из интервала [base, nextseqnum-1 ] - номерам сегментов, которые посланы и не подтверждены, номера из интервала [nextseqnum, base+N-1] - номерам сегментов, которые могут быть посланы, и номера из интервала [base+N, оо] - сегментам, которые еще не готовы к посылке.
Рис. 1.8. Функционирование протокола Go-back-N на стороне передатчика Введем термин «окно», под которым будем подразумевать количество сегментов, обозначенное ранее через N1, которое передатчик может послать подряд, не дожидаясь прихода сегмента подтверждения АСК.
В процессе функционирования протокола окно сдвигается в сторону сегментов с большим порядковым номером. Поэтому далее переменную N будем называеть размером окна, а функции обработки окна - алгоритмом «скользящее окно» (sliding window).
Рассмотрим принципы функционирования протокола Go-back-N. Очевидно, что этот протокол должен быть реализован как в источнике (передатчик), так и в приемнике (ресивер). Передатчик и ресивер должны быть рассмотрены как отдельно, с точки зрения реализованных функций, так и совместно, как протокол.
На рис. 1.9 представлен конечный автомат передатчика рассматриваемого протокола. В табл. 1.2 приведены расшифровки примитивов и параметров, используемых на рис. 1.9. Существует три события, которые передатчик должен обрабатывать:
• событие «запрос сверху», выполняется функция send () : прикладной уровень извещает транспортный уровень о необходимости осуществления передачи данных и передает их ему. Передатчик проверяет состояние окна и количество отправленных, но неподтвержденных сегментов. Если окно не заполнено полностью, транспортный уровень формирует сегмент и передает его нижележащему сетевому уровню, при этом необходимым образом обновляются значения переменных и параметров протокола Go-back-N. Если окно заполнено полностью, то либо передатчик может возвратить данные верхнему уровню и известить его о занятости ресурсов транспортного уровня, либо, при возможности, буферизировать данные для последующей посылки. Также возможно реализовать функцию «семафора», когда транспортный уровень будет иметь возможность извещать прикладной уровень о доступности своих ресурсов, т.е. функция send () будет выполняться только когда окно полностью не заполнено;
• событие «получение сегмента подтверждения АСК», выполняется функция receive () : в протоколе Go-back-N может применяться как подтверждение индивидуально для каждого сегмента, так и стратегия совокупного подтверждения, т.е. когда посылкой сегмента АСК ресивер подтверждает корректный прием всех сегментов с порядковыми номерами вплоть до номера, указанного в сегменте подтверждения. Более подробно этот вопрос будет рассмотрен ниже в разделе, посвященном ресиверу;
• событие «истечение таймера», выполняется функция timeout: название протокола Go-back-N отражает функциональные особенности реализации его передатчика, связанные с потерянными сегментами и обработкой сегментов, поступивших с высокой задержкой. Предполагается, что для нужд протокола Go-back-N используется один таймер, до истечения которого должны быть подтверждены все посланные и еще неподтвержденные сегменты. Если же значение таймера истекло до получения сегмента подтверждения, то протокол принимает решение, что сегменты потеряны и осуществляет их повторную передачу. Возможные сценарии рассмотрены ниже.
Рис. 1.9. Конечный автомат для передатчика протокола Go-back-N
Далее рассмотрим принцип функционирования ресивера протокола Go-back-N. Если ресивер корректно (безошибочно и в правильном порядке) принимает сегмент с номером п от передатчика, то ресивер передает данные прикладному уровню и посылает сегмент подтверждения передатчику. В случае некорректного приема сегмента (с ошибками и/или в неправильном порядке), ресивер сбрасывает этот сегмент и посылает сегмент подтверждения АСК для последнего корректно принятого сегмента. Может показаться неразумным осуществление сброса, сегмента, пришедшего без ошибок, но в неправильном порядке, поэтому рассмотрим этот вопрос подробнее.
Пусть ресивер ожидает прихода сегмента с номером п, но поступает сегмент с номером п+1, и поступает без ошибок. В этом случае ресивер может сохранить (буферизировать) этот сегмент для того, чтобы после поступления сегмента номер п передать данные из обоих сегментов и правильной последовательности верхнему уровню. Однако, такая операция может быть полезна и эффективна в случае, если сегмент номер п просто задерживается.
Примитивы и переменные для конечных автоматов передатчика и ресивера Таблица 1.2
Примитив |
Функция |
send () |
Прикладной уровень инициирует передачу данных на транспортный уровень |
receive ( ) |
Сетевой уровень инициирует передачу данных на транспортный уровень |
r.c: corrupted () |
Проверка поступивших данных на наличие ошибок |
ce: ack number() |
Получение номера следующего ожидаемого ресивером сегмента из сегмвнта подтверждения |
send dowr.i) |
Передача сегмента данных или подтверждение транспортного уровня на сетевой |
make seg() |
Создание сегмента, который будет послан |
snd scq() |
Определение сегмента, который будет послан |
compute |
Вычисление некоторого параметра при помощи внешнего алгоритма |
refuse data() |
Отклонение данных (отказ от передачи) |
Переменная |
Значение |
rev seg |
Сегмент, поступающий на транспортный уровень с сетевого уровня |
base |
Параметр алгоритма «скользящее окно» |
next seq r.umcer |
Номер последующего сегмента |
start timer |
Запуск таймера |
stop timer |
Остановка таймера |
N |
Параметр алгоритма «скользящее окно» |
send seg |
Сегмент, передаваемый транспортным уровнем сетевому |
check sum. |
Контрольная сумма длины сегмента |
Если же сегмент номер п был потерян при передаче и в рассматриваемом примере используется принцип совокупного подтверждения, то ресивер должен будет буферизировать сегменты с номерами п+2, п+3 и г.д. Такая стратегия достаточно сложна и дорога с точки зрения реализации и необходимых ресурсов. Если же используется протокол Go-back-N, то сегмент номер п + 1 сбрасывается и посылается запрос на повторную передачу сегмента номер п. Такой алгоритм прост в реализации и не требует много ресурсов при функционировании.
Очевидно, что приемник, кроме параметров скользящего окна, должен управлять еще одной переменной expected_seq_number, значение которой будет соответствовать номеру сегмента, поступления которого ожидает ресивер. На рис. 1.10 представлен конечный автомат для ресивера протокола Go-back-N. В табл. 1.2 и 1.3 приведены расшифровки примитивов и параметров, используемых на рис. 1.10. Существует одно событие, которое ресивер должен обрабатывать: событие «запрос снизу», выполняется функция receive () : обработка сегментов, поступающих от передатчика.
Рис. 1.10. Конечный автомат для ресиаера протокола Go-back-N
Дополнительные примитивы и переменные для конечного автомата ресивера Таблица 1,3
Примитив |
Функция |
has seq number() |
Определение номера поступившего сегмента и сравнение с номером, содержащимся в переменной expected seq number |
extract () |
Выполнение функций транспортного уровня по извлечению данных прикладного уровня из поступившего сегмента |
de:iver () |
Передача данных из поступившего сегмента прикладному уровню |
Переменная |
Значение |
expected seq_nurr.beг |
Номер сегмента, поступление которого ожидает ресивер |
АСК |
Определение того, что сегмент является сегментом подтверждения |
Рассмотрим пример функционирования протокола Go-back-N для случая, когда размер окна равен четырем. Диаграмма обмена сообщениями приведена на рис. 1.11. Передатчик начинает осуществлять посылку сегментов ресиверу. По причине того, что размер окна равен четырем, передатчик может послать четыре сегмента без получения сегмента подтверждения, т.е. сегменты с номерами 0, 1, 2, 3, после чего передатчик должен ожидать прихода сегментов подтверждения. Пусть в рассматриваемом примере каждый отправленный сегмент должен быть подтвержден отдельным сегментом АСК. При последовательном поступлении сегментов АСК окно сдвигается, в связи с чем передатчик может послать последующие сегменты номер 4, 5 и т.д. Предположим, что сегмент номер 2 был потерян при передаче. В связи с этим сегменты 3, 4, 5 поступили в приемник вне очереди, т.е. они должны быть сброшены ресивером.
Таким образом, протокол Go-back-N обладает достаточно большим набором функций, позволяющих реализовать гарантированную передачу данных, среди которых: нумерация сегментов, алгоритм «скользящее окно», сегменты подтверждения АСК, таймер и вычисление контрольной суммы длины сегмента.
⇐Управление таймерами | Управление трафиком и качество обслужевания в сети | Протокол selective repeat⇒