標籤:ip協議 傳輸裝置 資料包
分區:就是當一個skb包長度大於傳輸裝置或者鏈路上物理裝置的mtu時,會根據一定的方式進行切割,從而使報文得以發送出去。但是這裡需要說明,分區又分為IP和TCP分區兩種,由於tcp報文有自己的機制去分區,不需要依賴IP層分區;而對於udp或者icmp等報文,只能依賴IP層去分區。
分區與重組關係:IP協議理論上允許的最大IP資料報為65535位元組(16位來表示包總長)。但是因為協議棧網路層下面的資料連結層一般允許的幀長遠遠小於這個值,例如乙太網路的MTU(即Maximum Transmission Unit,傳輸單元最大值)通常在1500位元組左右。假如我們需要傳輸一個位元組為4600的資料,則我們需要將其分為四片。所以較大的IP資料包會被分區傳遞給資料連結層發送,分區的IP資料報可能會以不同的路徑傳輸到接收主機,接收主機通過一系列的重組,將其還原為一個完整的IP資料報,再提交給上層協議處理。
IP資料報格式:
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/84/67/wKioL1ePhx-xqHOvAAD3_f14CGw877.png-wh_500x0-wm_3-wmp_4-s_1671124133.png" title="哦哦.PNG" alt="wKioL1ePhx-xqHOvAAD3_f14CGw877.png-wh_50" />
把一份IP資料報文分區以後,只有到達目的地才進行重新組裝,這裡的目的地是指IP報文傳送的下一站,而不是最終的目的地,因此分區和重新組裝的過程對傳輸層是透明的。
在IP前序中,16位標識、3位標誌、13位段位移就是用於IP報文的分區與重組的。其中標識欄位長度為16位元,用於標識一個IP資料報。也就是說當發送端將某個較大的IP報文分區進行傳輸時,其中每個分區的識別欄位都是相同的,代表這些分區是屬於同一個資料報。段位移欄位13位元,用於指示該片在未經處理資料報中所處的位置。
標誌欄位有三位,其中第一位未使用;第二位用於指出是否要對資料報分段,稱為“請勿分段(DF)”位,如果該位的值設定為1,表示該資料報不能分段。如果必須對資料報分段,而DF位又置為1,則資料報會被丟棄,並向源端發送一個ICMP差錯報文;第三位用於指出當前分段後面是否還有更多的分段,如果此位置0,表示當前分段是資料報的最後一個分段。
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/84/67/wKiom1ePhc2h6cx4AAAas_bzAXg107.png-wh_500x0-wm_3-wmp_4-s_1729570861.png" title="無標題.png" alt="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分區的優點是它為上層協議提供了一個透明的傳輸管道,使上層協議不必關心底層硬體技術,缺點是:在傳輸過程中,即使丟失其中的一片資料也要重傳整個資料報。
本文出自 “11440755” 部落格,請務必保留此出處http://luodn.blog.51cto.com/11440755/1828331
IP切片及重組