分片報文的最後一片 IP分片(碎片)重組簡單概念

2021-10-18 18:03:16 字數 2237 閱讀 6200

鏈路層具有最大傳輸單元mtu這個特性,它限制了資料幀的最大長度,不同的網路型別都有乙個上限值。乙太網的mtu是1500,可以用 netstat -i 命令檢視這個值。如果ip層有資料報要傳,而且資料報的長度超過了mtu,那麼ip層就要對資料報進行分片(fragmentation)操作,使每一片的長度都小於或等於mtu。我們假設要傳輸乙個udp資料報,乙太網的mtu為1500位元組,一般ip首部為20位元組,udp首部為8位元組,資料的淨荷(payload)部分預留是1500-20-8=1472位元組。如果資料部分大於1472位元組,就會出現分片現象。

當提交給資料鏈路層進行傳送時,乙個ip分片或乙個很小的無需分片的ip資料報稱為分組。資料鏈路層在分組前面加上它自己的首部,並傳送得到的幀。

ip首部(5-8位元組)包含了分片和重組所需的資訊:

|         identification            |r|df|mf|    fragment offset    |

identification:傳送端傳送的ip資料報標識欄位都是乙個唯一值,該值在分片時被複製到每個片中。

r:保留未用。

df:don't fragment,「不分片」位,如果將這一位元置1 ,ip層將不對資料報進行分片。

fragment offset:該片偏移原始資料報開始處的位置。偏移的位元組數是該值乘以8。

兩個flags和fragment offset結合使用,進行分片時,df位元設定為0,表示可以進行分片,這時如果 mf的值為1,則表示當前ip報文是乙個ip包的其中一段分片,並且不是最後乙個分片,這時結合fragment offset域繼續判斷;如果mf為1而 fragment offset = 0,表示該ip報文為第乙個分片,而且後續有分片;如果mf為1而fragment offset不是0,表示該ip報文為中間的乙個分片;如果mf為0而fragment offset不是0,表示該報文是最後乙個分片。

另外,當資料報被分片後,每個片的總長度值要改為該片的長度值。

可舉例說明ip分片重組的過程。

假設分片前報文ihl=5, total length = 800, mf = 0, fragment offset = 0, mtu為512;

則分片報文1的ihl1 = 5, total length1 = 508, mf = 1, fragment offset1 = 0;

分片報文2的ihl2 = 5, total length2 = 312, mf = 0, fragment offset2 = 61。

其中total length1 + total length2 = 508+312 = 820,比 total length多出的20位元組為新增的ip頭,並且由於偏移量的單位為8byte,所以非尾片的淨荷長度都是8byte的整數倍,mtu為512byte,去除ip頭ihl*4 = 5*4 = 20byte後得到512-20 = 492byte, 492byte不是8byte的整數倍,就取488byte,加上ip頭得到488+20 = 508byte。由於報文1的淨荷為488byte,所以報文2的fragment offset就是 488/8 = 61, total length2 為總淨荷長度(total length -ihl*4 = 800-20 = 780byte)減去報文1的淨荷長度488byte加上報文2的ip頭20byte得到780-488+20 = 312byte。

同樣可假設重組前報文1的ihl = 5, total length1 = 1012 , mf = 1, fragment offset1 = 0;

報文2的ihl = 5, total length2 = 312, mf = 0, fragment offset2 = 124。

則重組後的報文ihl = 5, total length = 1304, mf = 0, fragment offset = 0。

其中報文1的淨荷長度為total length1 – ihl1*4 = 1012-20 = 992byte, fragment offset1 = o, mf = 1,表示報文1有後續報文並且報文1的後續報文偏移量應該是0*8 + 992 = 992byte,而報文2的 fragment offset2 = 124,則偏移量為124 * 8 = 992byte,所以報文1和報文2是相連的,並且mf = 0 表示報文2為最後乙個分片,此時就得到了原來的報文重組完成,重組後的報文 mf = 0, fragment offset = 0,total length 為報文1的淨荷長度(992byte)加上報文2的淨荷長度(total length2 –ihl*4 = 312 - 20 = 292byte)加上ip報文頭20byte為992 + 292 + 20 = 1304byte。

中小企業 PC市場的最後一片沃土

在經歷了商用市場的攻城略地和消費市場的深耕細作後,pc市場難以避免地走上平穩增長的道路。比 平穩 更可怕的是同質化競爭所帶來的 戰和低利潤。走出紅海,走進藍海一直是廠商們的心願。經過幾年的積澱,2006年以來,中小企業資訊化建設的浪潮終成澎湃之勢,而這背後孕育著極大的市場機會。今天,pc巨頭們紛紛把...

更換IP後Portal開啟一片空白

有的小夥伴,安裝配置完portal以後,因為某原因需要改ip,結果導致portal開啟後一片空白,server manager 也一直在那載入。上面的那個文章也有寫方法。但是,操作完以後發現還是不顯示,這是什麼情況?然後我發現其實是需要四個地方的。解決方案 1 從下列四個位置找到hostidenti...

路由器對IP報文的分片

網路協議棧中,各個層次都具有其最大傳輸單元值 mtu 上層的資料依賴於下層可以容納的mtu,例如在乙太網環境中,幀中允許攜帶的ip分組最大為1500位元組,如果ip分組大小超出網路允許傳輸資料的最大值,則需要對ip分組進行分片。路由裝置針對ip分組進行處理,這裡以ip報文為例,說明這一分片過程。圖中...