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下如何修改该参数:
网卡属性->高级->“大量发送卸载” 禁用