Linux 網橋原理分析(三)

2021-06-07 20:26:10 字數 3686 閱讀 9891

網橋最主要有三個資料結構:struct net_bridge,struct net_bridge_port,struct net_bridge_fdb_entry,他們之間的關係如下圖:

展開來如下圖:

說明: 1.

其中最左邊的net_device是乙個代表網橋的虛擬裝置結構,它關聯了乙個net_bridge結構,這是網橋裝置所特有的資料結構。 2.

在net_bridge結構中,port_list成員下掛乙個鍊錶,鍊錶中的每乙個節點(net_bridge_port結構)關聯到乙個真實的網口裝置的net_device。網口裝置也通過其br_port指標做反向的關聯(那麼顯然,乙個網口最多只能同時被繫結到乙個網橋)。 3.

net_bridge

結構中還維護了乙個hash表,是用來處理位址學習的。當網橋準備**乙個報文時,以報文的目的mac位址為key,如果可以在hash表中索引到乙個net_bridge_fdb_entry結構,通過這個結構能找到乙個網口裝置的net_device,於是報文就應該從這個網口**出去;否則,報文將從所有網口**。

各個結構體具體內容如下:

struct net_bridge

struct net_bridge

2.

struct net_bridge_port

struct net_bridge_port

3. struct net_bridge_fdb_entry

struct net_bridge_fdb_entry

這裡所說的網橋資料庫指的是cam表,即struct net_bridge結構中的hash表,資料庫的維護對應的是對結構struct net_bridge_fdb_entry的操作;

眾所周知,網橋需要維護乙個mac位址-埠對映表,埠是指網橋自身提供的埠,而mac位址是指與埠相連的另一端的mac位址。當網橋收到乙個報文時,先獲取它的源mac,更新資料庫,然後讀取該報文的目標mac位址,查詢該資料庫,如果找到,根據找到條目的埠進行**;否則會把資料報向除入口埠以外的所有埠**。

資料庫使用kmem_cache_create函式進行建立,使用kmem_cache_desctory進行銷毀。路徑:[/net/bridge/br_fdb.c]:

void __init br_fdb_init(

void

)當網橋收到乙個資料報時,它會獲取該資料的源mac位址,然後對資料庫進行更新。如果該mac位址不在數庫中,則創新乙個資料項。如果存在,更新它的年齡。資料庫使用hash表的結構方式,便於高效查詢。下面是hash功能**的分析:

路徑:[/net/bridge/br_fdb.c]

void br_fdb_update(

struct net_bridge *br,

struct net_bridge_port *source,

const

unsigned

char

*addr)

else

}else

rcu_read_unlock();

}在更新函式裡面已為某一mac找到了它所屬於的hash鍊錶,因此,建立函式只需要在該鏈上新增乙個資料項即可。

static

struct net_bridge_fdb_entry *fdb_create(

struct hlist_head *head,

struct net_bridge_port *source,

const

unsigned

char

*addr,

int is_local)

return fdb;

} 查詢分兩種:一種是資料項更新時候的查詢,另一種是**報文時候查詢,兩者區別是**時查詢需要判斷mac位址是否過期,即我們常說的mac老化;更新時則不用判斷;

網橋更新一mac位址時,不管該位址是否已經過期了,只需遍歷該mac位址對應的hash鍊錶,然後更新年齡,此時它肯定不過期了。

網橋要**資料時,除了要找到該目標mac的出口埠外,還要判斷該記錄是否過期了。

更新時查詢:

static

inline

struct net_bridge_fdb_entry *fdb_find(

struct hlist_head *head,

const

unsigned

char

*addr)

return

null;}

**時查詢:

struct net_bridge_fdb_entry *__br_fdb_get(

struct net_bridge *br,

const

unsigned

char

*addr)

}return

null;}

比較一下,**時多了乙個函式處理:has_expired, has_expired函式來決定該資料項是否是過期的,**如下:

/*--資料項的可保留時間根據拓撲結構是否改變來決定,

改變則為forward_delay,否則為ageing_time--*/

/* if topology_changing then use forward_delay (default 15 sec)

* otherwise keep longer (default 5 minutes)

*/static

__inline__

unsigned

long hold_time(

const

struct net_bridge *br)

static

__inline__

int has_expired(

const

struct net_bridge *br,

const

struct net_bridge_fdb_entry *fdb)

橋建立時設定乙個定時器,迴圈檢測,如果發現有過期的mac,則清除對應的資料項,mac位址過期清除由函式br_fdb_cleanup實現:

/*--定時器迴圈檢查mac位址是否過期

定時器在橋初始化中定義開啟--*/

void br_fdb_cleanup(

unsigned

long _data)

}spin_unlock_bh(

&br-

>hash_lock)

;/*--更新檢查定時器--*/

mod_timer(

&br-

>gc_timer, jiffies + hz/10);}

Linux 網橋原理分析

1 前言 上大俠們總結分析的文件,他山之石可以攻玉,學習過程中我也會邊學邊總結,開源的發展在於共享,我也拋塊磚,望能引到玉!由於自身水平有限,且相關的參考資料較少,因此其中的結論不能保證完全正確,如果在閱讀本文的過程中發現了問題歡迎及時與作者聯絡。也希望能有機會和大家多多交流學習心得!簡單來說,橋接...

網橋工作原理

在這裡插入描述 預備知識 1.碰撞域 衝突域 在任意時刻,同乙個衝突域中,只能有一台機器在傳送資料,這個衝突域內的機器都會受到傳送的內容,接不接受取決於是不是目的主機。2.網橋是工作在資料鏈路層的裝置,能隔離衝突域,也就是說網橋的每個埠都對應乙個衝突域,在乙個埠連線的網段中 比如網橋1的埠1,連線的...

網橋的工作原理

一 什麼是網橋?網橋 bridge 也稱橋接器,是連線兩個區域網的儲存 裝置,用它可以完成具有相同或相似體系結構網路系統的連線。一般情況下,被連線的網路系統都具有相同的邏輯鏈路控制規程 llc 但 訪問控制協議 mac 可以不同。網橋工作在資料鏈路層,將兩個lan連起來,根據mac位址來 幀,可以看...