1. 程式人生 > >Linux 核心網路協議棧 中最重要的資料結構 SKB

Linux 核心網路協議棧 中最重要的資料結構 SKB

在計算機的世界裡,備份是一種美德。-------------漫步雲端

 作為核心網路協議部分最重要的資料結構SKB,有很多值得仔細推敲的問題。

SKB這種說法實際包含了兩部分,即skb描述符和skb資料

Skb描述符即核心中的skbuff結構體,裡面含有大量的指標變數,運用指標的好處是顯然的。

Skb 資料部分一般包括兩大部分,線性資料部分和非線性資料部分(即聚合I/O部分),這些資料是在記憶體中不同位置的,由skbuff中的相應指標來定位。

在網路協議棧中,複製資料是一件低效率的事情,因此應該儘量避免對資料的複製,相反,僅僅修改關於資料的有關資訊是很方便的,而且開銷很小。

舉個不恰當的例子:

比如中國的商品要出口到很多國家,不同國家的人因為語言不同,這樣商品的說明書就不一樣。這裡的商品說明書就好比skbuff結構體,記錄了商品的資訊,如果商品自身有變化,直接修改說明書就可以了,而不用讓別人先去按照你的方法生產同樣一份商品,然後才能確認該商品的屬性,直接看說明書,省事多了。

核心中有幾個操作SKB 的函式,這些函式僅僅是對指標進行了移動操作,即僅僅修改了“說明書”中的資訊,真正的資料複製動作,由別的函式完成。

有關於SKB 的複製,需要分以下兩種情形:

情形一:不需要對資料進行修改操作

既然不用修改資料,那能做的操作無非就是移動指標了,也就是僅僅需要修改“說明書”,所以,此時僅僅需要複製skb

描述符即可,不同的skb描述符中的資訊可能不相同,這要看各個skb對資料的具體需求。比如,有的skb需要全部的資料,而有的可能僅僅需要一部分資料。

情形一的操作在核心中叫做對skb的克隆,相應的實現函式為:

Struct sk_buff *skb_clone();

情形二:既需要修改skb描述符,同時也需要修改資料

在此情形下,又有兩種情況:

1.只有線性資料區

2.既含有線性資料又含有非線性資料

對於情況1,核心中的處理函式為pskb_copy();

對於情況2,核心中的處理函式為 skb_copy();

對於情形二中的兩種情況,不論哪一種複製,在複製之前都要做好備份,否則,如果其餘的子模組需要原始資料,則會引發災難。

以上是關於skb克隆與複製的解釋,錯誤之處,請各位指正。轉載請註明出處。