Различные 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 или разгрузка общей сегментации.
После их отключения не забудьте снова включить их: они серьезно улучшают производительность.