抓包调试时,发现tcpdump抓包长度大于1514,这里总结一下几种原因。
一般以太网数据包长度范围
标准以太网帧长度下限为:64 字节
标准以太网帧长度上限为:1518 字节
常见几个最大包长度值1492,1500,1514,1518
- 以太网MTU值
Maximum Transmission Unit,最大传输单元,指的是数据链路层的最大payload,由硬件网卡设置MTU,是一个硬性限制留给网络层的数据长度。在早期CSMA/CD机制中设计中,多个网卡在同一个以太网物理链路传输数据会互相影响,因此设置最大长度以免占用物理链路过长。
在Linux命令行中ifconfig,可以看到通常以太网接口MTU设置的值为1500。
这里的1500指是三层包(IP头以上)长度,对应标准以太网帧长度上限1518 字节。
- wireshark抓到的包长
通常最大包长显示为1514,对应标准以太网帧长度上限1518 字节。
- 家庭宽带路由器PPPoE接口
通常设置MTU为1492,对应标准以太网帧长度上限1518 字节。
上述几个数值可能过下面以太网数据包总长1518字节示意图解释:
Mac头长度14字节 | PPPoE头长度8字节 | IP报文 | CRC校验4字节 |
1518指的是以太网数据总长;
1500指的是以太网IP报文长度;
1514指的是内核收包,已校验完数据的长度;
1492指的是考虑PPPoE头需要设置的MTU值;
tcpdump抓包长度大于1514
一次调查问题时,发现抓包的数据长度大于1514:
这里有几种可能的情况
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值的数据包。
3,IP分片?
一些网卡支持IP分片的offload功能,但ethtool并没有相关的配置选项。如果实现了IP分片的offload功能,也可以收到长包。
总结一下
tcpdump抓包中:
存在9k以上的包,可能开启了TSO,GRO,GSO;
存在1514~9k的包可能开启了TSO,GRO,GSO或Jumbo Frames;
通过通过ifconfig 看MTU或ethtool看TSO,GRO,GSO来判断。
如果觉得系统受到长包影响,可以用ifconfig或ethtool关闭相应的功能。