關於 TCP segment of a reassembled PDU
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
為什麼大家看到這個以後總是會往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協議就能識別這是一個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的標識!