linux IP分片原理和實現

2021-06-22 02:43:04 字數 796 閱讀 7462

分片,從字面上也可以猜到是什麼意思,就是當乙個skb包長度大於傳輸裝置或者鏈路上物理裝置的mtu時,會根據一定的方式進行切割,從而使報文得以傳送出去。但是這裡需要說明,分片又分為ip和tcp分片兩種,由於tcp報文有自己的機制去分片,不需要依賴ip層分片;而對於udp或者icmp等報文,只能依賴ip層去分片。

首先ip層如何認出乙個報文是另外乙個較大報文的分片? 這裡不得不提到是ip報文頭中的offset和mf欄位。如果報文未被分片,那麼offset和mf欄位的值為0,相反的就是分片報文,分片報文可以按照情況分為三種第一片、中間片、最後一片,分別對應以下的條件:

<1> 第一片報文offset=0且mf=1

<2>中間片報文offset 和mf都非0

<3>最後一片mf=0且offset不為0

其次ip分片長什麼樣或者說怎麼分片呢?看以下這個圖就可以明白大體的情況了。

最後回歸到**的層面去了解一下實現,分片主要的函式就是ip_fragment(int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))),首先ip_fragment必須處理如下兩種情況:

<1>必須切成小塊的大資料,要切割大資料就需要分配新的緩衝區,並且在大的緩衝區和小緩衝區見做記憶體的拷貝。

<2>不需要再分片的資料鏈表或陣列,如果分配的緩衝區又足夠的空間新增較抵層的l3頭和l2頭,則ip_fragment處理這些緩衝區不需要進行記憶體拷貝。ip層要做的就是

IP分片原理

ip 分片原理 ip分片是網路上傳輸 ip報文的一種技術手段。ip協議在傳輸資料報時,將資料報文分為若干分片進行傳輸,並在目標系統中進行重組。不同的鏈路型別規定有不同最大長度的鏈路層資料幀,稱為鏈路層 mtu 最大傳輸單元 常見乙太網的 mtu為 1500 若ip 協議在傳輸資料報時,ip報文長度大...

DPDK 分片 mbuf 原理

mtu是最大傳輸單元 maximum transmission unit 的縮寫,指乙個介面無需分片所能傳送的資料報的最大位元組數。mtu範圍在46 1500位元組,預設一般都是1500。1 mtu為1500時計算總長度 7位元組前導碼 1位元組幀開始定界符 6位元組的目的mac 6位元組的源mac...

Elasticsearch 分片原理1

elasticsearch版本 6.0 elasticsearch基於lucene,採用倒排索引寫入磁碟,lucene引入了按段搜尋的概念,來動態更新索引。乙個lucene索引包含乙個提交點和三個短,如圖 關於索引和分片乙個lucene索引在elasticsearch成為分片,乙個elasticse...