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下如何修改该参数:

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

posted @ 2019-07-04 14:36  feihum  阅读(1367)  评论(0编辑  收藏  举报