Протокол передачи команд и сообщений об ошибках (ICMP). Протоколы DCCP и TFRC
Учет предыстории
Как описано выше в разделе "Вычисление частоты потери пакетов", самому последнему интервалу потерь при оценке усредненного интервала потерь приписывается доля 1/(0.75 n). В этом разделе рассмотрен опционный механизм обесценивания предыдущих событий (history discounting), подробнее обсуждаемый в [3.3] и [3.9]. Этот механизм позволяет TFRCполучателю настроить веса, акцентируя внимания на весах событий потерь, произошедших относительно недавно. В этой версии самые последние интервалы потерь имеют более чем вдвое больший вес при вычислении усредненной длительности интервала потерь.
Чтобы ввести в действие этот механизм, определяем фактор обесценивания (дискаунт фактор) DF_i для каждого интервала потерь L_i, ( i > 0 ), где каждый фактор обесценивания является числом с плавающей запятой. Массив этих факторов содержит в себе историю обесценивания для каждого из интервалов потерь. В начале все значения DF_i массива приравниваются 1:
for (i = 1 to n) { DF_i = 1; }
Усредненный интервал потерь вычисляется с использованием n предшествующих интервалов потерь I_1, ..., I_n, и интервала I_0, который относится к пакетам, полученным после последнего события потери. Вычисление усредненного интервала потерь с помощью факторов обесценивания является простой модификацией процедуры, описанной в разделе "Вычисление частоты потери пакетов":
I_tot0 = I_0 * w_0
I_tot1 = 0;
W_tot0 = w_0
W_tot1 = 0;
for (i = 1 to n1) {
I_tot0 = I_tot0 + (I_i w_i DF_i DF);
W_tot0 = W_tot0 + w_i DF_i DF; }
for (i = 1 to n) { I_tot1 = I_tot1 + (I_i w_(i1) DF_i); W_tot1 = W_tot1 + w_(i1) DF_i; }
p = min(W_tot0/I_tot0, W_tot1/I_tot1);
Общий фактор обесценивания DF обновляется при получении каждого пакета. Сначала получатель вычисляет взвешенное среднее I_mean интервалов потерь I_1, ..., I_n:
I_tot = 0;
W_tot = 0;
for (i = 1 to n) { W_tot = W_tot + w_(i1) DF_i; I_tot = I_tot + (I_i w_(i1) DF_i); }
I_mean = I_tot / W_tot;
Это взвешенное среднее I_mean сравнивается с I_0, - числом пакетов, полученных с момента последнего события потерь. Если I_0 больше чем вдвое I_mean, тогда новый интервал потерь значительно больше предыдущих и общий фактор обесценивания DF обновляется, чтобы понизить относительный вес старых интервалов:
if (I_0 > 2 I_mean) {
DF = 2 I_mean/I_0;
if (DF < THRESHOLD)
DF = THRESHOLD;
} else
DF = 1;
Ненулевое значение THRESHOLD гарантирует, что более старые интервалы потери, относящиеся к предшествующему периоду высокой перегрузки, не будут обесценены вовсе. Рекомендуется установить THRESHOLD равным 0.5. Заметим, что с приходом каждого нового пакета, I_0 будет увеличиваться, а фактор обесценивания DF - обновляться.
Когда происходит новое событие потери, текущий интервал I_0 сдвигается на место I_1, интервал потери I_i занимает место I_(i+1), а интервал потерь I_n забывается. Предшествующий дискаунтфактор DF должен быть введен в дискаунт массив. Так как DF_i несет в себе дискаунтфактор, ассоциированный с интервалом потерь I_i, массив DF_i должен быть также сдвинут. Это делается следующим образом:
for (i = 1 to n) { DF_i = DF DF_i; }
for (i = n-1 to 0 step - 1) { DF_(i+1) = DF_i; }
I_0 = 1;
DF_0 = 1;
DF = 1;
Протокол получателя данных
Получатель периодически посылает сообщения обратной связи отправителю. Пакеты обратной связи должны посылаться, по крайней мере, один раз за RTT, если только отправитель не передает меньше одного пакета за RTT, в этом случае сообщения обратной связи должны посылаться после каждого получения информационного пакета. Пакет обратной связи следует также посылать всякий раз, когда детектируется новое событие потери, не дожидаясь конца RTT, и всякий раз, когда фиксируется нарушение порядка следования пакетов.
Если отправитель работает с высокой частотой (посылает много пакетов за RTT), существуют некоторые преимущества посылки сообщений обратной связи периодически, чаще одного раза за RTT, что позволяет быстрее реагировать на изменения результатов измерения RTT и обеспечить большую устойчивость к потере пакетов обратной связи. Однако, нет никакого смысла посылать много пакетов обратной связи за время RTT.
Поведение получателя при получении информационного пакета
Когда приходит информационный пакет, получатель выполняет следующие действия.
- Добавление пакета в историю доставки пакетов (packet history).
- Пусть предыдущее значение p равно p_prev. Вычисляется новое значение p, как это описано в разделе "Протокол отправителя данных".
- Если p > p_prev, происходит истечение времени таймера обратной связи и выполняются действия, описанные в разделе "Протокол отправителя данных".
Если p <= p_prev, не нужно предпринимать никаких действий. Однако при оптимизации может проверяться, происходит ли при получении пакета заполнение пробела в истории поступления, при котором два события потери сливаются в одно. Если произошло именно это, получатель может также послать сообщение обратной связи немедленно. Влияние такой оптимизации в нормальной ситуации является незначительным.
Истечение времени таймера обратной связи
Когда время таймера обратной связи истекает, необходимые действия зависят от того, был ли получен информационный пакет со времени отправки последнего сообщения обратной связи.
Пусть максимальный порядковый номер пакета для получателя равен S_m, а значение RTT, измеренное с учетом S_m, равно R_m. Если были получены информационные пакеты с момента посылки предыдущего сообщения обратной связи, получатель выполняет следующие действия.
- Вычисляется средняя частота событий потери.
- Вычисляется частота поступления пакетов X_recv, на основе полученных пакетов за время предыдущих R_m секунд.
- Формируется и отправляется пакет обратной связи, содержащий информацию, которая описана в разделе "Содержимое пакетов".
- Перезапускается таймер обратной связи на время R_m секунд.
Если с момента посылки сообщения обратной связи не получено никаких информационных пакетов, тo пакет обратной связи не посылается, а таймер обратной связи перезапускается на время R_m секунд.
Инициализация получателя
Получатель инициализируется первым пакетом, который к нему приходит. Пусть порядковый номер пакета равен i.
Когда первый пакет получен:
- установим p=0 ;
- установим X_recv = 0 ;
- подготовим и пошлем пакет обратной связи;
- установим таймер feedback на время R_i секунд.
Инициализация истории потерь после первого потерянного сегмента
Пакеты вплоть до первой потери не могут быть задействованы для вычисления скорости передачи, так как темп передачи в это время меняется слишком быстро. TFRC предполагает, что правильное значение скорости передачи данных после первой потери равно половине скорости передачи, при которой произошла потеря. TFRC аппроксимирует эту величину с помощью X_recv, частотой приема за последний период RTT. После первой потери TFRC получатель вычисляет интервал потери, который был бы необходим, чтобы обеспечить скорость передачи данных X_recv, и использует этот искусственный интервал потери для запуска механизма предыстории потерь.
В протоколе TFRC это делается путем нахождения некоторого значения p, для которого выражение пропускной способности из раздела "Уравнение пропускной способности TCP" дает величину пропускной способности в пределах 5% от X_recv, заданный текущий размер пакета s и RTT R. Первый интервал потерь устанавливается тогда равным 1/p.
Варианты протокола, базирующиеся на отправителе
Вполне возможно реализовать вариант TFRC, базирующийся на модели отправителя, где получатель использует надежную доставку для посылки отправителю данных о потерях пакетов, а отправитель вычисляет частоту потерь и приемлемую скорость посылки пакетов. Однако эта модель здесь не рассматривается.
Главным преимуществом модели TFRC, базирующейся на отправителе, является то, что отправитель в этом случае не должен доверять расчетам потерь, выполненным получателем. Однако в условиях требований надежной доставки данных о потерях от получателя отправителю модель TFRC, базирующаяся на модели отправителя, предъявляет более жесткие ограничения к транспортному протоколу.
Напротив, модель TFRC, базирующаяся на получателе, устойчива к потере пакетов обратной связи и, следовательно, не требует надежной доставки пакетов обратной связи. Эта модель также лучше годится для таких приложений, как потоковое мультимедиа для WEBсерверов, где обычно желательно перенести часть нагрузки с сервера на клиента.
Реализации
В данном разделе специфицируется реализации механизма управления перегрузкой TFRC, для приложений и транспортных протоколов.
Для t_RTO = 4 R и b = 1 выражение пропускной способности в разделе "Уравнение пропускной способности TCP" может быть преобразовано к виду:
Для .
Для вычисления функции f(p) могут использоваться lookup-таблицы.
Заметим, что опционный механизм подавления осцилляций для отправителя, описанный в разделе "Предотвращение осцилляций", использует вычисление квадратных корней.
Вычисление среднего значения интервала потерь в разделе "Интервал между случаями потери пакетов" включает в себя умножения на веса w_0 - w_(n-1), которые для n=8 равны:
1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2.
С минимальной потерей гладкости можно использовать веса, которые являются степенью 2 или суммами степеней 2, напр.,
1.0, 1.0, 1.0, 1.0, 0.75, 0.5, 0.25, 0.25.
Опционный механизм "исторического дискаунтинга" используется для расчета усредненной частоты потерь. Механизм дискаунтинга включается, только когда приходится сталкиваться с достаточно протяженными периодами без потери пакетов. Для обеспечения более высокой эффективности работы дискаунтфакторы DF_i могут делаться равными целым степеням 2.