Таким образом, реализовав функции нумерации сегментов данных и подтверждения приемником принятых сегментов, возможно добиться гарантированной доставки информации между транспортными уровнями источника и приемника при использовании ненадежного канала. Однако, как быть, если источник не получает подтверждение о приеме посланных сегментов TCP? Сегмент АСК для посланных сегментов данных может отсутствовать по следующим причинам: е сегменты данных могли быть потеряны;
• сегмент подтверждения АСК мог быть потерян;
• если нагрузка в сети высокая, то, вероятно, источник должен ждать еще некоторое время, чтобы сегменты данных или сегмент АСК поступил к адресату.
Сколько времени должен ждать источник для получения сегмента подтверждения АСК? Очевидно, что на стороне источника необходимо при посылке сегмента инициализировать таймер, по истечении которого, вероятно, необходимо повторить посылку сегментов, для которых не было получено подтверждение о доставке. Значение величины таймера должно быть больше, чем «время оборота сегмента TCP «из-конца-в-конец» (далее RTT - round trip time). В случае невыполнения этого условия повторных посылок уже посланных сегментов не избежать. Следует учитывать, что значение таймера не должно существенно превышать RTT, иначе в случаях, когда повторная передача действительно необходима, источник будет ждать неоправданно много времени. Существует ряд алгоритмов определения значения RTT, однако па практике, как правило, используется определенный в [Jacobson88] и рассмотренный ниже.
Очевидно, что значение ИЛТ зависит от многих факторов, среди которых стоит отметить структуру сети и текущую нагрузку. Для вычисления ИЛТ рекомендовано осуществлять практическую оценку состояния сети.
Введем параметр образца 11ТТ затр1ектт, значение которого равно разности времени отправки сегмента данных (момент передачи сегмента нижнему уровню) и времени получения сегмента подтверждения АСК. Каждая пара «сегмент данных - сегмент АСК» имеет собственное значение затр1ектт. В связи с тем, что состояние сети изменяется динамически и достаточно быстро, для вычисления среднего значения ЮТ Ез 1::1та1есШТТ необходимо обладать достаточной статистикой. Протокол ТСР в процессе функционирования для каждого соединения динамически вычисляет значение Ез1::1та1ес1КТТ, учитывая sair.pl.eRTT каждого нового сегмента по следующей формуле: ЕБ^таЬсаКТТ - ( 1 - х ) * ЕБ^п^есИПТ + х * эа1пр1еКТТ, т.е. новое значение ЕзИп^есШТТ вычисляется как взвешенная комбинация предыдущего значения Ез^п^есАКТТ и нового значения затр1ектт. Значение параметра х рекомендовано устанавливать в 0,125. Таким образом, формула приобретает следующий вид: ЕБ^п^есЗКТТ = 0.875 * ЕБ^п^есШТТ + 0.125 * затр1еКТТ.
Таким образом, новое значение Езгл-к^есШТТ учитывает предыдущее значение Еэ1;:1гг^ес1КТТ и последнее значение затр1еКТТ. Причем последнее значение затр1еКТТ имеет влияние на Езгл-гг^ес^ТТ большее, нежели старые, причиной этого служит то, что последнее значение затр1еКТТ отражает текущее состояние сети, что необходимо «знать» протоколу ТСР при установке значения таймера. На рис. 1.7 представлены графики значений параметров ЕБ^тагесШТТ И затр1еКТТ, измеренные на реальной сети [КигозеОЗ]. Как видно, функция поведения параметра Ез1л.та1ес1КТТ является сглаженной по отношению к функции поведения параметра загг,р1еКТТ.
Рис. 1.7. Графики значений параметров EstimatedRTT и ватр/еРТТ, измеренные на реальной сети Как было отмечено ранее, значение размера таймера должно быть больше, чем RTT, но не намного, причем желательно, чтобы ошибочная повторная передача, т.е. до прибытия корректного сегмента АСК, осуществлялась редко. Учитывая все вышеприведенные аргументы, очевидно предположить, что значение таймера должно незначительно превышать текущее значение параметра EstimatedRTT. Обозначим через переменную margin разность между значением таймера (параметр RTO - Roundtrip TimeOut) и значением EstimatedRTT, т.е.
RTO = EstimatedRTT > margin.
Очевидно, что значение переменной margin должно зависеть от последнего значения параметра sampleRTT, т.е. должно учитывать отклонение значения sampleRTT от EstimatedRTT, которое обозначим че-рез DeviationRTT. TCP использует следующую формулу для вычисления значения таймера:
RTO - EstimatedRTT t- 4 * DeviationRTT, где
DeviationRTT = (1 - х) * DeviationRTT t x * ; sampleRTT - EstimatedRTT ! .
Таким образом, если отклонение значения sampleRTT от EstimatedRTT велико, то значение параметра RTO существенно выше чем EstimatedRTT, и, соответственно, наоборот, если значение DeviationRTT мало, то значение параметра RTO несущественно выше, чем EstimatedRTT. Заинтересованный читатель найдет достаточно много интересной информации, включая примеры, в Интернет по адресу [TCPwwwJ.
⇐Посылка и нумерация сегментов подтверждения аск | Управление трафиком и качество обслужевания в сети | Протокол go-back-n⇒