RFC: 5348
Оригинал: TCP Friendly Rate Control (TFRC): Protocol Specification
Предыдущие версии: RFC 3448
Категория: Предложенный стандарт
Дата публикации:
Авторы: , , ,
Перевод: Николай Малых

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 не относится к интервалу, покрываемому пакетом обратной связи, предполагается, что отправитель ограничивал передачу данных в течение всего интервала.

Отметим, что эта процедура является эвристической и в некоторых случаях отправитель может некорректно определять наличие ограничений на передачу в течение интервала, покрываемого пакетом обратной связи. Эвристический подход не учитывает возможных осложнений, связанных с нарушением порядка доставки.

2007 - 2017 © Русские переводы RFC, IETF, ISOC.