Алгоритм Нагла

редактировать

Алгоритм Нагла - это средство повышения эффективности сетей TCP / IP за счет уменьшения количества пакетов, которые необходимо отправить по сети. Он был определен Джоном Нэглом во время работы в Ford Aerospace. Он был опубликован в 1984 году как запрос на комментарии (RFC) под заголовком « Контроль перегрузки в межсетевых сетях IP / TCP» в RFC   896.

RFC описывает то, что он назвал «проблемой малых пакетов», когда приложение многократно передает данные небольшими порциями, часто размером всего 1 байт. Поскольку пакеты TCP имеют 40-байтовый заголовок (20 байтов для TCP, 20 байтов для IPv4 ), это приводит к 41-байтовому пакету для 1 байта полезной информации, а это огромные накладные расходы. Эта ситуация часто возникает в сеансах Telnet, где большинство нажатий клавиш генерируют один байт данных, который передается немедленно. Что еще хуже, по медленным каналам многие такие пакеты могут передаваться одновременно, что может привести к перегрузке.

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

СОДЕРЖАНИЕ
  • 1 Алгоритм
  • 2 Взаимодействие с отложенным ACK
    • 2.1 Отключение Nagle или отложенного ACK
  • 3 Отрицательное влияние на большие записи
  • 4 Взаимодействие с системами реального времени
  • 5 Реализация операционных систем
  • 6 Ссылки
  • 7 Внешние ссылки
Алгоритм

RFC определяет алгоритм как

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

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

if there is new data to send then if the window size ≥ MSS and available data is ≥ MSS then send complete MSS segment now else if there is unconfirmed data still in the pipe then enqueue data in the buffer until an acknowledge is received else send data immediately end if end if end if
Взаимодействие с отложенным ACK

Этот алгоритм плохо взаимодействует с отложенными подтверждениями TCP (отложенный ACK), функцией, введенной в TCP примерно в то же время в начале 1980-х, но другой группой. При включенных обоих алгоритмах приложения, которые выполняют две последовательные записи в TCP-соединение, за которыми следует чтение, которое не будет выполнено до тех пор, пока данные из второй записи не достигнут места назначения, испытывают постоянную задержку до 500 миллисекунд, " Задержка ACK ". Рекомендуется отключить любой из них, хотя традиционно проще отключить Nagle, поскольку такой переключатель уже существует для приложений реального времени.

Решение, рекомендованное Нэглом, состоит в том, чтобы избежать отправки алгоритмом преждевременных пакетов путем буферизации записи приложения и последующей очистки буфера:

Решение на уровне пользователя - избегать последовательностей записи-записи-чтения на сокетах. Запись – чтение – запись – чтение в порядке. Запись – запись – запись в порядке. Но запись-запись-чтение - убийца. Так что, если вы можете, скопируйте свои небольшие записи в TCP и отправьте их все сразу. Использование стандартного пакета ввода-вывода UNIX и сброс записи перед каждым чтением обычно работает.

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

Отключение Nagle или отложенного ACK

Реализации TCP обычно предоставляют приложениям интерфейс для отключения алгоритма Нэгла. Обычно это называется TCP_NODELAYопцией. В Microsoft Windows TcpNoDelayпереключатель реестра определяет значение по умолчанию. TCP_NODELAYприсутствует со стека TCP / IP в 4.2BSD 1983 года, у него много потомков.

Интерфейс для отключения отложенного ACK не согласован между системами. TCP_QUICKACKФлаг доступен на Linux с 2001 года (2.4.4) и, возможно, на Windows, где официальный интерфейс SIO_TCP_SET_ACK_FREQUENCY. Установка значения TcpAckFrequency1 в реестре Windows по умолчанию отключает отложенное подтверждение ACK.

Отрицательный эффект при записи большего размера

Алгоритм Нэгла применяется к записи данных любого размера. Если данные в одной записи охватывают 2 n пакетов, где есть 2 n -1 полноразмерных TCP-сегментов, за которыми следует частичный TCP-сегмент, исходный алгоритм Нэгла задержит последний пакет, ожидая отправки других данных (в заполнить пакет) или ACK для предыдущего пакета (указывающего, что все предыдущие пакеты покинули сеть).

В любом протоколе приложения «запрос-ответ без конвейера» с остановкой и ожиданием, где данные запроса могут быть больше, чем пакет, это может искусственно наложить задержку в несколько сотен миллисекунд между запрашивающей стороной и отвечающей стороной. Первоначально это не считалось проблемой, поскольку любой протокол остановки и ожидания без конвейера, вероятно, изначально не предназначен для достижения высокой производительности, поэтому дополнительная задержка в несколько сотен миллисекунд не имеет большого значения. Более поздняя доработка алгоритма Нэгла, названная модификацией Миншалла, решила эту проблему с помощью протоколов остановки и ожидания, которые отправляют одно сообщение, а затем ждут подтверждения перед отправкой следующего, устраняя для них стимул отключать алгоритм Нэгла (хотя такие протоколы будут по-прежнему ограничены своей конструкцией до одного обмена сообщениями на время прохождения сети туда и обратно).

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

Взаимодействие с системами реального времени

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

Другой вариант - использовать вместо этого UDP.

Реализация операционных систем

Большинство современных операционных систем реализуют алгоритмы Нэгла. В AIX, Linux и Windows он включен по умолчанию и может быть отключен для каждого сокета с помощью TCP_NODELAYпараметра.

использованная литература
внешние ссылки
Последняя правка сделана 2024-01-10 05:54:30
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте