为什么抓包软件TCP/IP包长会大于MTU?
MTU(Maximum Transmission Unit),即最大传输单元,意思是在网络通信协议里规定最大传输的字节数量,通常是1500字节(不同网络大小不一样,可使用ifconfig查看),最小是46。
但是抓包软件抓出来会发现有些数据包长度会大于MTU,理论上当IP包大于MTU时,会对包进行分片。既然会分片,那么这个包大于MTU是几个意思?
原因是这个分片不是发生在IP协议上,而是在TCP协议上,有个东西叫tso(tcp segment offload),意思是如果网卡支持tso,操作系统发送大的tcp包时,不需要消耗CPU来计算分片,而是将整个包发送到网卡,由网卡的NPU来进行分片处理。而抓包软件抓的仅仅是CPU处理后的信息,也就是说在发送方抓的时候还没到网卡就被CPU抓了,而真正的分片是由后面的网卡才分片{但是在接收端抓就会抓到已经分片的包了}
查看你网卡是否支持tso,请使用如下命令:
1 | ethtool --show-offload eth0 |
这时候我们来禁用一下tso,只需要执行如下命令
1 | ethtool -K eth0 tso off |
再来一轮抓包测试,发现数据包终于正常了,不再会大于MTU了。
其实无论服务器发送的包多大,反正最终都会被分片,可能是操作系统,可能是网卡,因此客户端收到的包都是小于MTU的。
分片
为什么ip有分片了,tcp还要再搞一个分片呢?因为ip层不保证数据成功送达,并且ip层分片可能发生在源主机,也可能在路由器上,一旦有分片丢失,将会造成整个ip包重传(其实这个重传是tcp层发起的,因为目标机器没有收到完整的ip包,也不会有ack,那么源机器在一定时间内就会发起重传,导致整个tcp包又被传了一次),因此就有了tcp分片,当一片数据丢失,只需要重传丢失的那一片即可。
结论
抓包的数据是在包送到网卡之前的信息,所以在tcpdump里面的包大小可能会大于MTU,但是一旦数据进入网卡后的处理信息在tcpdump里面是反应不了的,因此数据包被分片这样的消息自然是没办法知道,只有在目标方才能反应出具体的分包细节。所以这次发现tcp/ip包长大于MTU其实算是个“假象”,因为在真正的链路层上传输数据时是不会大于MTU的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本