Назад | Перейти на главную страницу

Сообщения TCP объединены?

У меня есть приложение, которое отправляет 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

Подробнее о разгрузке читайте в этот старый вопрос.