【TCP/IP 筆記】IPv4-03 | 數據報分片 (Fragmentation) 和重組 (Reassembly)

參考 <The TCP/IP Guide> http://tcpipguide.com

概述

MTU (Maximum Transmission Unit) 和數據報碎片

在提及將數據報分片前不得不提一下 MTU:物理層所能傳輸的最大數據報大小。當一個數據報從一個 MTU 較高的網絡傳向 MTU 較低的網絡時數據報就會被分片成一個個大小小於或等於要通過的網絡的 MTU 的碎片。就像石頭君在管道中旅行,他要進入一個口徑小的管道,可是他比管道大進不去,那他就要分裂成小石頭君然後才能進入小管道。

在這裏插入圖片描述

多次分片

數據報在傳輸過程中往往都要經過數個網絡,每個網絡的 MTU 或許都不同,如果數據報大小比網絡的 MTU 大時進行分片,如果比網絡的 MTU 小時不做操作,也就是說傳輸過程中數據報可能被多次分片,但不進行重組,重組操作由數據報的最終接收方執行。互聯網的最小 MTU 爲 576 Bytes。

在這裏插入圖片描述

分片過程

以上面的分片實例爲背景,將一個大小爲 12,000 Bytes 的數據報分別通過 MTU 爲 3,300 1,300 3,300 的網絡傳送到目的地,其中進行了兩次分片操作。

  1. 第一次分片:大小爲 12,000 的數據報傳入 MTU 爲 3,300 的網絡,每個碎片都有自己的 20 Bytes報頭,所以分片的結果是 3 個攜帶 3,280 Bytes 數據的數據報碎片和 1 個攜帶 2,140 Bytes 數據的數據報碎片。偏移量都比前一個碎片多 410,因爲偏移量以 8 Bytes 爲一單位,410 * 8 = 3280 Bytes 剛好是前一個碎片攜帶的數據大小。
  2. 第二次分片:第二次和第一次大體相同,要注意的是這次分片是對碎片進行分片,不是將原數據報分片。這也很顯而易見,因爲數據報不在途中重組,每個碎片去往終點的路由也不同,所以路由器是不一定知道原數據報完整內容的,所以路由器只能對碎片進行再分片,這樣分片最終得到的結果不是最優的,我們可以看到第二次分片後,多了很多小碎片,最優的分片應該是像第一次那樣的,只有一個小碎片,其他碎片大小一樣且都是允許通過的最大值,如果想達到最優的分片效果,可以先測試路由最小 MTU 然後由發件者按照此 MTU 分片後再發送。

在這裏插入圖片描述

有關報頭字段

Total Length

分片後,這個字段指的是碎片的長度,而不是原數據報的長度。

Identification

爲屬於同一個數據報的碎片指定相同的唯一標識。

More Flagments

除了最後一個碎片此值爲 0 其餘都爲 1。

Fragment Offset

這個字段指示了每個碎片的位置,幫助接收方進行重組。該字段有 13 bits,所以偏移量最大爲 8,191,8191 * 8 = 65,528 Bytes,還記得數據報的最大值嗎:65,535 Bytes,這就是爲什麼偏移量以 8 Bytes 爲單位。

Copied Flag

如果報頭有需要在分片時複製給碎片的選項,需要將該字段的值設爲 1。每個選項都含有這個字段。

DF Flag

Flags 字段中的 DF 子字段,如果設爲 1 該數據報將不會被進行分片處理,如果路由器遇到了一個數據報太大不能進入下一個網絡,有設置了 DF Flag ,不能分片又傳不下去,路由器有將這個數據報丟棄,並返回一個特定的 ICMP,這個特性常用於 MTU Path Discovery。

重組過程

分片操作可以由源和目的之間的路由器進行,但重組操作只能由目的設備進行。

  • 碎片識別:接收者通過源和目標 IP 地址、報頭指定的協議和發件人設置的 identification 字段來區分不同原數據報的碎片。
  • 初始化緩衝區:接收者初始化緩衝區,用於存放收到的碎片,並跟蹤這個緩衝區來得知哪部分已經填充以及何時填滿。
  • 初始化計時器:接收者爲重組操作設置一個計時器,當有些碎片已經丟失不再出現時,計時器保證接收者不會永遠的等下去,沒有結果的等待註定是悲劇收尾。如果計時器超時而還有碎片未到達,將會發送一個超時 ICMP。
  • 碎片接收和處理:一個片段送達時,通過上面提到的碎片識別,放入對應的緩衝區,至於放入緩衝區的哪個位置,要根據 fragment offset 的值來決定。

這一過程就像你獲得一塊塊拼圖,拼圖的背面寫着它所屬哪幅圖(碎片識別),還有它在圖中的位置 (fragment offset),然後你會找個地方去放屬於這幅圖的碎片(初始化緩衝區),然後你會定個時間去完成拼圖然後去吃飯碎片不夠也不再等別人給你碎片(初始化計時器)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章