zoukankan      html  css  js  c++  java
  • 解决wireshark抓包校验和和分片显示异常

    问题描述:

    在使用wireshark抓取报文时,发现从10.81.2.92发过来的报文绝大部分标记为异常报文(开启IPv4和TCP checksum)

    分析如下报文,发现http报文(即tcp payload)的长度远远大于实际的mss大小,如下图为4126

    • 查看该报文的ip长度,为4148,远大于Ethernet的mtu

    •  且tcp的校验和有来自wireshark的如下提示,那什么是“TCP checksum offload”呢?

    问题解决:

    •  在分析问题前,先给出上述问题答案,在10.81.2.92中关闭抓包的网卡的tso和tx功能.
    ethtool -K eth0 tso off
    ethtool -K eth0 tx off
    • 重新抓包,发现wireshark显示的报文长度和校验都已经正确

     

    问题分析:

    目前很多网卡已经支持IP片以及IP/TCP/UDP等协议的校验和计算,用来减少内核层面的运算(减少CPU负载),当协议层发现网卡支持相应的特性时,会将相应的处理交给网卡操作。如上面提到的校验和,正常情况下,校验和由对应的协议层处理,但在网卡使能情况下会将其推迟到网卡层面处理,网卡处理结束后直接发送,这就是为什么wireshark抓到的报文里面的校验和会提示不正确的原因,同样地,TCP会选择不大于滑动窗口的报文(该报文可能大于MSS),交由网卡去分片处理。使用ethtool -k 命令可以查看网卡支持的特性。

    • rx-checksumming/tx-checksumming:支持接收/发送方向的IP校验和计算;
    • scatter-gather:用于将一个buffer分割为多个小的部分,是实现tcp-segmentation-offload(TSO)的基础;
    • tcp-segmentation-offload(TSO):也被称为large send offload (LSO),用于将TCP按照实际的mss进行分段发送。接收方向的参数为large-receive-offload(LRO),仅支持TCP;
    • udp-fragmentation-offload(UFO):工作方式与tcp-fragmentation-offload类似;
    • generic-segmentation-offload(GSO):工作方式与TSO,UFO类似,但支持所有的网络协议。接受方向的参数为generic-receive-offload(GRO);GSO/GRO和的TSO/LRO的使用参见这篇文档  
    • rx-vlan-offload:移除接收到的vlan tag;
    • tx-vlan-offload:对出去的报文加上vlan tag;

     TIPS:

    • 类似地,如果抓UDP报文显示校验和等异常时,可以通过ethtool临时关闭UDP offload功能
    • TSO,UFO,GSO等功能可以提高报文交互能力,关闭会影响报文收发效率
    • 开启网卡的offload功能可能会规避防火墙对如分片攻击的检查

    参考:

    https://www.kernel.org/doc/Documentation/networking/checksum-offloads.txt

    https://access.redhat.com/solutions/288433

  • 相关阅读:
    使用Visual Studio .Net 做自己的汉化软件
    给所有的Control加两个属性,实现回车键自动跳转到下一个控件
    数字逗号标记—以前原创(一)
    解决w3wp.exe占用CPU和内存问题
    sql日期函数
    索引的使用总结
    w3wp.exe狂占内存
    w3wp.exe占内存CPU问题 WIN2003 IIS6.0假死现象的分析
    查看Linux系统日志
    linux动态增加LV空间
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11363336.html
Copyright © 2011-2022 走看看