Выбрать главу

Например, если 1000 значений дали среднестатистическую величину в 170 единиц, но далее были замерены 50 значений со средним в 282, то текущее среднее будет:

170×1000/1050 + 282×50/1050 = 175

Более резонной будет величина сглаженного времени цикла (Smoothed Round-Trip Time — SRTT), которая учитывает приоритет более поздних значений:

Новое SRTT = (1 – α)×(старое SRTT) + α×Последнее значение цикла

Значение α находится между 0 и 1. Увеличение а приводит к большему влиянию текущего времени цикла на сглаженное среднее значение. Поскольку компьютеры быстро могут выполнять деление на степени числа 2, сдвигая двоичные числа направо, для α всегда выбирается значение (1/2)n (обычно 1/8), поэтому:

Новое SRTT = 7/8×старое SRTT + 1/8×Последнее время цикла

В таблице 10.2 показано, как формула для SRTT подстраивается под текущее значение SRTT в 230 единиц, когда изменение в сетевых условиях приводит к последовательному увеличению времени цикла (при условии, что не наступает тайм-аут). Значения в столбце 3 используются как значения столбца 1 для следующей строки таблицы (т.е. как старое SRTT).

Таблица 10.2 Вычисление сглаженного времени цикла

Старое SRTT Самое последнее RTT (7/8)×(старое SRTT) + (1/8)×(RTT)
230.00 294 238.00
238.00 264 241.25
241.25 340 253.59
253.59 246 252.64
252.64 201 246.19
246.19 340 257.92
257.92 272 259.68
259.68 311 266.10
266.10 282 268.09
268.09 246 265.33
265.33 304 270.16
270.16 308 274.89
274.89 230 269.28
269.28 328 276.62
276.62 266 275.29
275.29 257 273.00
273.00 305 277.00

Теперь возникает вопрос о выборе значения для тайм-аута повторной пересылки. Анализ величин времени цикла показывает существенное отклонение этих значений от текущей средней величины. Имеет смысл установить границу для величины отклонений (девиаций). Хорошие величины для тайм-аута повторной пересылки (в стандартах RFC эту величину именуют Retransmission TimeOut — RTO) дает следующая формула с ограничением сглаженного отклонения (SDEV):

Т = Тайм-аут повторной пересылки = SRTT + 2×SDEV

Именно эта формула рекомендована в RFC 1122. Однако некоторые реализации используют другую:

Т = SRTT + 4×SDEV

Для вычисления SDEV сначала определяют абсолютное значение текущего отклонения:

DEV = | Последнее время цикла – старое SRTT |

Затем используют формулу сглаживания, чтобы учесть последнее значение:

Новое SDEV = 3/4×старое SDEV + 1/4×DEV

Остается один вопрос — какие взять начальные значения? Рекомендуется:

Начальный тайм-аут = 3 с

Начальный SRTT = 0

Начальный SDEV = 1,5 с

Ван Джекобсон определил быстрый алгоритм, который очень эффективно вычисляет тайм-аут повторной пересылки данных.

10.13.6 Пример статистики

Насколько успешно будет работать вычисленный выше тайм-аут? При реализации полученного значения наблюдались значительные повышения производительности. Примером могут служить статистические данные команды netstat, полученные на системе tigger — сервере Интернета, к которому обращается множество хостов со всего мира.

tcp:

1301644 packets sent

 879137 data packets (226966295 bytes)

 21815 data packets (8100927 bytes) retransmitted

2012869 packets received

 762469 acks (for 226904227 bytes)

 35803 duplicate acks

 0 acks for unsent data

 1510769 packets (314955304 bytes) received in-sequence

 9006 completely duplicate packets (867042 bytes)

 74 packets with some dup. data (12193 bytes duped)

 13452 out-of-order packets (2515087 bytes)

Системой tigger были повторно переданы менее чем 2,5% сегментов данных TCP. Для полутора миллионов входящих сегментов данных (остальные являются чистыми сообщениями ACK) дублированы были только 0,6%. При этом следует учитывать, что уровень потерь во входных данных примерно соответствует уровню для выходных сегментов. Таким образом, бесполезный трафик повторной пересылки составляет около 0,6% от общего трафика.

10.13.7 Вычисления после повторной отправки

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

Алгоритм Керна предполагает, что в этом случае не следует изменять время цикла. Текущее сглаженное значение времени цикла и сглаженное отклонение сохраняют свои значения, пока не будет получено подтверждение на пересылку некоторого сегмента без его повторной отправки. С этого момента возобновляются вычисления на основе сохраненных величин и новых замеров.