【轉】談一下TCP segment of a reassembled PDU


今天利用windows查找功能對網絡上的一個共享文件夾里的內容 進行查找,發現查找網絡文件時流量巨大。好奇用wireshark抓包發現 wireshark Info欄里有很多“TCP segment of a reassembled PDU”提示信息。不解百度了一下發現大家都在詢問這個問題網上並沒有很好的解答。想到“TCP segment of a reassembled PDU”只是wireshark的提示信息,那么在sniffer pro里會給出什么樣的提示呢,用sniffer打開同樣的trace 發現里面提示“Continuation of missing frame”和"Continuation of frame xx"現在大概知道“TCP segment of a reassembled PDU”是什么意思,其實主機響應一個查詢或者命令時如果要回應很多數據(信息)而這些數據超出了TCP的最大MSS時,主機會通過發送多個數據包來傳送 這些數據(注意:這些包並未被分片)。對wireshark來說這些對相應同一個查詢命令的數據包被標記了“TCP segment of a reassembled PDU”

問題,wireshark如何識別多個數據包是對同一個查詢數據包的響應? wireshark是根據sequence number來識別,這些數據包ACK number是相同的,當然number的數值與查詢數據包中的next sequence number也是一樣的。

 

[背景知識] MTU: Maxitum Transmission Unit 最大傳輸單元

MSS: Maxitum Segment Size 最大分段大小(偶是直譯,翻譯的不好,不要打  俺PP)

PPPoE: PPP Over Ethernet(在以太網上承載PPP協議)

[分析過程] 先 說說這MTU最大傳輸單元,這個最大傳輸單元實際上和鏈路層協議有着密切的關系,讓我們先仔細回憶一下EthernetII幀的結構 DMAC+SMAC+Type+Data+CRC由於以太網傳輸電氣方面的限制,每個以太網幀都有最小的大小64bytes最大不能超過 1518bytes,對於小於或者大於這個限制的以太網幀我們都可以視之為錯誤的數據幀,一般的以太網轉發設備會丟棄這些數據幀。(注:小於 64Bytes的數據幀一般是由於以太網沖突產生的“碎片”或者線路干擾或者壞的以太網接口產生的,對於大於1518Bytes的數據幀我們一般把它叫做 Giant幀,這種一般是由於線路干擾或者壞的以太網口產生)

 由於以太網EthernetII最大的數據幀是1518Bytes這樣,刨 去以太網幀的幀頭(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域 2bytes)14Bytes和幀尾CRC校驗部分4Bytes(這個部門有時候大家也把它叫做FCS),那么剩下承載上層協議的地方也就是Data域最 大就只能有1500Bytes這個值我們就把它稱之為MTU。這個就是網絡層協議非常關心的地方,因為網絡層協議比如IP協議會根據這個值來決定是否把上 層傳下來的數據進行分片。就好比一個盒子沒法裝下一大塊面包,我們需要把面包切成片,裝在多個盒子里面一樣的道理。

 當兩台遠程PC互聯的時候,它們的數據需要穿過很多的路由器和各種各樣的網絡媒介才能到達對端,網絡中不同媒介的MTU各不相同,就好比一長段的水管,由不同粗細的水管組成(MTU不同 )通過這段水管最大水量就要由中間最細的水管決定。

 對 於網絡層的上層協議而言(我們以TCP/IP協議族為例)它們對水管粗細不在意它們認為這個是網絡層的事情。網絡層IP協議會檢查每個從上層協議下來的數 據包的大小,並根據本機MTU的大小決定是否作“分片”處理。分片最大的壞處就是降低了傳輸性能,本來一次可以搞定的事情,分成多次搞定,所以在網絡層更 高一層(就是傳輸層)的實現中往往會對此加以注意!有些高層因為某些原因就會要求我這個面包不能切片,我要完整地面包,所以會在IP數據包包頭里面加上一 個標簽:DF(DonotFragment)。這樣當這個IP數據包在一大段網絡(水管里面)傳輸的時候,如果遇到MTU小於IP數據包的情況,轉發設備 就會根據要求丟棄這個數據包。然后返回一個錯誤信息給發送者。這樣往往會造成某些通訊上的問題,不過幸運的是大部分網絡鏈路都是MTU1500或者大於 1500。

 對於UDP協議而言,這個協議本身是無連接的協議,對數據包的到達順序以及是否正確到達不甚關心,所以一般UDP應用對分片沒有特殊要求。

 對於TCP協議而言就不一樣了,這個協議是面向連接的協議,對於TCP協議而言它非常在意數據包的到達順序以及是否傳輸中有錯誤發生。所以有些TCP應用對分片有要求---不能分片(DF)。

 馬上請出今天第三位豬腳:MSS。 MSS最大傳輸大小的縮寫,是TCP協議里面的一個概念。 MSS 就是TCP數據包每次能夠傳輸的最大數據分段。為了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時 候往往用MTU值代替(需要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方 提供的MSS值得最小值確定為這次連接的最大MSS值。

 介紹完這三位豬腳s 我們回過頭來看前言里面的那個問題,我們試想一下,如 果我們在中間路由器上把每次TCP連接的最大MSS進行調整這樣使得通過PPPoE鏈路的最大MSS值加上數據包頭包尾不會超過PPPoE的MTU大小 1492這樣就不會造成無法通訊的問題.所以上面的問題可以通過iptcp adjust-mss 1452來解決。

 當然問題也可以通過修改PC機的MTU來解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM