Явное уведомление о перегрузке ( ECN ) является расширением Интернет-протокола и протокола управления передачей и определено в RFC 3168 (2001). ECN позволяет осуществлять сквозное уведомление о перегрузке сети без потери пакетов. ECN — это дополнительная функция, которую можно использовать между двумя конечными точками с поддержкой ECN, если базовая сетевая инфраструктура также поддерживает ее.
Традиционно сети TCP/IP сигнализируют о перегрузке, отбрасывая пакеты. При успешном согласовании ECN маршрутизатор, поддерживающий ECN, может установить метку в заголовке IP вместо отбрасывания пакета, чтобы сигнализировать о надвигающейся перегрузке. Получатель пакета передает отправителю сообщение о перегрузке, что снижает скорость передачи, как если бы он обнаружил отброшенный пакет.
Вместо того, чтобы реагировать должным образом или игнорировать биты, некоторое устаревшее или неисправное сетевое оборудование исторически отбрасывало или искажало пакеты, в которых установлены биты ECN. [1] [2] [3] По состоянию на 2015 год [update]измерения показали, что доля веб-серверов в общедоступном Интернете, для которых установка ECN предотвращает сетевые подключения, сократилась до менее чем 1%. [4]
Пассивная поддержка существует в Ubuntu Linux с 12.04 и в Windows Server с 2012 года. [5] Пассивная поддержка на самых популярных веб-сайтах выросла с 8,5% в 2012 году до более чем 70% в мае 2017 года. [5] Теперь требуется внедрение в Интернете. клиенты активно запрашивают ECN. В июне 2015 года Apple объявила, что ECN будет включена по умолчанию в поддерживаемых и будущих продуктах, чтобы способствовать внедрению сигнализации ECN во всей отрасли. [6]
ECN требует специальной поддержки как на уровне Интернета, так и на транспортном уровне по следующим причинам:
Без ECN эхо-сигнал индикации перегрузки достигается косвенно за счет обнаружения потерянных пакетов. При использовании ECN перегрузка указывается путем установки поля ECN в IP-пакете на CE (опыт перегрузки) и передается обратно от приемника передатчику путем установки соответствующих битов в заголовке транспортного протокола. Например, при использовании TCP индикация перегрузки возвращается путем установки бита ECE.
ECN использует два младших (самых правых) бита поля класса трафика в заголовке IPv4 или IPv6 для кодирования четырех различных кодовых точек:
00
– Транспорт без поддержки ECN, не-ECT01
– Транспорт с поддержкой ECN(1), ECT(1)10
– Транспорт с поддержкой ECN(0), ECT(0)11
– Возникла перегрузка, CE.Когда обе конечные точки поддерживают ECN, они помечают свои пакеты ECT(0) или ECT(1). Маршрутизаторы рассматривают кодовые точки ECT(0) и ECT(1) как эквивалентные. Если пакет проходит через очередь активного управления очередью (AQM) (например, очередь, использующую случайное раннее обнаружение (RED)), которая испытывает перегрузку, и соответствующий маршрутизатор поддерживает ECN, он может изменить кодовую точку на CE
вместо отбрасывания пакета . Это действие называется «маркировкой», и его цель — информировать принимающую конечную точку о предстоящей перегрузке . В принимающей конечной точке эта индикация перегрузки обрабатывается протоколом верхнего уровня ( протокол транспортного уровня ) и должна быть возвращена обратно на передающий узел, чтобы дать ему сигнал о необходимости снижения скорости передачи.
Поскольку индикация CE может эффективно обрабатываться только протоколом верхнего уровня, который ее поддерживает, ECN используется только в сочетании с протоколами верхнего уровня, такими как TCP , которые поддерживают контроль перегрузки и имеют метод для отражения индикации CE в передающую конечную точку. .
TCP поддерживает ECN, используя два флага в заголовке TCP. Первый, ECN-Echo (ECE), используется для отражения индикации перегрузки (т. е. сигнала отправителю о необходимости снизить скорость передачи). Второй, «Уменьшенное окно перегрузки» (CWR), используется для подтверждения того, что получено эхо-сигнал индикации перегрузки. Использование ECN в TCP-соединении не является обязательным; для использования ECN его необходимо согласовать при установлении соединения путем включения подходящих опций в сегменты SYN и SYN-ACK.
Когда ECN согласован в TCP-соединении, отправитель указывает, что IP-пакеты, которые несут TCP-сегменты этого соединения, переносят трафик от транспорта с поддержкой ECN, помечая их кодовой точкой ECT. Это позволяет промежуточным маршрутизаторам, поддерживающим ECN, помечать эти IP-пакеты кодом CE вместо того, чтобы отбрасывать их, чтобы сигнализировать о надвигающейся перегрузке.
При получении IP-пакета с кодовой точкой Congestion Experienced получатель TCP возвращает это указание на перегрузку, используя флаг ECE в заголовке TCP. Когда конечная точка получает сегмент TCP с битом ECE, она уменьшает окно перегрузки, как при потере пакета. Затем он подтверждает индикацию перегрузки, отправляя сегмент с установленным битом CWR.
Узел продолжает передавать сегменты TCP с установленным битом ECE до тех пор, пока не получит сегмент с установленным битом CWR.
Чтобы увидеть затронутые пакеты с помощью tcpdump , используйте предикат filter (tcp[13] & 0xc0 != 0)
.
Поскольку протокол управления передачей (TCP) не контролирует перегрузку пакетов управления (чистые ACK, сегменты SYN, FIN), пакеты управления обычно не помечаются как поддерживающие ECN.
В предложении 2009 года [7] предлагается маркировать пакеты SYN-ACK как поддерживающие ECN. Было показано, что это улучшение, известное как ECN+, обеспечивает значительное повышение производительности кратковременных TCP-соединений. [8]
ECN также определен для других протоколов транспортного уровня, которые выполняют контроль перегрузки, в частности DCCP и протокола передачи управления потоком (SCTP). Общий принцип аналогичен TCP, хотя детали кодирования в сети отличаются.
Можно использовать ECN с протоколами, расположенными выше UDP . Однако UDP требует, чтобы контроль перегрузки выполнялся приложением, а ранние протоколы на основе UDP, такие как DNS, не использовали ECN. Более поздние протоколы на основе UDP, такие как QUIC , используют ECN для контроля перегрузки.
Поскольку ECN эффективен только в сочетании с политикой активного управления очередью (AQM), преимущества ECN зависят от конкретного используемого AQM. Однако некоторые наблюдения, похоже, справедливы для разных AQM.
Как и ожидалось, ECN уменьшает количество пакетов, отброшенных TCP-соединением, что, избегая повторной передачи, снижает задержку и особенно джиттер. Этот эффект наиболее заметен, когда TCP-соединение имеет один ожидающий сегмент, [9] когда можно избежать тайм-аута RTO ; это часто относится к интерактивным соединениям, таким как удаленный вход в систему, и протоколам транзакций, таким как HTTP-запросы, диалоговая фаза SMTP или SQL-запросы.
Влияние ECN на массовую пропускную способность менее очевидно [10] , поскольку современные реализации TCP довольно хорошо справляются с своевременной повторной отправкой отброшенных сегментов, когда окно отправителя велико.
Было обнаружено, что использование ECN вредно для производительности в сильно перегруженных сетях при использовании алгоритмов AQM, которые никогда не отбрасывают пакеты. [8] Современные реализации AQM позволяют избежать этой ловушки, отбрасывая, а не маркируя пакеты при очень высокой нагрузке.
Многие современные реализации набора протоколов TCP/IP имеют некоторую поддержку ECN; однако они обычно поставляются с отключенным ECN.
Версии Windows, начиная с Windows Server 2008 и Windows Vista, поддерживают ECN для TCP. [11] Начиная с Windows Server 2012, он включен по умолчанию в версиях Windows Server, поскольку используется протокол управления передачей данных центра обработки данных (DTCCP). [12] В предыдущих версиях Windows и несерверных версиях она отключена по умолчанию.
Поддержку ECN можно включить с помощью команды оболочки, например netsh interface tcp set global ecncapability=enabled
.
Во FreeBSD ECN для TCP можно настроить с помощью sysctl net.inet.tcp.ecn.enable . По умолчанию он включен только для входящих соединений, которые его запрашивают. Его также можно включить для всех подключений или полностью отключить. [13]
NetBSD 4.0 реализует поддержку ECN для TCP; его можно активировать через интерфейс sysctl , установив для sysctl net.inet.tcp.ecn.enable
параметра значение 1. [14]
Аналогично, sysctl net.inet.tcp.ecn можно использовать в OpenBSD . [15]
Начиная с версии 2.4.20 ядра Linux , выпущенной в ноябре 2002 года, [16] Linux поддерживает три режима работы ECN для TCP, которые настраиваются через интерфейс sysctl путем установки параметра /proc/sys/net/ipv4/tcp_ecn в одно значение. следующих значений: [17]
Начиная с версии 4.1 ядра Linux, выпущенной в июне 2015 года, механизм tcp_ecn_fallback , как указано в разделе 6.1.1.1 RFC 3168, [18] включается по умолчанию [19] , когда включен ECN (значение 1). Резервный механизм пытается установить соединение ECN при первоначальной настройке исходящих соединений с плавным возвратом для передач без возможности ECN, что устраняет проблемы с нетерпимыми к ECN хостами или межсетевыми экранами.
Mac OS X 10.5 и 10.6 реализует поддержку ECN для TCP. Он управляется с помощью логических переменных sysctl net.inet.tcp.ecn_negotiate_in и net.inet.tcp.ecn_initiate_out . [20] Первая переменная включает ECN для входящих соединений, для которых уже установлены флаги ECN; второй пытается инициировать исходящие соединения с включенным ECN. Обе переменные по умолчанию имеют значение 0 , но их можно установить на 1 , чтобы включить соответствующее поведение.
В июне 2015 года Apple Inc. объявила, что в OS X 10.11 ECN будет включена по умолчанию, [6] но операционная система поставляется без такого поведения по умолчанию. В macOS Sierra ECN включен для половины сеансов TCP. [21]
В июне 2015 года компания Apple Inc. объявила, что iOS 9 , следующая версия iOS, будет поддерживать ECN и будет включена по умолчанию. [6] Согласование TCP ECN включено для 5% случайно выбранных соединений через Wi-Fi/Ethernet в iOS 9 и для 50% случайно выбранных соединений через Wi-Fi/Ethernet и нескольких операторов сотовой связи в iOS 10 [22] [23 ] ] и 100% для iOS 11 [24]
Ядро Solaris поддерживает три состояния ECN для TCP: [25]
Начиная с Solaris 11.4, поведение по умолчанию активно . Использование ECN можно изменить с помощью ipadm set-prop -p ecn=active tcp . [26]
Поскольку маркировка ECN в маршрутизаторах зависит от той или иной формы активного управления очередью , для выполнения маркировки ECN маршрутизаторы должны быть настроены с использованием подходящей дисциплины очереди.
Маршрутизаторы Cisco IOS выполняют маркировку ECN, если они настроены с использованием дисциплины организации очередей WRED , начиная с версии 12.2(8)T.
Маршрутизаторы Linux выполняют маркировку ECN, если они настроены с использованием одной из дисциплин очереди RED или GRED с явным параметром ecn , с помощью дисциплины sfb , с помощью дисциплины справедливой организации очередей CoDel (fq_codel) или дисциплины организации очередей CAKE [27] .
Современные реализации BSD, такие как FreeBSD , NetBSD и OpenBSD , имеют поддержку маркировки ECN в реализации организации очередей ALTQ для ряда дисциплин организации очередей , в частности RED и Blue . FreeBSD 11 включала реализацию дисциплин организации очередей CoDel , PIE, FQ-CoDel и FQ-PIE в среде ipfw /dummynet с возможностью маркировки ECN. [28]
Протокол управления передачей центра обработки данных ( TCP или DTCCP ) использует ECN для улучшения алгоритма управления перегрузкой протокола управления передачей . [29] Используется в сетях центров обработки данных . В то время как стандартный алгоритм управления перегрузкой TCP способен только обнаружить наличие перегрузки, DTCCP, используя ECN, способен оценить степень перегрузки . [30]
DTCCP изменяет приемник TCP, чтобы он всегда передавал точную маркировку ECN входящих пакетов за счет игнорирования функции, предназначенной для сохранения надежности сигнализации. Это делает отправителя DTCCP уязвимым к потере подтверждений ACK от получателя, и у него нет механизма обнаружения или устранения этой проблемы. [31] По состоянию на июль 2014 года [update]алгоритмы, обеспечивающие эквивалентную или лучшую обратную связь с приемником при более надежном подходе, являются активной темой исследований. [31]
{{cite web}}
: |last=
имеет общее имя ( справка ){{cite web}}
: |last=
имеет общее имя ( справка )