前言
????????在網絡通信中,當IP層需要傳輸的數據包大小超過數據鏈路層的MTU限制時,就必須進行分片處理。本文將完整解析IP分片的工作機制,包括分片字段的作用、如何減少分片,以及分片報文的組裝原理。IP報頭解析請參考:子網劃分核心原理 (網絡原理1)-CSDN博客
????????在上一期的IP報頭解析文章中,我們遺留了幾個關鍵字段未作詳述,即16位標識符、3位標志位以及13位片偏移量。這些字段實際上與IP分片和組裝機制緊密相關,本章將對此展開詳盡講解。
一、什么是分片技術?
????????由于物理介質等因素的限制,數據鏈路層規定從上層接收下來的完整報文大小不超過MTU(最大的傳送單元),標準通常是1500字節。就像寄包裹時不能超過1kg,需要我們分成小塊寄。
????????如果從IP層傳下來的超過MTU就需要分片發送。到了對端IP層會再進行組裝。
????????分片并不是一件好事,分片會增加丟包率——任意一個分片丟失都會導致整個報文失效。舉個例子,假設報文的丟包率為1%,而一個報文被分成10份。要保證每一個報文都收到,才算不丟包,那么丟包率就變為1-99%^10,最后丟包率變為10%左右。
????????所以分片和組裝不是主流,是被迫為之,不是“原罪”。既然分片有顯著弊端,如何減少?關鍵在哪一層控制?
????????為什么說IP分片是被迫為之,傳輸層并不關心報文大小,只管將數據傳給網絡層,最終必須交付給對端傳輸層。而數據鏈路層的標準是不能超過1500字節,那么網絡層夾在中間就很為難,需要自己解決這個問題,所以有了分片技術,在IP層分片交付到對端IP層在進行組裝。分片技術的分與組均由網絡層獨立完成,與其他層解耦。
? ? ? ? 所以要減少分片,即IP層的工作。那么就要從數據鏈路層的下手。
? ? ? ? 怎么控制傳輸層數據量減少分片?MTU為1500字節,去掉IP報頭20字節,那么從傳輸層傳輸下來的報文就要控制在1480字節以下。去掉傳輸層報頭20字節,那么從發送緩存區取的報文就要控制在1460字節(稱為MSS 最大段尺寸)以下。
????????而數據發送多少又跟滑動窗口有關。滑動窗口里面的數據是分段發送的,而不是大塊數據一次性發送,就是在控制數據發送量減少分片。
關于滑動窗口講解:TCP協議可靠性設計的核心機制與底層邏輯-CSDN博客
注意:不同鏈路層有自己的?MTU,網絡層需要兼容。
二、IP報頭分片字段作用:
- 16位標識:相同報文分出來的分片包標識相同,不同報文及它們的分片包不同。該字段是用來把分片包分類的。
- 3位標志:
- 第1位:未來功能擴展是使用。
- 第2位:是否禁止分片(1表示禁止分片,被禁止分片的報文超過MTU直接丟包),通常都是設位0。
- 第3位:更多分片。表示是否有更多分片,1表是有更多分片,0表示最后一分片。
- 13位片偏移:表示當前分片包在第一個分片包的相對偏移位置。
三、如何分片和組裝?
接下來講解分片是如何組裝的,理解如何組裝,如何分片自然就能理解。
首先需要甄別出是否是分片報文?
????????看3位標志的第三位,如果是1,那么它100%是分片報文。如果是0我們還不能確定,需要繼續看13位片偏移,如果不為0則就是分片報文(而且是最后一片)。對立的,如果3位標第3位為0,且13位片偏移為0則不是分片報文。
? ? ? ? 確定它是分片報文后,通過16位標識把它分類(相同報文的放在一起)。
怎么判斷分片報文是否已經收全了?(或是否有丟失?)
劃分為三種情況檢測,第一片,中間片,最后一片。
- 如果有13位片偏移為0的分片報文,則第一片沒有丟失。
- 3位標志的第三位,如果是0的分片報文,則最后一片沒有丟失。
- 判斷中間片是否丟失可以把所有分片報文按13位片偏移排序(升序),13位片偏移+自己的報文長度就是下一片的13位片偏移,如果找不到對應的片,那就是丟失了。
如何組裝?
????????按13位片偏移升序排序后直接拼接就好。
非常感謝您能耐心讀完這篇文章。倘若您從中有所收獲,還望多多支持呀!