Протокол управления передачей (TCP) использует алгоритм управления перегрузкой , который включает различные аспекты схемы аддитивного увеличения/мультипликативного уменьшения (AIMD), а также другие схемы, включая медленный старт [1] и окно перегрузки (CWND), для предотвращения перегрузки. Алгоритм предотвращения перегрузки TCP является основной основой для управления перегрузкой в Интернете. [2] [3] [4] Согласно принципу «от конца к концу» , управление перегрузкой в значительной степени является функцией интернет-хостов , а не самой сети. Существует несколько вариаций и версий алгоритма, реализованных в стеках протоколов операционных систем компьютеров, которые подключаются к Интернету .
Чтобы избежать перегрузки , TCP использует многогранную стратегию управления перегрузкой. Для каждого соединения TCP поддерживает CWND, ограничивая общее количество неподтвержденных пакетов, которые могут находиться в транзите из конца в конец. Это в некоторой степени аналогично скользящему окну TCP, используемому для управления потоком .
Алгоритм аддитивного увеличения/мультипликативного уменьшения (AIMD) — это алгоритм управления с замкнутым контуром . AIMD сочетает линейный рост окна перегрузки с экспоненциальным уменьшением при возникновении перегрузки. Несколько потоков, использующих управление перегрузкой AIMD, в конечном итоге сойдутся для использования равных объемов конкурирующего соединения. [5]
Это алгоритм, описанный в RFC 5681 для состояния «предотвращения перегрузки». [6]
В TCP окно перегрузки (CWND) является одним из факторов, определяющих количество байтов, которые могут быть отправлены в любой момент времени. Окно перегрузки поддерживается отправителем и является средством предотвращения перегрузки канала между отправителем и получателем слишком большим объемом трафика. Его не следует путать со скользящим окном, поддерживаемым отправителем, которое существует для предотвращения перегрузки получателя . Окно перегрузки рассчитывается путем оценки степени перегрузки канала.
При установке соединения окно перегрузки, значение, поддерживаемое независимо на каждом хосте, устанавливается на небольшое кратное максимальному размеру сегмента ( MSS ), разрешенному для этого соединения. Дальнейшее изменение окна перегрузки диктуется подходом аддитивного увеличения/мультипликативного уменьшения (AIMD). Это означает, что если все сегменты получены и подтверждения достигают отправителя вовремя, к размеру окна добавляется некоторая константа. Он будет следовать разным алгоритмам.
Системный администратор может настроить максимальный размер окна или настроить константу, добавляемую во время аддитивного увеличения, как часть настройки TCP .
Поток данных через TCP-соединение также контролируется использованием окна приема , объявленного получателем. Отправитель может отправлять данные, меньшие, чем его собственное окно перегрузки и окно приема .
Медленный старт, определенный в RFC 5681. [7] является частью стратегии управления перегрузкой, используемой TCP совместно с другими алгоритмами, чтобы избежать отправки большего объема данных, чем сеть способна переслать, то есть, чтобы не вызывать перегрузку сети.
Медленный старт начинается изначально с размером окна перегрузки (CWND) 1, 2, 4 или 10 MSS. [8] [3] : 1 Значение размера окна перегрузки может быть увеличено на 1 MSS с каждым полученным подтверждением (ACK), что фактически удваивает размер окна за каждый RTT . [a]
Скорость передачи данных будет увеличиваться алгоритмом медленного старта до тех пор, пока не будет обнаружена потеря пакета, объявленное окно получателя (rwnd) не станет ограничивающим фактором или не будет достигнуто пороговое значение медленного старта (ssthresh) , которое используется для определения того, используется ли алгоритм медленного старта или предотвращения перегрузки, значение устанавливается для ограничения медленного старта.
Если CWND достигает ssthresh , TCP переключается на алгоритм предотвращения перегрузки. Он должен быть увеличен на 1 MSS для каждого RTT. Распространенная формула заключается в том, что каждый новый ACK увеличивает CWND на MSS * MSS / CWND. Он увеличивается почти линейно и обеспечивает приемлемое приближение.
Если происходит событие потери, TCP предполагает, что это связано с перегрузкой сети, и предпринимает шаги для снижения предлагаемой нагрузки на сеть. Эти меры зависят от точного используемого алгоритма предотвращения перегрузки TCP.
Когда отправитель TCP обнаруживает потерю сегмента с помощью таймера повторной передачи, а данный сегмент еще не был отправлен повторно, значение ssthresh должно быть установлено не более чем на половину объема данных, которые были отправлены, но еще не подтверждены в совокупности, или 2 * MSS , в зависимости от того, какое значение больше.
Медленный старт предполагает, что неподтвержденные сегменты вызваны перегрузкой сети. Хотя это приемлемое предположение для многих сетей, сегменты могут быть потеряны по другим причинам, таким как плохое качество передачи данных на уровне канала . Таким образом, медленный старт может плохо работать в ситуациях с плохим приемом, например, в беспроводных сетях .
Протокол медленного старта также плохо работает для кратковременных соединений. Старые веб-браузеры создавали много последовательных кратковременных соединений с веб-сервером и открывали и закрывали соединение для каждого запрошенного файла. Это удерживало большинство соединений в режиме медленного старта, что приводило к плохому времени отклика. Чтобы избежать этой проблемы, современные браузеры либо открывают несколько соединений одновременно, либо повторно используют одно соединение для всех файлов, запрошенных с определенного веб-сервера. Однако соединения не могут быть повторно использованы для нескольких сторонних серверов, используемых веб-сайтами для реализации веб-рекламы , совместного использования функций социальных сетей , [9] и сценариев противодействия веб-аналитике .
Быстрая повторная передача — это усовершенствование TCP , которое сокращает время ожидания отправителя перед повторной передачей потерянного сегмента. Отправитель TCP обычно использует простой таймер для распознавания потерянных сегментов. Если подтверждение не получено для определенного сегмента в течение указанного времени (функция предполагаемого времени задержки приема-передачи ), отправитель предположит, что сегмент был потерян в сети, и повторно передаст его.
Дублированное подтверждение является основой для механизма быстрой повторной передачи. После получения пакета отправляется подтверждение для последнего байта полученных данных в порядке их поступления. Для упорядоченного пакета это фактически порядковый номер последнего пакета плюс длина полезной нагрузки текущего пакета. Если следующий пакет в последовательности потерян, но получен третий пакет в последовательности, то получатель может подтвердить только последний байт данных в порядке их поступления, который имеет то же значение, что и подтвержденный для первого пакета. Второй пакет потерян, а третий пакет не в порядке, поэтому последний байт данных в порядке их поступления остается таким же, как и прежде. Таким образом, происходит дублированное подтверждение . Отправитель продолжает отправлять пакеты, а получатель получает четвертый и пятый пакеты. Опять же, второй пакет отсутствует в последовательности, поэтому последний байт в порядке их поступления не изменился. Дублированные подтверждения отправляются для обоих этих пакетов.
Когда отправитель получает три дублирующих подтверждения, он может быть достаточно уверен, что сегмент, содержащий данные, которые следовали за последним байтом в порядке, указанным в подтверждении, был утерян. Отправитель с быстрой повторной передачей затем немедленно повторно передаст этот пакет, не дожидаясь его тайм-аута. Получив повторно переданный сегмент, получатель может подтвердить последний байт полученных данных в порядке. В приведенном выше примере это будет подтверждением до конца полезной нагрузки пятого пакета. Нет необходимости подтверждать промежуточные пакеты, поскольку TCP по умолчанию использует кумулятивные подтверждения.
Соглашение об именовании алгоритмов управления перегрузкой (CCA) могло возникнуть в статье Кевина Фолла и Салли Флойд 1996 года. [10] [ проверка не удалась ]
Ниже приведена одна из возможных классификаций по следующим свойствам:
Некоторые известные механизмы предотвращения перегрузок классифицируются по этой схеме следующим образом:
Алгоритмы TCP Tahoe и Reno были ретроспективно названы в честь версий или вариантов операционной системы 4.3BSD , в которых они впервые появились (которые сами были названы в честь озера Тахо и близлежащего города Рино, штат Невада ). Алгоритм Tahoe впервые появился в 4.3BSD-Tahoe (которая была создана для поддержки мини-компьютера CCI Power 6/32 "Tahoe" ), а затем стал доступен для не-AT&T лицензиатов как часть 4.3BSD Networking Release 1; это обеспечило его широкое распространение и реализацию. Улучшения были сделаны в 4.3BSD-Reno и впоследствии выпущены для общественности как Networking Release 2 и позже 4.4BSD-Lite.
Хотя оба устройства рассматривают тайм-аут повторной передачи (RTO) и дублирующие ACK как события потери пакетов, поведение Tahoe и Reno в первую очередь отличается тем, как они реагируют на дублирующие ACK:
В Tahoe и Reno, если время ожидания ACK истекло (время ожидания RTO), используется медленный старт, и оба алгоритма сокращают окно перегрузки до 1 MSS. [ необходима цитата ]
TCP New Reno, определенный в RFC 6582 (который отменяет предыдущие определения в RFC 3782 и RFC 2582), улучшает повторную передачу во время фазы быстрого восстановления TCP Reno.
Во время быстрого восстановления, чтобы окно передачи оставалось заполненным, для каждого возвращаемого дубликата ACK отправляется новый неотправленный пакет с конца окна перегрузки.
Отличие от Reno в том, что New Reno не делит ssthresh пополам немедленно, что может слишком сильно сократить окно, если происходит потеря нескольких пакетов. Он не выходит из режима быстрого восстановления и не сбрасывает ssthresh, пока не подтвердит все данные.
После повторной передачи вновь подтвержденные данные имеют два случая:
Он использует переменную под названием "recover" для записи того, сколько данных необходимо восстановить. После тайм-аута повторной передачи он записывает наивысший переданный порядковый номер в переменной recovery и выходит из процедуры быстрого восстановления. Если этот порядковый номер подтвержден, TCP возвращается в состояние избежания перегрузки.
Проблема возникает с New Reno, когда нет потерь пакетов, но вместо этого пакеты переупорядочиваются более чем на 3 порядковых номера пакетов. В этом случае New Reno ошибочно входит в режим быстрого восстановления. Когда переупорядоченный пакет доставлен, немедленно отправляются дублирующие и ненужные повторные передачи.
New Reno работает так же хорошо, как SACK, при низком уровне ошибок пакетов и существенно превосходит Reno при высоком уровне ошибок. [17]
До середины 1990-х годов все установленные тайм-ауты TCP и измеренные задержки приема-передачи основывались только на последнем переданном пакете в буфере передачи. Исследователи из Университета Аризоны Ларри Петерсон и Лоуренс Бракмо представили TCP Vegas, в котором были установлены тайм-ауты и измерялись задержки приема-передачи для каждого пакета в буфере передачи. Кроме того, TCP Vegas использует аддитивное увеличение окна перегрузки. В сравнительном исследовании различных TCP CCA , TCP Vegas оказался самым плавным, за ним следует TCP CUBIC. [18]
TCP Vegas не получил широкого распространения за пределами лаборатории Петерсона, но был выбран в качестве метода управления перегрузкой по умолчанию для прошивки DD-WRT v24 SP2. [19]
TCP Hybla [20] [21] направлен на устранение штрафов для TCP-соединений, использующих наземные или спутниковые радиоканалы с высокой задержкой. Улучшения Hybla основаны на аналитической оценке динамики окна перегрузки. [22]
Binary Increase Congestion control (BIC) — это реализация TCP с оптимизированным CCA для высокоскоростных сетей с высокой задержкой, известных как длинные толстые сети (LFN). [23] BIC используется по умолчанию в ядрах Linux 2.6.8 по 2.6.18. [ необходима ссылка ]
CUBIC — менее агрессивная и более систематическая производная BIC, в которой окно является кубической функцией времени с момента последнего события перегрузки, а точка перегиба установлена на окне до события. CUBIC используется по умолчанию в ядрах Linux, начиная с версии 2.6.19.
Agile-SD — это CCA на базе Linux, разработанный для настоящего ядра Linux. Это алгоритм на стороне приемника, который использует подход на основе потерь с использованием нового механизма, называемого фактором гибкости (AF). для увеличения использования полосы пропускания в высокоскоростных и коротких сетях (сети с низкой задержкой полосы пропускания), таких как локальные сети или оптоволоконные сети, особенно когда размер применяемого буфера невелик. [24] Он был оценен путем сравнения его производительности с Compound TCP (CCA по умолчанию в MS Windows) и CUBIC (по умолчанию в Linux) с использованием симулятора NS-2. Он улучшает общую производительность до 55% с точки зрения средней пропускной способности.
Westwood+ — это модификация TCP Reno только для отправителя, которая оптимизирует производительность контроля перегрузки TCP как в проводных, так и в беспроводных сетях . TCP Westwood+ основан на оценке пропускной способности «от конца до конца» для установки окна перегрузки и порога медленного старта после эпизода перегрузки, то есть после трех дублированных подтверждений или тайм-аута. Пропускная способность оценивается путем усреднения скорости возврата пакетов подтверждения. В отличие от TCP Reno, который слепо вдвое уменьшает окно перегрузки после трех дублированных ACK, TCP Westwood+ адаптивно устанавливает порог медленного старта и окно перегрузки, которые учитывают оценку доступной полосы пропускания на момент возникновения перегрузки. По сравнению с Reno и New Reno, Westwood+ значительно увеличивает пропускную способность беспроводных соединений и улучшает справедливость в проводных сетях. [ необходима цитата ]
Compound TCP — это реализация TCP от Microsoft , которая поддерживает два разных окна перегрузки одновременно с целью достижения хорошей производительности на LFN, не нарушая при этом справедливости . Он широко использовался в версиях Windows, начиная с Microsoft Windows Vista и Windows Server 2008 , и был перенесен на более старые версии Microsoft Windows, а также на Linux .
TCP Proportional Rate Reduction (PRR) [25] — это алгоритм, разработанный для повышения точности данных, отправляемых во время восстановления. Алгоритм гарантирует, что размер окна после восстановления будет максимально приближен к порогу медленного старта. В тестах, проведенных Google , PRR привел к снижению средней задержки на 3–10%, а время ожидания восстановления сократилось на 5%. [26] PRR доступен в ядрах Linux , начиная с версии 3.2. [27]
Bottleneck Bandwidth and Round-trip propagation time (BBR) — это CCA, разработанный в Google в 2016 году. [28] В то время как большинство CCA основаны на потерях, поскольку они полагаются на потерю пакетов для обнаружения перегрузки и более низких скоростей передачи, BBR, как и TCP Vegas, основан на модели. Алгоритм использует максимальную пропускную способность и время приема-передачи, при которых сеть доставила последний рейс исходящих пакетов данных, для построения модели сети. Каждое кумулятивное или выборочное подтверждение доставки пакета создает выборку скорости, которая записывает объем данных, доставленных за временной интервал между передачей пакета данных и подтверждением этого пакета. [29]
При внедрении на YouTube BBRv1 показал в среднем на 4% более высокую пропускную способность сети и до 14% в некоторых странах. [30] BBR доступен для Linux TCP с Linux 4.9. [31] Он также доступен для QUIC . [32]
Справедливость BBR версии 1 (BBRv1) к потокам, не являющимся BBR, оспаривается. Хотя презентация Google показывает, что BBRv1 хорошо сосуществует с CUBIC, [28] такие исследователи, как Джефф Хьюстон и Хок, Блесс и Зиттербарт, сочли его несправедливым по отношению к другим потокам и немасштабируемым. [33] Хок и др. также обнаружили «некоторые серьезные внутренние проблемы, такие как увеличенные задержки в очередях, несправедливость и массовая потеря пакетов» в реализации BBR в Linux 4.9. [34] Сохейл Аббаслоо и др. (авторы C2TCP) показывают, что BBRv1 не работает хорошо в динамических средах, таких как сотовые сети. [11] [12] Они также показали, что у BBR есть проблема несправедливости. Например, когда поток CUBIC (который является реализацией TCP по умолчанию в Linux, Android и MacOS) сосуществует с потоком BBR в сети, поток BBR может доминировать над потоком CUBIC и получать от него всю пропускную способность канала (см. рисунок 16 в [11] ).
Версия 2 пытается решить проблему несправедливости при работе с управлением перегрузками на основе потерь, таким как CUBIC. [35] В BBRv2 модель, используемая BBRv1, дополнена для включения информации о потере пакетов и информации из явного уведомления о перегрузке (ECN). [36] Хотя BBRv2 иногда может иметь более низкую пропускную способность, чем BBRv1, обычно считается, что она имеет лучшую производительность . [ требуется ссылка ]
Версия 3 (BBRv3) исправляет две ошибки в BBRv2 (преждевременное окончание проверки пропускной способности, конвергенция пропускной способности) и выполняет некоторую настройку производительности. Существует также вариант, называемый BBR.Swift, оптимизированный для внутренних связей центра обработки данных: он использует network_RTT (исключая задержку приемника) в качестве основного сигнала управления перегрузкой. [36]
Cellular Controlled Delay TCP (C2TCP) [11] [12] был мотивирован отсутствием гибкого сквозного подхода TCP, который мог бы удовлетворять различным требованиям QoS для различных приложений без необходимости каких-либо изменений в сетевых устройствах. C2TCP нацелен на удовлетворение требований сверхнизкой задержки и высокой пропускной способности таких приложений, как виртуальная реальность , видеоконференции , онлайн-игры , системы автомобильной связи и т. д. в высокодинамичной среде, такой как текущие сети LTE и будущие сотовые сети 5G . C2TCP работает как надстройка поверх TCP на основе потерь (например, Reno, NewReno, CUBIC , BIC , ...), его требуется только установить на стороне сервера, и он ограничивает среднюю задержку пакетов желаемыми задержками, установленными приложениями.
Исследователи из Нью-Йоркского университета [37] показали, что C2TCP превосходит производительность задержки и вариации задержки различных современных схем TCP. Например, они показали, что по сравнению с BBR, CUBIC и Westwood в среднем, C2TCP уменьшает среднюю задержку пакетов примерно на 250%, 900% и 700% соответственно в различных средах сотовой сети. [11]
Elastic-TCP был предложен в феврале 2019 года для увеличения использования полосы пропускания в сетях с высоким BDP в поддержку облачных вычислений. Это CCA на базе Linux, разработанный для ядра Linux. Это алгоритм на стороне приемника, который использует подход на основе потерь и задержек с использованием нового механизма, называемого функцией весовой коррекции окна (WWF). Он обладает высоким уровнем эластичности для работы с различными сетевыми характеристиками без необходимости настройки человеком. Его производительность была оценена путем сравнения его производительности с Compound TCP (CCA по умолчанию в MS Windows), CUBIC (по умолчанию для Linux) и TCP-BBR (по умолчанию Linux 4.9, используемой Google) с использованием симулятора и испытательного стенда NS-2. Elastic-TCP значительно улучшает общую производительность с точки зрения средней пропускной способности, коэффициента потерь и задержки. [38]
Сохейл Аббаслоо и др. предложили NATCP (Network-Assisted TCP) [13] спорную [ по мнению кого? ] конструкцию TCP, нацеленную на многопользовательские периферийные вычисления (MEC). Основная идея NATCP заключается в том, что если бы характеристики сети были известны заранее, TCP был бы спроектирован по-другому. Поэтому NATCP использует доступные функции и свойства в текущих сотовых архитектурах на основе MEC, чтобы приблизить производительность TCP к оптимальной производительности. NATCP использует внеполосную обратную связь от сети к серверам, расположенным поблизости. Обратная связь от сети, которая включает в себя емкость канала сотового доступа и минимальное время RTT сети, направляет серверы на корректировку их скоростей отправки. Как показывают предварительные результаты, NATCP превосходит самые современные схемы TCP. [13] [39]
TCP New Reno был наиболее часто реализуемым алгоритмом, [ требуется цитата ] Поддержка SACK очень распространена [ требуется цитата ] и является расширением Reno/New Reno. Большинство других являются конкурирующими предложениями, которые все еще нуждаются в оценке. Начиная с 2.6.8 ядро Linux переключило реализацию по умолчанию с New Reno на BIC . Реализация по умолчанию была снова изменена на CUBIC в версии 2.6.19. FreeBSD, начиная с версии 14.X, также использует CUBIC в качестве алгоритма по умолчанию. [51] Предыдущая версия использовала New Reno. Однако FreeBSD поддерживает ряд других вариантов. [52]
Когда произведение пропускной способности и задержки на поток увеличивается, независимо от схемы очередей, TCP становится неэффективным и подверженным нестабильности. Это становится все более важным, поскольку Интернет развивается, включая оптические каналы с очень высокой пропускной способностью.
TCP Interactive (iTCP) [53] позволяет приложениям подписываться на события TCP и реагировать соответствующим образом, обеспечивая различные функциональные расширения TCP извне уровня TCP. Большинство схем перегрузки TCP работают внутренне. iTCP дополнительно позволяет расширенным приложениям напрямую участвовать в управлении перегрузкой, например, контролировать скорость генерации источника.
Zeta-TCP обнаруживает перегрузку как по задержкам, так и по показателям потерь. Для максимизации полезной производительности Zeta-TCP применяет различные стратегии отсрочки окна перегрузки, основанные на вероятности перегрузки. Он также имеет другие улучшения для точного обнаружения потерь пакетов, избегая повторной передачи по тайм-ауту; и ускоряет и контролирует входящий (загрузочный) трафик. [54]
CCA могут быть классифицированы по отношению к сетевой осведомленности, то есть по степени, в которой эти алгоритмы осведомлены о состоянии сети. Это состоит из трех основных категорий: черный ящик, серый ящик и зеленый ящик. [55]
Алгоритмы черного ящика предлагают слепые методы контроля перегрузки. Они работают только на основе двоичной обратной связи, полученной при перегрузке, и не предполагают никаких знаний о состоянии сетей, которыми они управляют.
Алгоритмы «серого ящика» используют временные измерения, такие как изменение RTT и скорость прибытия пакетов, для получения измерений и оценок пропускной способности, конкуренции потоков и других сведений о состоянии сети.
Алгоритмы зеленого ящика предлагают бимодальные методы управления перегрузкой, которые измеряют справедливую долю общей пропускной способности, которая должна быть выделена для каждого потока в любой момент во время работы системы.
Следующие алгоритмы требуют добавления пользовательских полей в структуру TCP-пакета:
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite web}}
: CS1 maint: archived copy as title (link)