4.3. Поведение отправителя при получении пакета обратной связи
Отправитель знает текущее значение допустимой скорости передачи X и поддерживает оценку текущего времени кругового обхода R. Отправитель также поддерживает параметр X_recv_set, включающий несколько недавних значений X_recv (обычно два).
Инициализация.X_recv_set инициализируется одним значением Infinity. Возможна инициализация X_recv_set взамен Infinity достаточно большим числом (например, наибольшим целым числом в системе).
При получении отправителем пакета обратной связи в момент t_now (текущее время в секундах) должны быть выполнены следующие операции.
Расчет нового значения периода кругового обхода по формуле:
R_sample = (t_now - t_recvdata) - t_delay.
Как было указано в параграфе 3.2.2, значение t_delay показывает время, затраченное на приемной стороне.
Обновление оценки времени кругового обхода:
If no feedback has been received before { R = R_sample; } Else { R = q*R + (1-q)*R_sample; }
Точное значение постоянной q не имеет существенного значения для TFRC, но по умолчанию рекомендуется использовать значение 0,9.
Обновление значения тайм-аута:
RTO = max(4*R, 2*s/X)
Обновление значения допустимой скорости передачи с использованием переменных t_mbi и recv_limit:
- t_mbi — максимальный интервал снижения скорости 64 секунды.
- recv_limit — предельное значение скорости передачи, рассчитанной из X_recv_set.
Эта процедура также использует процедуры Maximize X_recv_set() и Update X_recv_set(), определенные ниже.
Псевдокод процедуры обновления значения допустимой скорости имеет вид:
If (если весь интервал, закрываемый пакетом обратной связи, характеризуется ограниченной передаче данных)) { If (пакет обратной связи говорит о новом факте потерь или росте частоты потерь p) { уменьшить вдвое элементы X_recv_set; X_recv = 0.85 * X_recv; Maximize X_recv_set(); recv_limit = max (X_recv_set); } Else { Maximize X_recv_set(); recv_limit = 2 * max (X_recv_set); } } Else { // типичное поведение Update X_recv_set(); recv_limit = 2 * max (X_recv_set); } If (p > 0) { // фаза предотвращения перегрузки рассчитать X_Bps с использованием уравнения пропускной способности TCP X = max(min(X_Bps, recv_limit), s/t_mbi); } Else if (t_now - tld >= R) { // начальная процедура замедленного старта X = max(min(2*X, recv_limit), initial_rate); tld = t_now; }
При использовании механизма подавления осцилляций рассчитывается мгновенная скорость передачи X_inst в соответствии с параграфом 4.5
Таймер обратной связи сбрасывается и устанавливается на RTO секунд.
Процедура максимизации X_recv_set сохраняет наибольший элемент X_recv_set и новое значение X_recv:
Maximize X_recv_set(): добавить X_recv к X_recv_set; удалить начальное значение Infinity из X_recv_set, если оно еще не удалено; установить текущее время в качестве временной метки наибольшего элемента; удалить все элементы, кроме наибольшего.
Процедура обновления X_recv_set сохраняет набор значений X_recv с временными метками из двух последних периодов кругового обхода.
Update X_recv_set(): добавить X_recv к X_recv_set; Удалить из X_recv_set значения, не относящиеся к двум последним периодам RTT.