網橋最主要有三個資料結構: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位址來 幀,可以看...