IP切片及重組

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

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

IP數據報格式:tcp

wKioL1ePhx-xqHOvAAD3_f14CGw877.png-wh_50


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

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

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

wKiom1ePhc2h6cx4AAAas_bzAXg107.png-wh_50

分片函數:大數據

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

首先ip_fragment必須處理以下兩種狀況:
spa

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

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

重組函數:

int ip_defrag(struct sk_buff *skb,u32 user)

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

相關文章
相關標籤/搜索