RFC: 2001
Оригинал: TCP Slow Start, Congestion Avoidance, Fast Retransmit, and Fast Recovery Algorithms
Другие версии: RFC 2581
Категория: Предложенный стандарт
Дата публикации:
Автор:
Перевод: Николай Малых

RFC 2001, Страница 3 из 5

Congestion Avoidance

Насыщение может возникать в тех случаях, когда данные поступают из «толстой трубы» (например, скоростная ЛВС) и должны передаваться в узкополосный канал (медленная сеть WAN). Может возникать насыщение и в тех случаях, когда множество потоков приходят на маршрутизатор одновременно и производительности этого маршрутизатора не хватает для обслуживания всех потоков. Алгоритм предотвращения насыщения (Congestion avoidance) используется при потере пакетов. Описание алгоритма приведено в работе [2].

Алгоритм основан на допущении, что потери пакетов, связанные с их повреждением при передаче, весьма малы (менее 1%). Следовательно, причиной потери пакетов является насыщение где-то на пути между отправителем и получателем. Существует два индикатора потери пакетов - возникновение тайм-аутов и появление дубликатов ACK.

Алгоритмы congestion avoidance и slow start независимы один от другого и имеют разные цели. Однако при возникновении насыщения протокол TCP должен снизить скорость передачи пакетов в сеть и даже подключить алгоритм slow start для снижения размера окна насыщения. На практике эти алгоритмы обычно используются совместно.

Алгоритмы congestion avoidance и slow start требуют поддержки для каждого соединения двух переменных - cwnd (размер окна насыщения и ssthresh (порог slow start). Комбинация этих алгоритмов работает следующим образом:

  1. При инициализации соединения задается cwnd = 1 (сегмент) и ssthresh = 65535 (байтов)
  2. Модуль передачи протокола TCP никогда не передает в сеть число сегментов, превышающее минимальное из двух значений - cwnd и анонсируемый получателем размер окна.
  3. При возникновении насыщения (тайм-аут или появление дубликатов ACK) для переменной ssthresh устанавливается значение, соответствующее половине размера меньшего из окон (cwnd и анонсируемый получателем размер окна), но не менее размера одного сегмента. Кроме того, при наличии тайм-аутов для переменной cwnd устанавливается значение 1 (т. е., повторяется процедура slow start).
  4. При получении подтверждений от удаленной стороны значение cwnd увеличивается. Способ увеличения зависит от того, какой алгоритм будет использовать модуль TCP - slow start или congestion avoidance. Если cwnd <= ssthresh, TCP будет использовать алгоритм slow start, в остальных случаях - congestion avoidance. Процедура slow start продолжается, пока TCP находится в первой половине пути к насыщению (поскольку, на этапе 3 был установлен порог в половину размера окна, при котором возникло насыщение), а дальше начинает использоваться алгоритм предотвращения насыщения (congestion avoidance. Алгоритм slow start использует начальное значение cwnd = 1 и увеличивает размер окна насыщения на 1 при получении каждого пакета ACK. Как было отмечено выше, это ведет к экспоненциальному росту размера окна - передается сначала 1 сегмент, затем 2, 4 и т. д. Алгоритм congestion avoidance задает для окна cwnd увеличение на segsize*segsize/cwnd при получении каждого пакета ACK (segsize - размер сегмента, а значение cwnd пересчитано в байты).
    Такая процедура обеспечивает линейный рост cwnd в отличие от экспоненциального роста в slow start. Размер cwnd должен увеличиваться хотя бы на 1 сегмент в течение каждого периода кругового обхода (round-trip time - RTT), независимо от числа полученных в течение периода RTT подтверждений ACK, тогда как slow start увеличивает размер cwnd на количество принятых подтверждений.

Многие реализации некорректно используют увеличение размера окна насыщения на часть размера сегмента (обычно, на 1/8) в течение периода congestion avoidance. Это неправильно и такое поведение не будет эмулироваться в будущих версиях.

2007 - 2017 © Русские переводы RFC, IETF, ISOC.