tcpdump抓包抓到超过MTU大小的数据包是怎么回事?

使用tcpdump抓包时,会抓到长度超过MTU(默认设置1500)的数据包,如下图:

这是由于某些网卡支持一些特性会将数据包汇聚后统一上送,减少cpu的压力。实际上该数据包在网络中传输时,仍然是保持低于MTU大小在传输的。那么如何使tcpdump抓到真实的数据,不让网卡将数据包汇聚后再上传呢?

首先介绍下网卡硬件通常支持的几种特性:

1.TSO
TSO(TCP Segmentation Offload),是一种利用网卡对TCP数据包分片,减轻CPU负荷的一种技术,有时也被叫做 LSO (Large segment offload) ;
TSO是针对TCP的,UFO是针对UDP的。如果硬件支持 TSO功能,同时也需要硬件支持的TCP校验计算和分散/聚集 (Scatter Gather) 功能。

2.GSO
GSO(Generic Segmentation Offload),它比TSO更通用,基本思想就是尽可能的推迟数据分片直至发送到网卡驱动之前,此时会检查网卡是否支持分片功能(如TSO、UFO):
如果支持直接发送到网卡,如果不支持就进行分片后再发往网卡。这样大数据包只需走一次协议栈,而不是被分割成几个数据包分别走,这就提高了效率。

3.LRO
LRO(Large Receive Offload),通过将接收到的多个TCP数据聚合成一个大的数据包,然后传递给网络协议栈处理,以减少上层协议栈处理 开销,提高系统接收TCP数据包的能力。

4.GRO
GRO(Generic Receive Offload),基本思想跟LRO类似,克服了LRO的一些缺点,更通用。后续的驱动都使用GRO的接口,而不是LRO。

5.RSS
RSS(Receive Side Scaling),是一项网卡的新特性,俗称多队列。具备多个RSS队列的网卡,可以将不同的网络流分成不同的队列,再分别将这些队列分配到多个CPU核心上进行处理,从而将负荷分散,充分利用多核处理器的能力。

我们可以使用以下命令查看当前网卡的配置:

ethtool -k eth0

如果要关掉相应的功能,则可以使用以下命令:

ethtool -K eth0 gro off

当我们关掉网卡的聚合上送功能之后,再次tcpdump抓包,就可以看到真实正常的数据包了

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注

ICP备案号:辽ICP备20002814号-2