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

  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11363336.html
Copyright © 2011-2022 走看看