網上胡說八道,衆說風雲,感受這篇還算靠譜點。算法
原文連接: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鏈接的包:socket
網上不少人在解釋這個「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!.net
是的,這就是緣由。接下來,爲何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的標識!blog
本質上來說,reassembled PDU要向上看,而不是去考慮什麼底層的MTU,TSO什麼的。Wireshark根據它能識別的應用層協議,告訴你哪些數據是屬於一個應用層消息的。就這麼簡單。開發