• 为什么抓包软件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的。

  • 相关阅读:
    关于同步解释
    dll 问题 (转)
    SQL SERVER 触发器中如何调用外部程序
    SQL SERVER所有表、字段名、主键、类型、长度、小数位数等信息
    variant 和 Stream 的互換
    Variant的相关函数
    使用 wxPython 创建“目录树”(5)
    wxPython 绘图演示——模拟雷达信号图(2)
    wxpython 实现简易画板(1)
    使用 wx.tools.img2py (4)
  • 原文地址:https://www.cnblogs.com/airoot/p/14356850.html
Copyright © 2020-2023  润新知