Что случилось с флешкой TCP Nagle? - PullRequest
5 голосов
/ 18 июля 2011

Согласно этой статье по Socket FAQ , алгоритм Nagle является одним из многих алгоритмов, которые могут заставить кучу данных находиться в буфере TCP и не попадать в сеть.Задержка алгоритма Nagle может составлять до 200 мс.

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

Разве это не имеет смысла, и ударитьхороший баланс между Nagle вообще, Nagle все время и внедрением собственного протокола с нуля?

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Хороший вопрос.Думаю, никто никогда не нуждался в этом, или они обошлись.Если я правильно помню, включение TCP_NODELAY подталкивает данные немедленно.Затем вы можете просто отключить его.

Конечно, это связано с высокой стоимостью двух системных вызовов для "сброса".То, что вы могли бы сделать: send(2), в реализациях Unix имеет аргумент flags.Вы можете реализовать свой собственный флаг, например: MSG_JUSTPUSHIT (хорошо, может быть, другое имя) и рассмотреть его в tcp_output.

0 голосов
/ 18 июля 2011

В приложениях, чувствительных к производительности, где задержки, вызванные алгоритмом Nagle, являются проблемой, часто проще просто полностью отключить алгоритм Nagle и эмулировать его пакетирование в программном обеспечении с помощью ввода-вывода с разборкой / сборкой (например, writev(), либо путем реализациибуферизация в программном обеспечении, где это необходимо).В качестве дополнительного бонуса выполнение этого снимает некоторые накладные расходы на системные вызовы.

Кроме того, вы можете открыть два отдельных сокета и отключить Nagling на одном из них.Просто помните, что данные, отправленные на одном сокете, не обязательно синхронизируются с другим.

...