IP切片及重組

分片就是當一個skb包長度大於傳輸設備或者鏈路上物理設備的mtu時,會根據一定的方式進行切割,從而使報文得以發送出去。但是這裏需要說明,分片又分爲IP和TCP分片兩種,由於tcp報文有自己的機制去分片,不需要依賴IP層分片;而對於udp或者icmp等報文,只能依賴IP層去分片

分片與重組關係:IP協議理論上允許的最大IP數據報爲65535字節(16位來表示包總長)。但是因爲協議棧網絡層下面的數據鏈路層一般允許的幀長遠遠小於這個值,例如以太網的MTU(即Maximum Transmission Unit,最大傳輸單元)通常在1500字節左右。假如我們需要傳輸一個字節爲4600的數據,則我們需要將其分爲四片。所以較大的IP數據包會被分片傳遞給數據鏈路層發送,分片的IP數據報可能會以不同的路徑傳輸到接收主機,接收主機通過一系列的重組,將其還原爲一個完整的IP數據報,再提交給上層協議處理。

IP數據報格式:

wKioL1ePhx-xqHOvAAD3_f14CGw877.png-wh_50


    把一份IP數據報文分片以後,只有到達目的地才進行重新組裝,這裏的目的地是指IP報文傳送的下一站,而不是最終的目的地,因此分片和重新組裝的過程對傳輸層是透明的。

    在IP報頭中,16位標識、3位標誌、13位段偏移就是用於IP報文的分片與重組的。其中標識字段長度爲16比特,用於標識一個IP數據報。也就是說當發送端將某個較大的IP報文分片進行傳輸時,其中每個分片的標識字段都是相同的,代表這些分片是屬於同一個數據報。段偏移字段13比特,用於指示該片在原始數據報中所處的位置。

標誌字段有三位,其中第一位未使用;第二位用於指出是否要對數據報分段,稱爲“請勿分段(DF)”位,如果該位的值設置爲1,表示該數據報不能分段。如果必須對數據報分段,而DF位又置爲1,則數據報會被丟棄,並向源端發送一個ICMP差錯報文;第三位用於指出當前分段後面是否還有更多的分段,如果此位置0,表示當前分段是數據報的最後一個分段。 

wKiom1ePhc2h6cx4AAAas_bzAXg107.png-wh_50

分片函數:

ip_fragment(int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)))

首先ip_fragment必須處理如下兩種情況:

  <1>必須切成小塊的大數據,要切割大數據就需要分配新的緩衝區,並且在大的緩衝區和小緩衝區見做內存的拷貝。

  <2>不需要再分片的數據鏈表或數組,如果分配的緩衝區又足夠的空間新增較抵層的L3頭和L2頭,則ip_fragment處理這些緩衝區不需要進行內存拷貝。ip層要做的就是

重組函數:

int ip_defrag(struct sk_buff *skb,u32 user)

IP分片的優點是它爲上層協議提供了一個透明的傳輸管道,使上層協議不必關心底層硬件技術,缺點是:在傳輸過程中,即使丟失其中的一片數據也要重傳整個數據報。

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