Различные TCP-пакеты, захваченные на отправителе и получателе

Я использую tcpdump/wireshark для захвата пакетов TCP, в то время как клиент TCP отправляет данные на сервер TCP. Клиент просто отправляет 4096 байт на сервер за один вызов "send()". И я получаю разные tcp-пакеты на двух сторонах, два пакета на стороне отправителя кажутся "уплотненными" на стороне получателя, это противоречит тому, как я понимаю протокол tcp, и я застрял в этой проблеме на несколько дней и мне действительно нужно немного Помогите.

Обратите внимание на длину пакета в следующих пакетах:

клиент (отправитель) отправляет 2 пакета 0Xbcac (4) и 0xbcae (5), отправляет всего 2896 + 1200 = 4096 байт.

(0xbcac) 4  14:31:33.838305 192.168.91.194  192.168.91.193  TCP 2962    59750 > 9877 [ACK] Seq=1 Ack=1 Win=14720 **Len=2896** TSval=260728 TSecr=3464603    0
(0xbcae) 5  14:31:33.838427 192.168.91.194  192.168.91.193  TCP 1266    59750 > 9877 [PSH, ACK] Seq=2897 Ack=1 Win=14720 **Len=1200** TSval=260728 TSecr=3464603    0

Однако на стороне сервера (получателя) представлен только один пакет с ip.id=0xbcac и length = 4096 (receiver.packet.0xbcac = sender.packet.0xbcac + 0xbcae):

(0xbcac) 4  14:31:33.286296 192.168.91.194  192.168.91.193  TCP 4162    59750 > 9877 [PSH, ACK] Seq=1 Ack=1 Win=14720 **Len=4096** TSval=260728 TSecr=3464603   0

Я знаю, что tcp является потоковым протоколом, и отправленные данные могут быть разделены на пакеты в соответствии с MSS (или MTU), но я предполагаю, что разделение происходит до того, как пакеты отправляются в NIC, то есть до захвата. Мне также известно, что флаг PSH в пакете 0xbcae приводит к записи данных из буфера в NIC, но это не может объяснить "уплотненный" пакет. Также я попытался в клиенте отправить 999999 байт за один вызов "send", и данные были разделены на небольшие пакеты и отправлены, но все равно не совпадали с пакетами, полученными на стороне сервера. Наконец я отключаю tcp nagle, получаю тот же результат и исключаю эту причину.

Таким образом, мой вопрос - несоответствие, с которым я столкнулся, нормальный? Если это так, что вызвало это? Если нет, я использую Ubuntu 12.04 и Ubuntu 13.10 в локальной сети, и какова возможная причина этого "уплотненного" пакета?

Заранее благодарю за любую помощь!

1 ответ

Решение

два пакета на стороне отправителя кажутся "уплотненными" на стороне получателя

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

Чтобы проверить, так ли это, вы можете попробовать отключить его, используя:

$ ethtool -K eth0 gro off
$ ethtool -K eth0 lro off

Что-то дополнительное происходит на стороне отправки: разгрузка сегментации tcp или разгрузка общей сегментации.

После их отключения не забудьте снова включить их: они серьезно улучшают производительность.

Другие вопросы по тегам