Linux 核心網路協議棧 中最重要的資料結構 SKB
在計算機的世界裡,備份是一種美德。-------------漫步雲端
作為核心網路協議部分最重要的資料結構SKB,有很多值得仔細推敲的問題。
SKB這種說法實際包含了兩部分,即skb描述符和skb資料。
Skb描述符即核心中的skbuff結構體,裡面含有大量的指標變數,運用指標的好處是顯然的。
Skb 資料部分一般包括兩大部分,線性資料部分和非線性資料部分(即聚合I/O部分),這些資料是在記憶體中不同位置的,由skbuff中的相應指標來定位。
在網路協議棧中,複製資料是一件低效率的事情,因此應該儘量避免對資料的複製,相反,僅僅修改關於資料的有關資訊是很方便的,而且開銷很小。
舉個不恰當的例子:
比如中國的商品要出口到很多國家,不同國家的人因為語言不同,這樣商品的說明書就不一樣。這裡的商品說明書就好比skbuff結構體,記錄了商品的資訊,如果商品自身有變化,直接修改說明書就可以了,而不用讓別人先去按照你的方法生產同樣一份商品,然後才能確認該商品的屬性,直接看說明書,省事多了。
核心中有幾個操作SKB 的函式,這些函式僅僅是對指標進行了移動操作,即僅僅修改了“說明書”中的資訊,真正的資料複製動作,由別的函式完成。
有關於SKB 的複製,需要分以下兩種情形:
情形一:不需要對資料進行修改操作
既然不用修改資料,那能做的操作無非就是移動指標了,也就是僅僅需要修改“說明書”,所以,此時僅僅需要複製skb
情形一的操作在核心中叫做對skb的克隆,相應的實現函式為:
Struct sk_buff *skb_clone();
情形二:既需要修改skb描述符,同時也需要修改資料
在此情形下,又有兩種情況:
1.只有線性資料區
2.既含有線性資料又含有非線性資料
對於情況1,核心中的處理函式為pskb_copy();
對於情況2,核心中的處理函式為 skb_copy();
對於情形二中的兩種情況,不論哪一種複製,在複製之前都要做好備份,否則,如果其餘的子模組需要原始資料,則會引發災難。
以上是關於skb克隆與複製的解釋,錯誤之處,請各位指正。轉載請註明出處。