現象:
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下如何修改該參數:
網卡屬性->高級->“大量發送卸載” 禁用