为什么抓包软件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,请使用如下命令:

  ethtool --show-offload eth0 

  这时候我们来禁用一下tso,只需要执行如下命令

  ethtool -K eth0 tso off 

  再来一轮抓包测试,发现数据包终于正常了,不再会大于MTU了。

  其实无论服务器发送的包多大,反正最终都会被分片,可能是操作系统,可能是网卡,因此客户端收到的包都是小于MTU的。

  分片
  为什么ip有分片了,tcp还要再搞一个分片呢?因为ip层不保证数据成功送达,并且ip层分片可能发生在源主机,也可能在路由器上,一旦有分片丢失,将会造成整个ip包重传(其实这个重传是tcp层发起的,因为目标机器没有收到完整的ip包,也不会有ack,那么源机器在一定时间内就会发起重传,导致整个tcp包又被传了一次),因此就有了tcp分片,当一片数据丢失,只需要重传丢失的那一片即可。

  结论
  抓包的数据是在包送到网卡之前的信息,所以在tcpdump里面的包大小可能会大于MTU,但是一旦数据进入网卡后的处理信息在tcpdump里面是反应不了的,因此数据包被分片这样的消息自然是没办法知道,只有在目标方才能反应出具体的分包细节。所以这次发现tcp/ip包长大于MTU其实算是个“假象”,因为在真正的链路层上传输数据时是不会大于MTU的。

原文地址:https://www.cnblogs.com/airoot/p/14356850.html