Сергеев Александр
Шрифт:
Следует подробнее рассмотреть процесс повторной передачи данных. Сначала экземпляр протокола TCP формирует сегмент данных, помещает его в дейтаграмму и отправляет ее компьютеру-получателю. По истечении времени задержки выполняется повторная передача сегмента данных, но уже в составе другой дейтаграммы. Поскольку в обеих дейтаграммах содержатся одни и те же данные, отправитель не может определить, в какой из дейтаграмм (исходной или повторной) содержится полученный сигнал подтверждения приема данных. Здесь возникает проблема неоднозначности сигналов подтверждения приема данных. Рано или поздно сигнал подтверждения приема будет получен, даже если для этого потребуется выполнить одну или несколько повторных передач сегмента данных. В результате экземпляр протокола TCP оценит полное время доставки сегмента относительно времени его первоначальной посылки и на основе этого большого значения вычислит новое значение коэффициента RTT. Таким образом, по сравнению с прежним значением, новое значение коэффициента RTT вырастет незначительно. В следующий раз, когда экземпляр протокола TCP будет отправлять сегмент данных получателю, увеличенное значение коэффициента RTT приведет к заметному увеличению тайм-аута, относящегося к подтверждению приема. Поэтому, если сигнал подтверждения приема данных будет получен также после одной или нескольких повторных передач сегмента данных, полное время доставки сегмента будет еще больше.
Нельзя также соотносить сигнал подтверждения приема со временем самой последней повторной передачи сегмента. Если внезапно возрастет полное время доставки сегмента, то ситуация изменится. При отправке сегмента экземпляром протокола TCP для вычисления времени тайм-аута будет использоваться прежнее невысокое значение предполагаемого полного времени доставки пакета. Предположим, что после успешной доставки сегмента получателю, отправителю был послан сигнал подтверждения приема. Однако из-за перегрузок в сети сигнал подтверждения приема не будет получен до истечения значения таймера. В этом случае модуль протокола TCP выполнит повторную передачу сегмента. Вскоре после этого отправитель получит первый сигнал подтверждения приема и соотнесет его с моментом последней повторной передачи. Оцененное полное время доставки пакета будет небольшим, что приведет к незначительному снижению значения предполагаемого полного времени доставки пакета. К сожалению, уменьшение значения коэффициента RTT приведет к тому, что для передачи следующего сегмента данных экземпляр протокола TCP выберет малое значение тайм-аута.
Впрочем, в конечном итоге значение предполагаемого полного времени доставки пакета стабилизируется. Проведенные исследования показали, что в тех реализациях протокола TCP, где сигналы подтверждения приема соотносятся с моментом последней повторной передачи сегмента, стабильное значение RTT немного меньше половины корректного значения полного времени доставки. Следовательно, при отсутствии потерь сегментов в сети, модуль протокола TCP будет два раза посылать один и тот же сегмент получателю.
В предыдущем разделе шла речь о том, что независимо от того, к какому из моментов времени будет соотнесен полученный сигнал подтверждения приема, оценка полного времени доставки пакета будет неточной. Как же быть в этом случае? Ответ на этот вопрос очень прост. Экземпляр протокола TCP в этом случае не будет повторно подсчитывать значение предполагаемого полного времени доставки пакета на основе данных, полученных при повторной передаче сегмента. Величина предполагаемого полного времени доставки пакета (алгоритм Карна) вычисляется исключительно на основании данных, полученных для однозначных сигналов подтверждения приема.
Теперь стоит рассмотреть ситуацию, которая возникнет, если в момент отправки сегмента данных экземпляром протокола TCP резко увеличится время задержки в сети. Значение тайм-аута вычисляется на основании текущего значения предполагаемого полного времени доставки пакета. Для больших задержек в сети вычисленное значение тайм-аута будет незначительным. Это приведет к повторной передаче сегмента данных. Таким образом, если игнорировать сигналы подтверждения приема для повторно переданных сегментов, новое значение предполагаемого полного времени доставки пакета никогда не изменится, и описанный выше процесс будет продолжаться до тех пор, пока не уменьшится время задержки.
Чтобы устранить подобные недостатки, в алгоритме Карна используется метод коррекции значения тайм-аута (так называемый «откат таймера»). Его суть заключается в том, что начальное значение тайм-аута вычисляется на основании текущих данных. Но если в результате истечения тайм-аута произойдет повторная передача сегмента, то экземпляр протокола TCP увеличит значение тайм-аута. На практике каждый раз перед повторной передачей сегмента модуль протокола TCP увеличивает значение тайм-аута. Чтобы не допустить бесконтрольного увеличения тайм-аута, в большинстве его реализаций имеет место максимально возможное значение, которое всегда больше максимально возможной задержки передачи пакета по любому из маршрутов, проложенных в локальной сети.
Алгоритм вычисления нового значения тайм-аута зависит от конкретной реализации протокола TCP. В большинстве реализаций протокола эта величина вычисляется путем умножения прежнего значения тайм-аута на специальный корректирующий множитель. Обычно величина этого множителя выбирается равной двум. Если эта величина будет меньше двух, система может работать нестабильно.
Для того чтобы решить проблему вычисления постоянного предполагаемого полного времени доставки пакета, в алгоритме Карна используется методика принудительного изменения тайм-аута. При вычислении предполагаемого полного времени доставки пакета игнорируются результаты замеров, относящихся к повторно отправленным сегментам. В целях определения точного времени доставки пакетов в алгоритме Карна используется метод приращения значения тайм-аута при повторной передаче сегмента данных. Учитывая все выше сказанное, можно отметить, что в случае возникновения больших задержек в сети алгоритм Карна позволяет разделить вычисление текущего значения тайм-аута и определение предполагаемого полного времени доставки пакета.
Предполагаемое значение полного времени доставки используется только для вычисления начального значения тайм-аута. При каждой повторной передаче сегмента данных значение тайм-аута увеличивается на некоторую величину до тех пор, пока этот сегмент не будет успешно доставлен получателю. Таким образом, при отправке последовательности сегментов используется значение тайм-аута, полученное в результате принудительной коррекции значения таймера. Это происходит до тех пор, пока не будет получен сигнал подтверждения приема, соответствующий однократно посланному сегменту данных. После этого экземпляр протокола TCP, основываясь на выполненном замере, пересчитывает предполагаемое значение полного времени доставки и соответствующим образом изменяет значение тайм-аута. Как показывает практика, алгоритм Карна идеален для применения в тех сетях, где потери данных весьма велики.