8.2.1. Детектирование интервалов с ограниченной передачей данных
При получении пакета обратной связи отправитель проверяет, относится ли покрываемый пакетом интервал к периоду ограниченной передачи данных. В этом параграфе рассматривается один из возможных вариантов реализации этого.
Если все пакеты обратной связи содержат временную метку последнего принятого пакета, предположим, что t_new — это временная метка из данного пакета обратной связи. Поскольку все пакеты обратной связи покрывают интервал по крайней мере в один период кругового обхода, отправителю достаточно этой метки для того, чтобы определить наличие в интервале (t_old, t_new] времени с ограниченной передачей данных; если оценка времени кругового обхода отправителем составляет R, то в качестве t_old используется значение t_new — R (это оценка покрываемого пакетом обратной связи интервала, а не его точное определение, однако точность такой оценки вполне достаточна).
Ниже приведен псевдокод для проверки ограничения передачи данных в течение всего интервала, покрываемого пакетом обратной связи. Переменные NotLimited1 и NotLimited2 представляют время, когда отправитель не ограничивал передачу данных.
Инициализация:
NotLimited1 = NotLimited2 = t_new = t_next = 0; t_now = текущее время;
После передачи сегмента:
If (отправитель передал все, что ему было дозволено) { // отправитель не ограничивал передачу данных в этом интервале If NotLimited1 <= t_new // цель: NotLimited1 > t_new. NotLimited1 = t_now Else if (NotLimited2 <= t_next) // цель: NotLimited2 > t_next. NotLimited2 = t_now; }
При получении пакета обратной связи, если в этом интервале передача данных ограничена:
t_new = временная метка из пакета обратной связи t_old = t_new - R // локальная переменная t_next = t_now; If ((t_old < NotLimited1 <= t_new) or (t_old < NotLimited2 <= t_new)) отправитель не ограничивал передачу данных в этом интервале; Else отправитель ограничивал передачу данных в этом интервале. If (NotLimited1 <= t_new && NotLimited2 > t_new) NotLimited1 = NotLimited2;
Времена передачи указывают на отправку сегмента или сегментов нижележащему уровню.
В промежутке между пакетами обратной связи (t_old, t_new] дает интервал передачи по оценке покрываемый последним пакетом обратной связи, а t_next показывает время последнего периода кругового обхода после t_new. Предполагается, что следующий пакет обратной связи будет покрывать интервал (t_new, t_next], если получатель не передаст пакет обратной связи раньше в ответ на новый факт потери. Целью является сохранение в переменной NotLimited1 времени передачи без ограничений в интервале (t_new, t_next], если таковая происходила, а в переменной NotLimited2 — времени неограниченной передачи после t_next.
Если при получении пакета обратной связи одно из значений NotLimited1, NotLimited2 попадает в интервал, покрываемый данным пакетом, этот интервал считается интервалом передачи без ограничений (т. е., отправитель передавал данные без ограничения по крайней мере один раз в течение данного интервала). Если ни одно из значений NotLimited1, NotLimited2 не относится к интервалу, покрываемому пакетом обратной связи, предполагается, что отправитель ограничивал передачу данных в течение всего интервала.
Отметим, что эта процедура является эвристической и в некоторых случаях отправитель может некорректно определять наличие ограничений на передачу в течение интервала, покрываемого пакетом обратной связи. Эвристический подход не учитывает возможных осложнений, связанных с нарушением порядка доставки.