01 引言
最近有位熱心讀者朋友給成哥發來私信,說他現在對IP分片有疑惑。
他讀過成哥的《wireshark數據包分析三闆斧》和《一文秒懂TCPIP實際五層結構》系列文章,直言對自己幫助很大,可以算是成哥的鐵粉了。
但是他在工作中遇到的IP分片現象和成哥文章中講的有出入,想和成哥探讨下具體原因。
成哥覺得這種精神非常好,盡信書不如無書,就要有自己的獨立思考。希望大家也多思考多給成哥提出意見和建議,十分感謝。
今天成哥借此文章,分享一下成哥和這位讀者的探讨過程。
02 提出挑戰
這位讀者在一次抓包分析的過程中,看到第四幀有"TCP segment of a reassembled PDU"字樣,不明白是何含義。截圖如下:
展開第四幀(分組4)和第五幀(分組5)進行查看後,發現自己更迷惑了。剛才是不明白那個英文字段是什麼含義,現在是連IP分片都暈了。覺得自己現有知識被颠覆了。
從第五幀的内容中看到,第四幀和第五幀進行了分片重組。Wireshark中有顯示"2 Reassembled TCP Segments"。如下圖所示。
在仔細查看第四幀和第五幀的IP協議字段,發現寫的是"Don't fragment",即"不分片"。如下圖所示。
這就不對了啊,"dont fragment"是不允許分片的意思,怎麼可能在進行分片重組呢?
03 成哥接鍋成哥看到此疑惑後,首先對這位讀者進行了安撫。告訴他看到的現象沒錯,數據包确實有"Reassembled"等字眼。但成哥在系列文章中講的也沒錯。
誰都沒錯,那這個"Reassembled現象和文章中講述的為何不同呢?
哈哈,要是必須追責,那就追責成哥吧,隻怪成哥的《一文秒懂TCPIP實際五層結構》系列文章,限于篇幅,講的不夠深入,這種場景沒有提到。
現在幫大家把知識點補上,希望大家見諒。
首先複習一下成哥在IP協議中講的"标志字段"和"MSS"内容。
(1)标志字段
标志字段屬于IP協議頭部字段中的一部分,如下圖所示:
标志字段用其中一個bit來表示"更多的片 MF (More fragement)"; 标志字段中有一個bit稱作"不分片 DF(Don't fragment)"位;如果将這一比特置1,IP将不對數據報進行分片。相反會把數據包丢棄并發送一個ICMP差錯報文給起始端。
标志字段内容如下圖所示:
(2)MSS最大分節尺寸
MSS:maximum segment size,為TCP數據包每次傳輸的最大數據分段大小。TCP協議在建立連接的時候通常要協商雙方的MSS值,通訊雙方會根據雙方提供的MSS值的最小值确定為這次連接的最大MSS值。
MSS值為MTU值減去IPv4 頭部和TCP 得頭部得到。
04 答疑解惑成哥拿過數據包,看到有"TCP segment of a reassembled PDU"字樣,就明白症結所在了。"TCP segment of a reassembled PD"的字面含義是"TCP報文段的重組裝PDU"。PDU是協議數據單元Protocol Data Unit的縮寫。
這裡先不着急解釋其含義,大家繼續往下看。
我們知道TCP報文不會分片,原因是TCP會話建立的前兩個包中包含MSS,用于協商兩端每次傳輸的最大數據包尺寸。如下圖所示:
我們看到這裡MSS=1400,說明每個TCP報文的大小不會大于1400字節。同時,如果應用層需要傳輸的數據大于1400字節,該怎麼傳輸呢?
答案是應用層在進行數據包傳輸之前,應用層将大于1400字節的數據包進行分割(注意這裡用的是分割,不是分片),分割成多個小于MSS尺寸的數據,再交給網卡進行數據傳輸。
這種數據分割在應用層完成,對于TCP/IP協議來說是透明的,在網卡看來就是兩個獨立的數據包。
Wireshark是抓包利器,功能強大,能夠分析TCP上層的HTTP協議,并把這種數據包标識出來,記做"TCP segment of a reassembled PDU"。并在數據傳輸最後一個包中,好心的進行"重組",如下圖所示:
這就給大家造成了誤會,出現了開頭的一幕,讓這位讀者産生了疑惑。
如果大家在抓包時不想看到這種字段,可以在wireshark軟件的"已啟用的協議"中,去掉HTTP協議的解析的勾選項即可。位置如下。
05 總結
通過"TCP segment of a reassembled PDU"這個英文字段,引發了這位熱心讀者的認真思考,提出了好問題,并主動告知成哥,進行共同探讨和學習。
再次感謝。
Wireshark數據包分析三闆斧
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!