Алгоритм Нэгла, названный в честь инженера Джона Нэгла, был разработан для уменьшения перегрузки сети, вызванной проблемами с небольшими пакетами в приложениях TCP. Реализации UNIX начали использовать алгоритм Nagle в 1980-х годах, и сегодня он остается стандартной функцией TCP.
Как работает алгоритм Нэгла
Алгоритм Nagle обрабатывает данные на отправляющей стороне приложений TCP с помощью метода, называемого nagling. Он обнаруживает сообщения небольшого размера и накапливает эти сообщения в более крупных TCP-пакетах перед отправкой данных по сети. Этот процесс позволяет избежать генерации излишне большого количества маленьких пакетов.
Техническая спецификация алгоритма Nagle была опубликована в 1984 году как RFC 896. Решения о том, сколько данных накапливать и как долго ждать между отправками, имеют решающее значение для его общей производительности.
Преимущества наглинга
Nagling может эффективно использовать пропускную способность сетевого соединения за счет добавления задержек или задержки. Пример, описанный в RFC 896, иллюстрирует потенциальные преимущества пропускной способности и причину его создания:
- Если приложение TCP, которое перехватывает нажатия клавиш клавиатуры, хочет передать получателю каждый набранный символ, оно может сгенерировать серию сообщений, каждое из которых содержит 1 байт данных.
- Прежде чем эти сообщения можно будет отправить по сети, каждое из них должно быть упаковано с информацией заголовка TCP, как того требует TCP/IP. Каждый заголовок имеет размер от 20 до 60 байт.
- Без лишних слов этот пример приложения будет генерировать сетевые сообщения, состоящие на 95 процентов или более из информации заголовка (по крайней мере, 20 из 21 байта) и на 5 процентов или менее фактических данных с клавиатуры отправителя. С помощью алгоритма Нэгла те же данные можно было бы доставить с использованием меньшего количества сообщений, что привело бы к значительной экономии полосы пропускания.
Приложения контролируют использование алгоритма Nagle с помощью параметра программирования сокетов TCP_NODELA. Системы Windows, Linux и Java обычно включают Nagle по умолчанию. Следовательно, приложения, написанные для этих сред, должны указывать TCP_NODELAY, чтобы отключить алгоритм.
Ограничения
Приложения, требующие быстрого отклика сети, такие как видеозвонки и онлайн-игры, могут плохо работать при включенном Nagle. Задержки, вызванные тем, что алгоритму требуется дополнительное время для сборки небольших фрагментов данных, могут вызвать заметное отставание визуально на экране или в цифровом аудиопотоке. Такие приложения обычно отключают Nagle.
Этот алгоритм изначально был разработан в то время, когда компьютерные сети поддерживали меньшую пропускную способность, чем сегодня. Описанный выше пример был основан на опыте Джона Нэгла в Ford Aerospace в начале 1980-х годов, когда неудобные компромиссы в медленной, сильно загруженной сети дальней связи Ford имели смысл. Сегодня все меньше ситуаций, когда сетевые приложения могут извлечь выгоду из его алгоритма.
Алгоритм Nagle можно использовать только с TCP. Другие протоколы, такие как UDP, не поддерживают его.