У меня есть приложение, которое отправляет 100 из 186-байтовых (без учета заголовков) TCP-сообщений один за другим без промежутка между хостом A и хостом B.
Я запустил tcpdump для захвата пакетов на хосте A (где находится отправитель) и заметил, что после нескольких сообщений (например, 9) следующие ~ 25 сообщений были объединены в одно сообщение 5 + K.
Я уже отключил алгоритм Нагла через setsockopt () в приложении-отправителе, и вычисленные окна TCP всегда превышают 14 Кбайт. Следовательно, не похоже, что первые 9 сообщений заполнили хост B, а хост B попросил хост A замедлиться.
Любые советы о том, как выяснить, почему сообщения TCP были объединены?
Спасибо!
У меня есть приложение, которое отправляет 100 из 186-байтовых (без учета заголовков) TCP-сообщений один за другим без промежутка между хостом A и хостом B.
Тогда вы можете отправлять их быстрее, чем сеть может их транспортировать, и в этом случае к тому времени, когда реализация TCP на отправителе будет готова отправить пакет по сети, в очереди может быть несколько сообщений, и в этом случае это ' Я отправлю столько, сколько сможет в одном сегменте TCP. Протокол TCP предлагает службу байтового потока с нет понятие границ сообщения, так что это разрешено.
Я уже включил алгоритм Нагла
Алгоритм Нагла явно делает то, что вы говорите, TCP отправителя:
Алгоритм Нэгла работает, комбинируя несколько небольших исходящих сообщений и отправляя их все сразу.
так поворачивая это на не помешает этому. Поворачивая это выключен в некоторых случаях может предотвратить это, но, учитывая, что ваше приложение отправляет пакет сообщений, это, вероятно, не предотвратит этого.
(То есть, ответ на вопрос «почему TCP отправителя слил сообщения?» - «потому что может».)
То, что вы видите, скорее всего, связано с тем, что функциональность выгружается из сетевого стека ядра в сетевой интерфейс и / или драйвер.
Сетевой интерфейс по-прежнему будет получать отдельные пакеты из сети. Но перед тем, как пакеты передаются ядру, они объединяются либо интерфейсом, либо драйвером.
Вы можете увидеть текущие настройки всех функций разгрузки с помощью этой команды:
ethtool -k eth0
Если вы хотите отключить эту конкретную функцию, это можно сделать с помощью этой команды:
ethtool -K eth0 generic-receive-offload off
Подробнее о разгрузке читайте в этот старый вопрос.