使用tcpdump抓包时,会抓到长度超过MTU(默认设置1500)的数据包,如下图:
这里有几种可能的情况
1,巨型帧(Jumbo Frames)
巨型帧,是指有效负载超过IEEE 802.3标准所限制的1500字节的以太网帧。通常来说,巨型帧可以携带最多9000字节的有效负载。许多以太网千兆以太网以太网交换机和千兆网卡可以支持巨型帧。
这种情形可以通过查看网口mtu来确定,如果MTU是9000,说明这个口开启了巨型帧。可以接收到长度超过1514的数据包。
2,TSO,GRO,GSO数据流分组重组
上述三个功能很类似,都是网卡驱动层提供的流分组重组技术,用于减轻CPU负载。简单说就是通过将TCP或IP数据分包发送的工作,推迟到网卡驱动层实现,来加速数据传输。比如内核可以发送一个14K的长包,驱动层就会给长包分成10个小于1514的包,发送出去。接收过程也一样,网卡驱动在收到多个同一会话的包后,组合成一个超过1514的长包,发送给内核。
tcp-segmentation-offload
generic-receive-offload
generic-segmentation-offload
这三个是相应的选项,可以用ethtool查看或配置。
这里的GRO选项开启后,网卡收到的TCP数据流,可以在发送给内核之前,进行流重组,生成大于MTU值的数据包。
当然笔者这里是因为服务器开启了tso导致的
通过linux命令,可以打开和关闭tso功能:
ethtool -K eth0 tso on
ethtool -K eth0 tso off