網上胡說八道,眾說風雲,感覺這篇還算靠譜點。
原文鏈接:http://blog.csdn.net/dog250/article/details/51809566
為什么大家看到這個以后總是會往MSS,TSO上聯系呢?也許第一個解釋這個的人是個高手,而且以MSS/MTU/TSO的觀點解釋了這個問題,還有一種可能就是TSO等技術讓人覺得太牛逼,畢竟是底層硬件機制吧,抓包機制又是作用於網卡層面的,所以很自然會覺得TSO會有關聯。
事實上,這個跟TSO沒有關系!跟MSS有一定的關系但不是全部因果關系,在闡述“TCP segment of a reassembled PDU”之前,先把TSO理清再說。當有人問題“這個包會不會被TSO分段”這類問題時,只要看該TCP數據包的長度,拿它跟MTU比較,如果數據長度更長,則就是TSO。
那么,“TCP segment of a reassembled PDU”究竟是什么呢?答案是,這要向上看,這個跟應用層有關,而與底層關系不大!我用Wireshark的抓包例子來解釋這個問題。首先看一個抓包,我們以網絡測試工具baidu為例,抓取一個訪問其服務器https://14.215.177.38/的一個HTTPS連接的包:

網上很多人在解釋這個“TCP segment of a reassembled PDU”的時候(基本都是轉載),都說什么“ACK了同一筆數據就會是reassembled PDU”,“同一個GET請求的response”雲雲...但是很顯然,上述我抓包的截圖中,402到405號包都有ACK了同一個序列號,但是為什么只有一個“TCP segment of a reassembled PDU”呢??在沒有標識reassembled PDU的數據包中,另外標識了TLSv1.2的協議原語。此時,我來做一個動作,按下“Ctrl-Shift-E”組合鍵,事實上就是點擊“分析”菜單,進入“已啟用的協議”界面:

反選SSL協議,不再識別SSL協議之后,我們再看402到405號數據包:

沒有了“TCP segment of a reassembled PDU”這些,除了沒有這些“修飾語”之外,其它的協議層面的數據完全和之前識別SSL協議的時候相符合。我們的結論是,關掉了對SSL協議的識別,就沒有了reassembled PDU的修飾,這恰恰是因為SSL協議讓Wireshark知道403號包是一個reassembled PDU!如果你不知道這是個SSL協議,你就無法判斷出這是不是一個reassembled PDU!
是的,這就是原因。接下來,為什么SSL協議就能識別這是一個reassembled PDU呢?這就要看你對SSL協議是否理解了,起碼我是懂的,在握手階段,Server Hello和Server的Certificate是背靠背發送的,也就是說它們是連着發給Client的,一個Server Hello,外加一個證書,一起發給Client,接下來就是不那么根本但很顯然的事情了,如果這些包的總和足夠小或者鏈路的MTU足夠大,能夠一次性發送過去的話,那當然好,如果不能,很顯然要拆成幾個分段發送了,如果中間的那個分段不能被SSL協議的原語識別,那么就會被標識成reassembled PDU,這就是為什么404,405號數據包都是連續發送的,但是卻未被識別為reassembled PDU,因為SSL協議知道它們是Certificate消息和Server Key Exchange消息。
現在明白了嗎?我特意沒有用HTTP協議去解釋這個而是選擇了用SSL協議,目的就是想讓大家明白,並不是針對同一個GET請求的同一筆回應會被標識為reassembled PDU!而是完全靠着應用層協議原語來識別協議消息。如果你的Wireshark被配置成不識別任何協議,比如不識別HTTP協議,SSL協議,那也就不會出現reassembled PDU了,因為Wireshark不知道到底是不是!實際上Wireshark支持你去自定義你自己的協議插件,你可以試一下,自己開發一個簡單的協議,就算你的TCP數據段總和沒有超過一個MSS,比如你的socket每發100字節就sleep 10秒,並且TCP socket沒有設置Nagle算法,那么雖然每個段只有100字節,遠沒有到一個MSS,也會有reassembled PDU的標識!
本質上來講,reassembled PDU要向上看,而不是去考慮什么底層的MTU,TSO什么的。Wireshark根據它能識別的應用層協議,告訴你哪些數據是屬於一個應用層消息的。就這么簡單。
順便提一下
如果你也喜歡Python 這里有一群Python愛好者匯集在此。
關注微信公眾號:【軟件測試技術】,回復 888,獲取QQ群號。
