You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用AF_PACKET原始套接字收到的数据包大小超过MTU?

问题原因

你观察到的超过1500 MTU的报文,既不是对端发送了超MTU的报文,也不是内核违反手册规则做了IP分片重组,根本原因是接收端开启了**通用接收卸载(GRO, Generic Receive Offload)**特性。

原理说明

  • 从你提供的ethtool -k输出可以看到,两台机器的generic-receive-offload参数都处于on状态。GRO是Linux内核网络栈/网卡驱动层面的接收侧优化,会把属于同一个TCP流的多个连续、顺序到达的小包合并为一个更大的包,再向上层传递。
  • man 7 packet中提到的「packet套接字不会重组IP分片」仅针对IP层的分片报文合并场景,GRO是传输层的同流报文合并,不属于该规则的约束范围,因此AF_PACKET原始套接字会直接收到GRO合并后的超大包。
  • 你之前关闭的TSO、散列收集等都是发送侧的卸载特性,对接收侧的GRO没有影响。

验证方案

你可以执行以下命令关闭接收端(192.168.30.3)的GRO特性,再重新跑测试,就不会再收到超过MTU的报文:

ethtool -K ens3 gro off

如果仍有异常,可以同步关闭发送端的GRO特性,执行相同命令即可。

补充:你当前使用的QEMU e1000虚拟网卡本身也支持GRO特性,即使底层物理网络没有开GRO,虚拟网卡层也会完成小包合并逻辑,关闭GRO参数即可禁用该行为。

内容的提问来源于stack exchange,提问作者sebastien dontneedtoknowthat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:21:01