Что случилось с TCP Nagle Flush?
Согласно этой статье, посвященной Socket FAQ, алгоритм Nagle является одним из многих алгоритмов, которые могут привести к тому, что группа данных будет находиться в буфере TCP и не попадать в сеть. Задержка по алгоритму Nagle может составлять до 200 мс.
По какой-то причине алгоритм Nagle может быть полностью отключен, но не очищен только один раз. Это действительно озадачивает меня. Почему нельзя сказать, что "только один раз, не ждите больше данных. Просто ведите себя так, как будто 200 мс Нэгла истекли".
Разве это не имеет смысла и не обеспечивает хорошего баланса между Nagle вообще, Nagle все время и реализацией собственного протокола с нуля?
2 ответа
Хороший вопрос. Я думаю, что никто никогда не нуждался в этом, или они обошли это. Если я правильно помню, включение TCP_NODELAY
толкает данные сразу. Тогда вы можете просто отключить его.
Конечно, это связано с высокой стоимостью двух системных вызовов для "сброса". Что вы могли бы сделать: send(2)
, на реализациях Unix имеет flags
аргумент. Вы можете реализовать свой собственный флаг, что-то вроде: MSG_JUSTPUSHIT
(хорошо, может быть, другое имя) и рассмотреть его в tcp_output
,
В чувствительных к производительности приложениях, где задержки, вызванные алгоритмом Nagle, являются проблемой, часто проще просто полностью отключить алгоритм Nagle и эмулировать его пакетирование в программном обеспечении с помощью ввода / вывода с разбросом (например, writev()
или путем реализации буферизации в программном обеспечении, где это необходимо). В качестве дополнительного бонуса выполнение этого снимает некоторые системные вызовы.
Кроме того, вы можете открыть два отдельных сокета и отключить Nagling на одном из них. Просто помните, что данные, отправленные на одном сокете, не обязательно синхронизируются с другим.