Медленный старт

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Медленный старт — часть стратегии управления окном перегрузки (англ. congestion window) в TCP. Медленный старт используется совместно с другими алгоритмами для того, чтобы избежать отправки большего количества данных, чем сеть способна передать. Алгоритм определяется RFC 5681

Алгоритм[править | править код]

Медленный старт — один из алгоритмов, который TCP использует для контроля над нагрузкой сети. Иногда его ещё называют фазой экспоненциального роста.

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

Если происходит потеря, TCP предполагает что это связано с перегрузкой сети и принимает меры по сокращению нагрузки на сеть. Как только порог достигнут, TCP входит в фазу линейного роста (предотвращения перегрузки). В эту фазу окно увеличивается на один сегмент для каждого RTT. Это происходит до тех пор, пока не происходит потери пакета.

Хотя алгоритм и называется «медленный старт», размер его окна перегрузки растёт довольно энергично, гораздо энергичнее чем во время фазы линейного роста.[1] До того, как алгоритм медленного старта был добавлен в TCP, начальная фаза, направленная на предотвращение перегрузки, была намного быстрее.

Базовый медленный старт[править | править код]

Алгоритм начинается в экспоненциальной фазе роста, сначала с размером окна перегрузки (congestion window — CWND) 1, 2 или 10[2] сегментов и увеличивает его на один размер сегмента (segment size — SS) для каждого полученного ACK. Если приёмник посылает ACK для каждого сегмента, такое поведение эффективно удваивает размер окна после каждого цикла сети. Если приёмник поддерживает подтверждения с опозданием, темпы роста будут ниже, но всё равно рост окна будет увеличивается, как минимум, на один MSS каждого времени приёма-передачи. Такое поведение продолжается до тех пор, пока размер окна перегрузки (CWND) не достигнет размера объявленного окна приёмника или пока не произойдёт потеря.

Когда происходит потеря, половина текущего CWND сохраняется в виде порога медленного старта (SSThresh) и медленный старт начинается снова от своего первоначального CWND. Как только CWND достигает SSThresh, TCP переходит в режим предотвращения перегрузки, где каждый ACK увеличивает CWND на SS * SS / CWND. Это приводит к линейному увеличению CWND.

Быстрое восстановление[править | править код]

Существует вариация алгоритма медленного старта, известная как быстрое восстановление (Fast Recovery), которая использует быструю повторную передачу последующей фазой предотвращения перегрузки. В алгоритме быстрого восстановления, во избежание перегрузки, когда пакет (после 3 полученных подтверждений) не получен, размер окна перегрузки сводится к порогу медленного старта, а не к меньшему начальному значению.

Проблемы[править | править код]

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

Протокол медленного старта плохо подходит для короткоживущих соединений. Старые браузеры могут создавать много последовательных коротко живущих соединений с веб-сервером, и будет открывать и закрывать соединение для каждого запрашиваемого файла. Всё это держало большинство подключений в режиме медленного старта, в результате которых было большое время отклика. Чтобы избежать этой проблемы, современные браузеры либо открывают несколько соединений одновременно или повторно используют одно соединение для всех файлов, запрошенных с конкретного веб-сервера. Тем не менее, соединения не могут быть повторно использованы для множества сторонних серверов, используемых веб-сайтами для реализации веб-рекламы, общих функций социальных сетей,[3] сценариев веб-аналитики.

Ссылки[править | править код]

  1. Jacobson, Van; Karels, M. J. Congestion avoidance and control (неопр.) // ACM SIGCOMM Computer Communication Review. — 1988. — Т. 18, № 4. — С. 314—329. Архивировано 22 июня 2004 года. Архивированная копия. Дата обращения: 29 мая 2013. Архивировано из оригинала 22 июня 2004 года.
  2. Corbet, Jonathan Increasing the TCP initial congestion window. LWN. Дата обращения: 10 октября 2012. Архивировано 22 ноября 2018 года.
  3. Nick O'Neill. "What's Making Your Site Go Slow? Could Be The Like Button Архивная копия от 18 августа 2014 на Wayback Machine". AllFacebook, November 10, 2010. Retrieved on September 12, 2012.