wireshark抓包遇到了ip total len = zero

来源:互联网 发布:64码高清网络电视 手机 编辑:程序博客网 时间:2024/05/03 08:17

遇到了一个ip total len=zero的包,很奇怪,为什么ip total len会等于0呢?

我们知道wireshark依赖libpcap这个库进行抓包

一、libpcap的工作原理

   libpcap主要有两部分组成,网络分接头(Network Tap)和数据过滤器(Packet Filter)。网络分接头从网络设备驱动程序中手机数据拷贝,过滤器决定是否接收该数据包。libpcap利用BSD Packet  Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝数据包的哪些内容,然后将过滤后的数据给过滤器相关联的上层应用程序。

   libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用已经创建的socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用于已经定义好的过滤规则对数据包逐一进行匹配,匹配成功则放入内核缓冲区,并传递给用户层缓冲区。---以上工作原理来自http://blog.chinaunix.net/uid-21556133-id-120228.html


二、什么是TSO(TCP segmentation offload)

  TSO是一种利用网卡的少量处理能力,降低CPU发送数据包负载的的技术,需要网卡硬件及驱动的支持。

 1.1、在不支持TSO的网卡上的数据的发送过程

   我们知道TCP层具有MSS选项字段,该字段的值是建立连接时,根据网卡的MTU确定和双方商量共同决定的,取最小值。在一个网卡的MTU=1500的链路上,MSS的值不会超过MTU的值。当TCP向下层发送数据的过程中,不会大于MSS-TCP-IP头的值。所以在不支持TSO的网卡上,我们知道分段是在传输层有TCP分段,并计算好TCP头和IP头发送到网卡上。

 1.2、支持TSO的网卡数据的发送过程

   当网卡支持TSO的时,TCP层会逐渐增大MSS,当TCP层发送大数据块的时候,仅仅只计算TCP头,网卡接收到IP层传下的大数据包后由网卡分成若干个IP数据包,添加IP头,复制TCP头,并重新计算total len、check sum等相关数据,这样就把一部分CPU相关的处理工作转移到由网卡来处理。在这个过程中TCP/IP协议栈不会处理segmentation,而是有网卡来处理


三、为什么wireshark会出现total len为0的情况

  TSO的实现是需要网卡驱动来支持的,有intel所支持的一个网卡驱动em driver在支持 TSO的某个版本,在传输的过程中,当调用em_tso_setup的时候,包的ip_len和ip_chsum就会被设置为0(此时的包已经进入网卡,需要重新设置IP头),发送出去的包会重新设置IP包头信息。由于libpcap是从网卡拷贝数据,所以就会把设置为0的包拷贝出来,然后传送给BPF,这也就导致了我们看到了ip_len=0的情况。这个BUG已经在后续的版本中进行了修复。


四、网卡的offload机制

  2012年以后,大量民用网卡开始采用offload技术,此技术就是将包的分片,重组,校验等从CPU计算,转移到网卡硬件上进行计算,从而减轻了CPU的计算压力。因此,采用此技术的机器,在数据链路层收到的包,很多时候都会大于MTU=1514的情况。大部分的网络数据包捕获工具都是采用协议栈的数据链路层的旁路捕获模式,所以有些时候会捕获到大于1514字节的包。如果要真正分析网络状况,需要关闭offload,或者在其他节点抓包。目前主要的机制有TSO,GSO,TRO,GRO等机制。

个人观点,如有错误,请指正。

原创粉丝点击