5.2. Преобразование истории потерь в факты потерь
TFRC требует устойчивости к нескольким последовательным потерям пакетов или приему маркированных пакетов, когда эти события относятся к одному факту потери. Это похоже на поведение протокола TCP, который (обычно) лишь однократно за период RTT уменьшает наполовину окно насыщения. Таким образом, получатель должен отобразить историю потери пакетов в запись о факте потери, трактуя как факт потери утрату одного или более пакетов или прием маркированных одного или более пакетов в течение периода RTT. Для выполнения такого отображения получателю нужно знать значение RTT, которое обычно периодически сообщается отправителем в форме управляющей информации, присоединяемой в конце пакета данных. Для TFRC способ передачи результатов измерения RTT получателю не имеет значения, однако рекомендуется использовать для этого рассчитанное отправителем значение RTT (R в параграфе 4.3).
Для того, чтобы определить, относится потеря или маркированный пакет к новому факту потери или является продолжением существующего, нужно сравнить порядковые номера и временные метки пакетов, принятых получателем. Для маркированного пакета S_new время приема T_new можно определить напрямую. Для потерянного пакета нужно использовать интерполяцию, чтобы определить номинальное «время прибытия». Предположим, что:
- S_loss — порядковый номер потерянного пакета;
- S_before — порядковый номер последнего пакета, прибывшего с номером меньше S_loss прежде любого пакета с номером, превышающим S_loss;
- S_after — порядковый номер первого пакета, прибывшего с после пакета S_before, с порядковым номером больше S_loss;
- S_max — наибольший порядковый номер.
Следовательно, S_before < S_loss < S_after <= S_max.
- T_loss — номинальное время, когда должен был прибыть потерянный пакет;
- T_before — время приема пакета S_before;
- T_after — время прибытия пакета S_after.
Отметим, что T_before < T_after.
Для потерянного пакета S_loss можно интерполировать номинальное «время прибытия» на основе времени прибытия пакетов S_before и S_after:
T_loss = T_before + ((T_after — T_before) * (S_loss - S_before)/(S_after - S_before))
Для случая перехода порядковых номеров через максимальное значение (0), предположим, что S_MAX = 2^b, где b — размер принятого в реализации поля порядковых номеров в битах. В этом случае мы можем интерполировать время прибытия T_loss следующим образом:
T_loss = T_before + (T_after — T_before) * Dist(S_loss, S_before)/Dist(S_after, S_before)
где
Dist(S_A, S_B) = (S_A + S_MAX - S_B) % S_MAX
Если было определено, что потеря пакета S_old явилась началом предыдущего факта потери и мы детектировали потерю пакета S_new, можно интерполировать номинальное время прибытия пакетов S_old и S_new (T_old и T_new, соответственно).
Если T_old + R >= T_new, потеря пакета S_new относится к текущему факту потерь. В противном случае S_new относится к новому факту потери.