IP分片技術

在TCP/IP分層中,數據鏈路層用MTU(Maximum Transmission Unit,最大傳輸單元)來限制所能傳輸的數據包大小,MTU是指一次傳送的數據最大長度,不包括數據鏈路層數據幀的幀頭,如乙太網的MTU為1518位元組,實際上數據幀的最大長度為1518位元組,其中乙太網數據幀的幀頭為14位元組。

當傳送的IP數據報的大小超過了MTU時,IP層就需要對數據進行分片,否則數據將無法傳送成功。

基本介紹

產生原因,IP分片原理,避免IP分片,技術信息,

產生原因

乙太網的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層,不僅源端主機會進行分片,中間的路由器也有可能分片,因為不同的網路的MTU是不一樣的,如果傳輸路徑上的某個網路的MTU比源端網路的MTU要小,路由器就可能對IP數據報再次進行分片。而分片數據的重組只會發生在目的端的IP層。
在IP首部有4個位元組是用於分片的,如下圖所示。前16位是IP數據報的標識,同一個數據報的各個分片的標識是一樣的,目的端會根據這個標識來判斷IP分片是否屬於同一個IP數據報。中間3位是標誌位,其中有1位用來表示是否有更多的分片,如果是最後一個分片,該標誌位為0,否則為1。後面13位表示分片在原始數據的偏移,這裡的原始數據是IP層收到的傳輸的TCP或UDP數據,不包含IP首部。
需要注意的,在分片的數據中,傳輸層的首部只會出現在第一個分片中,如下圖所示。因為傳輸層的數據格式對IP層是透明的,傳輸層的首部只有在傳輸層才會有它的作用,IP層不知道也不需要保證在每個分片中都有傳輸層首部。所以,在網路上傳輸的數據包是有可能沒有傳輸層首部的。

避免IP分片

在網路編程中,我們要避免出現IP分片,那么為什麼要避免呢?原因是IP層是沒有逾時重傳機制的,如果IP層對一個數據包進行了分片,只要有一個分片丟失了,只能依賴於傳輸層進行重傳,結果是所有的分片都要重傳一遍,這個代價有點大。由此可見,IP分片會大大降低傳輸層傳送數據的成功率,所以我們要避免IP分片。
對於UDP包,我們需要在套用層去限制每個包的大小,一般不要超過1472位元組,即乙太網MTU(1500)—UDP首部(8)—IP首部(20)。
對於TCP數據,套用層就不需要考慮這個問題了,因為傳輸層已經幫我們做了。在建立連線的三次握手的過程中,連線雙方會相互通告MSS(Maximum Segment Size,最大報文段長度),MSS一般是MTU—IP首部(20)—TCP首部(20),每次傳送的TCP數據都不會超過雙方MSS的最小值,所以就保證了IP數據報不會超過MTU,避免了IP分片。

技術信息

IP首部包含了分片和重組所需的信息:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP分片技術
| Identification |R|DF|MF| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|<-------------16-------------->|<--3-->|<---------13---------->|
Identification:傳送端傳送的IP數據包標識欄位都是一個唯一值,該值在分片時被複製到每個片中。
R:保留未用。
DF:Don't Fragment,“不分片”位,如果將這一比特置1 ,IP層將不對數據報進行分片。
MF:More Fragment,“更多的片”,除了最後一片外,其他每個組成數據報的片都要把該比特置1。
Fragment Offset:該片偏移原始數據包開始處的位置。偏移的位元組數是該值乘以8。
另外,當數據報被分片後,每個片的總長度值要改為該片的長度值

相關詞條

熱門詞條

聯絡我們