Алгоритм Нагла - это средство повышения эффективности сетей TCP / IP за счет уменьшения количества пакетов, которые необходимо отправить по сети. Он был определен Джоном Нэглом во время работы в Ford Aerospace . Он был опубликован в 1984 году как запрос на комментарии (RFC) под заголовком « Контроль перегрузки в межсетевых сетях IP / TCP» в RFC 896 .
RFC описывает то, что он назвал «проблемой малых пакетов», когда приложение постоянно выдает данные небольшими порциями, часто размером всего 1 байт . Поскольку пакеты TCP имеют 40-байтовый заголовок (20 байтов для TCP, 20 байтов для IPv4 ), это приводит к 41-байтовому пакету для 1 байта полезной информации, а это огромные накладные расходы. Такая ситуация часто возникает в сеансах Telnet , где большинство нажатий клавиш генерируют один байт данных, который передается немедленно. Что еще хуже, по медленным каналам многие такие пакеты могут передаваться одновременно, что может привести к перегрузке .
Алгоритм Нэгла работает, комбинируя несколько небольших исходящих сообщений и отправляя их все сразу. В частности, пока существует отправленный пакет, для которого отправитель не получил подтверждения, отправитель должен буферизовать свой вывод до тех пор, пока он не получит полный пакет вывода, что позволяет отправлять все данные сразу.
Алгоритм
RFC определяет алгоритм как
запретить отправку новых сегментов TCP при поступлении новых исходящих данных от пользователя, если какие-либо ранее переданные данные по соединению остаются неподтвержденными.
Если MSS - это максимальный размер сегмента , самый большой сегмент, который может быть отправлен по этому соединению, а размер окна - это допустимое в настоящее время окно неподтвержденных данных, это может быть записано в псевдокоде как [ необходима цитата ]
если есть новые данные для отправки, то если размер окна ≥ MSS и доступные данные ≥ MSS, то отправить полный сегмент MSS сейчас иначе, если в трубе все еще есть неподтвержденные данные, тогда помещать данные в буфер до получения подтверждения еще отправить данные немедленно конец, если конец, если конец, если
Взаимодействие с отложенным ACK
Этот алгоритм плохо взаимодействует с отложенными подтверждениями TCP (отложенным ACK), функцией, введенной в TCP примерно в то же время в начале 1980-х, но другой группой. При включенных обоих алгоритмах приложения, которые выполняют две последовательные записи в TCP-соединение, за которыми следует чтение, которое не будет выполнено до тех пор, пока данные из второй записи не достигнут места назначения, испытывают постоянную задержку до 500 миллисекунд, " Задержка ACK ". Рекомендуется отключить любой из них, хотя традиционно проще отключить Nagle, поскольку такой переключатель уже существует для приложений реального времени.
Решение, рекомендованное Нэглом, состоит в том, чтобы избежать отправки алгоритмом преждевременных пакетов путем буферизации записи приложения и последующей очистки буфера: [1]
Решение на уровне пользователя - избегать последовательностей записи-записи-чтения на сокетах. Запись – чтение – запись – чтение в порядке. Запись – запись – запись в порядке. Но запись-запись-чтение - убийца. Так что, если можете, скопируйте свои небольшие записи в TCP и отправьте их все сразу. Использование стандартного пакета ввода-вывода UNIX и сброс записи перед каждым чтением обычно работает.
Нэгл считает отложенные ACK «плохой идеей», поскольку уровень приложения обычно не отвечает в пределах временного окна. [2] Для типичных случаев использования он рекомендует отключать «отложенный ACK» вместо своего алгоритма, поскольку «быстрые» ACK не несут столько накладных расходов, как многие небольшие пакеты. [3]
Отключение Nagle или отложенного ACK
Реализации TCP обычно предоставляют приложениям интерфейс для отключения алгоритма Нэгла. Обычно это называется TCP_NODELAY
опцией. В Microsoft Windows TcpNoDelay
переключатель реестра определяет значение по умолчанию. TCP_NODELAY
присутствует со стека TCP / IP в 4.2BSD 1983 года, у него много потомков. [4]
Интерфейс для отключения отложенного ACK не согласован между системами. TCP_QUICKACK
Флаг доступен на Linux с 2001 года (2.4.4) и , возможно , на Windows, где официальный интерфейс SIO_TCP_SET_ACK_FREQUENCY
. [5] Установка значения TcpAckFrequency
1 в реестре Windows по умолчанию отключает отложенное подтверждение ACK. [6]
Отрицательный эффект при записи большего размера
Алгоритм Нэгла применяется к записи данных любого размера. Если данные в одной записи охватывают 2 n пакетов, где есть 2 n -1 полноразмерных TCP-сегментов, за которыми следует частичный TCP-сегмент, исходный алгоритм Нэгла задержит последний пакет, ожидая отправки дополнительных данных (в заполнить пакет) или ACK для предыдущего пакета (указывающего, что все предыдущие пакеты покинули сеть). [7]
В любом протоколе приложения «запрос-ответ без конвейера» с остановкой и ожиданием, где данные запроса могут быть больше, чем пакет, это может искусственно наложить задержку в несколько сотен миллисекунд между запрашивающей стороной и отвечающей стороной. Первоначально это не считалось проблемой, поскольку любой протокол остановки и ожидания без конвейера, вероятно, изначально не предназначен для достижения высокой производительности, поэтому дополнительная задержка в несколько сотен миллисекунд не имеет большого значения. Более поздняя доработка алгоритма Нэгла, названная модификацией Миншалла [8], решила эту проблему с помощью протоколов остановки и ожидания, которые отправляют одно сообщение, а затем ждут подтверждения перед отправкой следующего, устраняя для них стимул отключить алгоритм Нэгла (хотя такие протоколы по-прежнему будут ограничены их конструкцией до одного обмена сообщениями на время кругового обхода сети).
В общем, поскольку алгоритм Нэгла является лишь защитой от небрежных приложений, отключение алгоритма Нэгла не принесет пользы наиболее тщательно написанным приложениям, которые должным образом заботятся о буферизации. Отключение алгоритма Нэгла позволит приложению иметь в сети одновременно много маленьких пакетов, а не меньшее количество больших пакетов, что может увеличить нагрузку на сеть и может улучшить или не улучшить производительность приложения.
Взаимодействие с системами реального времени
Приложения, которые ожидают ответов в реальном времени и с малой задержкой, могут плохо реагировать с алгоритмом Нэгла. Такие приложения, как сетевые многопользовательские видеоигры или движение мыши в дистанционно управляемой операционной системе, ожидают, что действия будут отправлены немедленно, в то время как алгоритм намеренно задерживает передачу, увеличивая эффективность полосы пропускания за счет задержки . По этой причине приложения с узкополосной передачей, зависящей от времени, обычно используют TCP_NODELAY
для обхода задержки ACK с задержкой по Нэгла. [9]
Другой вариант - использовать вместо этого UDP .
Реализация операционных систем
Большинство современных операционных систем реализуют алгоритмы Нэгла. В AIX [10], Linux и Windows [11] он включен по умолчанию и может быть отключен для каждого сокета с помощью TCP_NODELAY
параметра.
Рекомендации
- ^ Джон Нэгл (19 января 2006 г.), Повышение производительности сокетов в Linux , Slashdot
- ^ Нэгл, Джон. «Вздох. Если вы выполняете массовую передачу файлов, вы никогда не столкнетесь с этой проблемой. (Ответ 9048947)» . Хакерские новости . Проверено 9 мая 2018 .
- ^ Нэгл, Джон. «Тот фиксированный таймер задержки ACK на 200 мс был ужасной ошибкой. Почему 200 мс? Время реакции человека. (Ответ 9050645)» . Хакерские новости . Проверено 9 мая 2018 .
- ^ Руководство по интерфейсам ядра FreeBSD -
- ^ "сокеты - C ++ отключить отложенное подтверждение в Windows" . Переполнение стека .
- ^ «Новая запись реестра для управления поведением подтверждения TCP (ACK) в Windows XP и Windows Server 2003» .
- ^ «Проблемы с производительностью TCP, вызванные взаимодействием между алгоритмом Нэгла и отложенным ACK» . Stuartcheshire.org . Проверено 14 ноября 2012 года .
- ^ Предлагаемая модификация алгоритма Нэгла . ID draft-minshall-nagle.
- ^ Ошибка 17868 - Некоторые приложения Java медленно работают с удаленными X-соединениями .
- ^ «Центр знаний IBM» . www.ibm.com .
- ^ «Как отключить алгоритм Нэгла в Linux?» . Переполнение стека .
- Ларри Л. Петерсон , Брюс С. Дэви (2007). Компьютерные сети: системный подход (4-е изд.). Морган Кауфманн. п. 402–403. ISBN 978-0-12-374013-7.CS1 maint: использует параметр авторов ( ссылка )
Внешние ссылки
- Задержки Нэгла в алгоритме Нэгла
- Алгоритм Нагла
- Проблемы с производительностью TCP, вызванные взаимодействием алгоритма Нэгла и отложенного ACK
- Проблемы проектирования - отправка небольших сегментов данных по TCP с помощью Winsock