zoukankan      html  css  js  c++  java
  • wireshark抓到tcp包大于mss的包

    现象:

    1、在电脑A上挂一个程序,上传数据的时候,用wireshark抓包,偶然发现发送的包居然有上万的。回想起mss,tcp连接不是会协商mss吗?

    2、在电脑B上写个tcp连接的程序,上传数据,发现wireshark抓包全部小于mss.

    关于第一个问题,问过熊大神,告诉我wireshark上抓的不是单个ip包。稍微释疑。

    继续百度,看到一篇csdn文章说到是网卡在做分段的工作。提到几个关键词:LSO, TSO, 卸载。

    想起前段时间测试网卡的时候,网卡有些地方可以配置。然后在电脑A网卡配置处找到一处" 大量发送卸载(IPv4)",发现开关这个选项,会完全影响wireshark抓到的tcp包的大小。

    结论:

    A、现象1产生的原因,在于网卡做分段的工作,wireshark在网卡分段之前就抓包了。

    B、电脑A与B表现不同,在于LSO的运行。LSO的运行取决与3点:

    1、操作系统支持。(电脑B的系统不支持,所以无论怎么配置也没用)

    2、网卡支持。

    3、配置网卡,打开选项。

    在测试的时候,发现有些时候用wireshark抓到的包中含有很多大于mtu的数据包。于是试了一下,在本机抓包和在通信的对端同时抓包,发现本机上抓到了大于mtu的包,但是对端却没有这种包。可以推断出数据包在最后发出去的时候,还是进行了切分。

    从这个现象大概也可以猜测出wireshark抓包的机制,大概是在什么地方抓取的包。

    于是想了想网卡上有没有什么参数可以配置来解决这个问题,最后发现一个参数“大量发送卸载”,顺手百度了一下,大概意思就是开启之后由网卡来执行对大块数据的切分操作,这样可以降低操作系统的压力。把这个功能禁用之后,果然抓到的包中就没有大于mtu的数据报文了。

    于是可以猜想,系统在通过网卡发送数据的时候,是往一个缓冲区中放入数据,当开启网卡的“大量发送卸载”功能时,系统就不会计算每个data段的长度,只管往缓冲区写入数据,最后分包的操作由网卡来完成。当关闭这个参数的时候,系统写入缓冲区的数据是根据mtu计算好的。 由此也可以猜测出wireshark抓的就是这个缓冲区中的内容。 不过这一些都是我根据现象进行的一些猜测,没有深入进行验证。

    server 2008下如何修改该参数:

    网卡属性->高级->“大量发送卸载” 禁用

  • 相关阅读:
    Java面试题 OOAD & UML+XML+SQL+JDBC & Hibernate
    Java面试题 corejava(二)
    Java面试题 corejava(一)
    Java 笔试题(一)
    大数据离线分析平台 用户数据Etl
    Spfa【p1186】 玛丽卡
    牛客nowcoder Noip提高组第四场
    分层图【p4568】 [JLOI2011]飞行路线
    10.06 国庆节第九场模拟赛
    10.04 国庆节第七场模拟赛
  • 原文地址:https://www.cnblogs.com/feihum/p/11132302.html
Copyright © 2011-2022 走看看