4.4. Завершение отсчета таймера обратной связи
В этом параграфе описано поведение отправителя при завершении отсчета таймера обратной связи. Отсчет этого таймера может завершиться в результате продолжительного бездействия или по причине отбрасывания пакетов обратной связи в сети.
В этом параграфе используется переменная recover_rate. Если отправитель TFRC бездействует с момента запуска таймера обратной связи, допустимая скорость передачи не устанавливается ниже recover_rate. В этой спецификации для recover_rate устанавливается значение initial_rate (см. параграф 4.2). В будущих вариантах спецификации могут быть заданы другие значения recover_rate.
При завершении отсчета таймера обратной связи отправитель должен:
Снизить дозволенную скорость передачи вдвое.
Если в момент завершения отсчета таймера у отправителя имелось хотя бы одно измерение RTT, допустимая скорость передачи снижается путем изменения X_recv_set в соответствии с приведенным ниже псевдокодом (включая п. 2)). В общем случае скорость передачи ограничена значением не более двух X_recv. Изменение X_recv_set ограничивает скорость передачи, но позволяет отправителю выполнять процедуру замедленного старта с удвоением скорости передачи в каждый период RTT, если пакеты обратной связи не говорят о потерях.
Если отправитель бездействовал с момента запуска таймера обратной связи и X_recv < recover_rate, дозволенная скорость передачи не снижается вдвое и X_recv_set не меняется. Это предотвращает снижение дозволенной скорости до значений меньше половины recover_rate в результате бездействия.
В общем случае допустимая скорость передачи снижается вдвое в ответ на завершение отсчета таймера обратной связи. Детали приведенного ниже псевдокода зависят от состояния отправителя - процесс замедленного старта, предотвращение перегрузки с ограничением по X_recv или предотвращение перегрузки с ограничением на основе уравнения пропускной способности.
X_recv = max (X_recv_set); If (у отправителя нет значения RTT, не было получено пакетов обратной связи и не наблюдалось бездействия с момента запуска таймера обратной связи) { // У отправителя пока нет значений X_Bps и recover_rate. // Дозволенная скорость снижается вдвое. X = max(X/2, s/t_mbi); } Else if (((p>0 && X_recv < recover_rate) or (p==0 && X < 2 * recover_rate)) и отправитель бездействовал с момента запуска таймера обратной связи) { // Не снижать вдвое дозволенную скорость передачи. Ничего не делать } Else if (p==0) { // Еще нет значения X_Bps. // Снизить вдвое дозволенную скорость передачи. X = max(X/2, s/t_mbi); } Else if (X_Bps > 2*X_recv)) { // Значение 2*X_recv уже ограничивает скорость передачи. // Снизить вдвое дозволенную скорость передачи. Update_Limits(X_recv;) } Else { // Скорость передачи ограничена X_Bps, а не X_recv. // Снизить вдвое дозволенную скорость передачи. Update_Limits(X_Bps/2); }
Значение s/t_mbi ограничивает снижение скорости (по крайней мере 1 пакет за 64 секунды).
Процедура Update_Limits() использует переменную timer_limit для ограничения скорости передачи, рассчитанной по завершению отсчета таймера обратной связи, как показано ниже:
Update_Limits(timer_limit): If (timer_limit < s/t_mbi) timer_limit = s/t_mbi; Заменить содержимое X_recv_set одним элементом timer_limit/2; Пересчитать X в соответствии с п. 4) параграфа 4.3;
Запустить таймер обратной связи на max(4*R, 2*s/X) секунд.
Если отправитель ограничивал передачу, но не простаивал с момента запуска таймера обратной связи, возможно завершение отсчета таймера в результате потери пакетов обратной связи в сети. В таких случаях таймер обратной связи является механизмом детектирования таких потерь, подобно таймеру повтора передачи в TCP.
Отметим, что при остановке передачи данных отправителем, получатель прекращает передачу пакетов обратной связи. При завершении отсчета таймера обратной связи у отправителя последний может использовать описанную выше процедуру для ограничения скорости передачи. Если отправитель возобновляет передачу, для ограничения скорости будет использоваться X_recv_set и процедура замедленного старта, пока скорость передачи не достигнет значения X_Bps.
Снижение отправителем TFRC скорости передачи по таймеру обратной связи похоже на уменьшение размера окна насыщения TCP по истечении каждых RTO периода бездействия для TCP с поддержкой Congestion Window Validation [RFC2861].