Секретное оружие TCP: управление потоком данных в сети и управление перегрузкой сети.

Транспорт обеспечения надежности TCP
Всем нам знаком протокол TCP как надежный транспортный протокол, но как он обеспечивает надежность передачи данных?

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

Таким образом, TCP использует такие механизмы, как порядковый номер, подтверждение отправки, управление повторной отправкой, управление соединением и управление окном, для обеспечения надежной передачи.

В данной работе мы сосредоточимся на скользящем окне, управлении потоком и управлении перегрузкой в ​​протоколе TCP. Механизм повторной передачи рассматривается отдельно в следующем разделе.

Управление потоками в сети
Управление потоком данных в сети, или управление сетевым трафиком, на самом деле является проявлением тонкой взаимосвязи между производителями и потребителями. Вы, вероятно, часто сталкивались с этим сценарием на работе или на собеседованиях. Если возможности производителя по производству значительно превышают возможности потребителя по потреблению, это приведет к бесконечному росту очереди. В более серьезном случае, вы, возможно, знаете, что когда сообщения RabbitMQ накапливаются слишком сильно, это может привести к снижению производительности всего сервера MQ. То же самое верно и для TCP; если это не контролировать, в сеть будет поступать слишком много сообщений, и потребители превысят свою пропускную способность, в то время как производители будут продолжать отправлять дубликаты сообщений, что значительно повлияет на производительность сети.

Для решения этой проблемы TCP предоставляет механизм, позволяющий отправителю контролировать объем отправляемых данных в зависимости от фактической пропускной способности получателя, что известно как управление потоком. Получатель поддерживает окно приема, а отправитель — окно отправки. Следует отметить, что эти окна предназначены только для одного TCP-соединения, и не все соединения используют одно и то же окно.

TCP обеспечивает управление потоком данных с помощью переменной, обозначающей окно приема. Окно приема дает отправителю представление о том, сколько места в кэше еще доступно. Отправитель контролирует объем отправляемых данных в соответствии с фактической пропускной способностью получателя.

Принимающий хост уведомляет отправителя о размере данных, которые он может получить, и отправитель отправляет данные в пределах этого предела. Этот предел — размер окна, помните заголовок TCP? Существует поле «окно приема», которое используется для указания количества байтов, которые получатель может или готов получить.

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

Вот диаграмма управления потоком данных в сети:

Управление дорожным движением

Управление перегрузкой сети
Прежде чем рассматривать управление перегрузкой, необходимо понимать, что помимо окна приема и окна отправки существует также окно перегрузки, которое в основном используется для решения проблемы определения скорости начала отправки данных отправителем в окно приема. Таким образом, окно перегрузки также поддерживается отправителем TCP. Нам нужен алгоритм для определения оптимального объема отправляемых данных, поскольку отправка слишком малого или слишком большого объема данных не является оптимальной, отсюда и концепция окна перегрузки.

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

Когда сеть перегружена, если постоянно отправляется большое количество пакетов, это может вызвать такие проблемы, как задержки и потеря пакетов. В этом случае TCP повторно передаст данные, но повторная передача увеличит нагрузку на сеть, что приведет к еще большим задержкам и потере пакетов. Это может привести к порочному кругу, который будет только усугубляться.

Таким образом, TCP не может игнорировать происходящее в сети. Когда сеть перегружена, TCP жертвует собой, уменьшая объем передаваемых данных.

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

Что такое окно перегрузки? Какое отношение это имеет к окну отправки?

Окно перегрузки — это переменная состояния, поддерживаемая отправителем, которая определяет объем данных, которые отправитель может отправить. Окно перегрузки динамически изменяется в зависимости от уровня перегрузки сети.

Окно отправки — это согласованный между отправителем и получателем размер окна, указывающий объем данных, которые может получить получатель. Окно перегрузки и окно отправки связаны между собой; окно отправки обычно равно минимуму из окон перегрузки и приема, то есть swnd = min(cwnd, rwnd).

Значение параметра cwnd окна перегрузки изменяется следующим образом:

Если в сети нет перегрузки, то есть не возникает таймаут повторной передачи, окно перегрузки увеличивается.

При наличии перегрузки в сети, окно перегрузки уменьшается.

Отправитель определяет, перегружена ли сеть, наблюдая за тем, получен ли пакет подтверждения ACK в течение указанного времени. Если отправитель не получает пакет подтверждения ACK в течение указанного времени, считается, что сеть перегружена.

Помимо окна перегрузки, пришло время обсудить алгоритм управления перегрузкой TCP. Алгоритм управления перегрузкой TCP состоит из трех основных частей:

Медленный старт:Изначально окно перегрузки cwnd относительно невелико, и отправитель экспоненциально увеличивает окно перегрузки, чтобы быстро адаптироваться к пропускной способности сети.
Предотвращение заторов:После того как окно перегрузки превысит определенный порог, отправитель линейно увеличивает окно перегрузки, чтобы замедлить темп роста окна перегрузки и избежать перегрузки сети.
Быстрое восстановление:В случае возникновения перегрузки отправитель уменьшает окно перегрузки вдвое и переходит в состояние быстрого восстановления, чтобы определить местоположение восстановления сети на основе полученных дублирующих подтверждений, а затем продолжает увеличивать окно перегрузки.

Медленный старт
При установлении TCP-соединения начальное значение окна перегрузки cwnd устанавливается равным минимальному значению MSS (максимальный размер сегмента). Таким образом, начальная скорость отправки составляет примерно MSS/RTT байт/секунду. Фактическая доступная пропускная способность обычно намного больше, чем MSS/RTT, поэтому TCP стремится найти оптимальную скорость отправки, чего можно достичь с помощью медленного старта.

В процессе медленного старта значение окна перегрузки cwnd инициализируется значением 1 MSS, и каждый раз, когда подтверждается передача сегмента пакета, значение cwnd увеличивается на 1 MSS, то есть значение cwnd становится равным 2 MSS. После этого значение cwnd удваивается при каждой успешной передаче сегмента пакета, и так далее. Конкретный процесс роста показан на следующем рисунке.

 управление перегрузкой сети

Однако скорость отправки сообщений не может расти постоянно; рост должен когда-нибудь закончиться. Итак, когда же заканчивается увеличение скорости отправки сообщений? Медленный старт обычно прекращает увеличение скорости отправки сообщений одним из нескольких способов:

Первый способ — это случай потери пакетов во время процесса отправки в режиме медленного старта. При потере пакетов TCP устанавливает окно перегрузки отправителя cwnd равным 1 и перезапускает процесс медленного старта. В этом случае вводится понятие порога медленного старта ssthresh, начальное значение которого составляет половину значения cwnd, вызывающего потерю пакетов. То есть, при обнаружении перегрузки значение ssthresh равно половине значения окна.

Второй способ — это прямая корреляция со значением порогового значения медленного старта ssthresh. Поскольку значение ssthresh составляет половину значения окна при обнаружении перегрузки, при каждом удвоении cwnd может происходить потеря пакетов, если cwnd больше ssthresh. Поэтому лучше всего установить cwnd равным ssthresh, что заставит TCP переключиться в режим управления перегрузкой и завершить медленный старт.

Последний способ завершения медленного старта — это обнаружение трех избыточных подтверждений (ACK): TCP выполняет быструю повторную передачу и переходит в состояние восстановления. (Если неясно, почему появляются три пакета ACK, это будет объяснено отдельно в механизме повторной передачи.)

Предотвращение заторов
Когда TCP переходит в состояние управления перегрузкой, значение cwnd устанавливается равным половине порогового значения перегрузки ssthresh. Это означает, что значение cwnd не может удваиваться каждый раз при получении сегмента пакета. Вместо этого используется относительно консервативный подход, при котором значение cwnd увеличивается только на одно значение MSS (максимальная длина сегмента пакета) после завершения каждой передачи. Например, даже если подтверждено 10 сегментов пакета, значение cwnd увеличится только на одно значение MSS. Это линейная модель роста, и она также имеет верхнюю границу роста. При потере пакета значение cwnd изменяется на значение MSS, а значение ssthresh устанавливается равным половине значения cwnd. Или же рост MSS прекращается при получении 3 избыточных ответов ACK. Если после уменьшения значения cwnd вдвое по-прежнему получены три избыточных ответа ACK, значение ssthresh записывается как половина значения cwnd, и переходит в состояние быстрого восстановления.

Быстрое восстановление
В режиме быстрого восстановления значение окна перегрузки cwnd увеличивается на один MSS за каждое полученное избыточное подтверждение (ACK), то есть подтверждение, поступившее не последовательно. Это делается для того, чтобы использовать сегменты пакетов, успешно переданные в сети, и максимально повысить эффективность передачи.

Когда приходит подтверждение (ACK) потерянного сегмента пакета, TCP уменьшает значение cwnd и переходит в состояние предотвращения перегрузки. Это делается для контроля размера окна перегрузки и предотвращения дальнейшего увеличения сетевой перегрузки.

Если после перехода в состояние управления перегрузкой происходит тайм-аут, состояние сети ухудшается, и TCP переходит из состояния предотвращения перегрузки в состояние медленного старта. В этом случае значение окна перегрузки cwnd устанавливается равным 1 MSS (максимальная длина сегмента пакета), а значение порога медленного старта ssthresh — половине значения cwnd. Цель этого — постепенно увеличивать размер окна перегрузки после восстановления сети для балансировки скорости передачи и степени перегрузки сети.

Краткое содержание
TCP, как надежный транспортный протокол, реализует надежную передачу данных с помощью порядкового номера, подтверждения, управления повторной передачей, управления соединениями и управления окном. Среди них механизм управления потоком контролирует объем данных, отправляемых отправителем, в соответствии с фактической пропускной способностью получателя, что позволяет избежать проблем перегрузки сети и снижения производительности. Механизм управления перегрузкой предотвращает возникновение перегрузки сети путем регулирования объема данных, отправляемых отправителем. Понятия окна перегрузки и окна отправки взаимосвязаны, и объем данных, поступающих от отправителя, контролируется путем динамической регулировки размера окна перегрузки. Медленный старт, предотвращение перегрузки и быстрое восстановление — три основные части алгоритма управления перегрузкой TCP, которые регулируют размер окна перегрузки с помощью различных стратегий для адаптации к пропускной способности и степени перегрузки сети.

В следующем разделе мы подробно рассмотрим механизм повторной передачи TCP. Механизм повторной передачи является важной частью TCP для обеспечения надежной передачи данных. Он гарантирует надежную передачу данных путем повторной передачи потерянных, поврежденных или задержанных данных. Принципы реализации и стратегия механизма повторной передачи будут подробно рассмотрены и проанализированы в следующем разделе. Оставайтесь с нами!


Дата публикации: 24 февраля 2025 г.