linux bridge網橋的工作原理

Linux 抽象網絡設備簡介
和磁盤設備類似,Linux 用戶想要使用網絡功能,不能通過直接操作硬件完成,而需要直接或間接的操作一個 Linux 爲我們抽象出來的設備,既通用的 Linux 網絡設備來完成。一個常見的情況是,系統裏裝有一個硬件網卡,Linux 會在系統裏爲其生成一個網絡設備實例,如 eth0,用戶需要對 eth0 發出命令以配置或使用它了。更多的硬件會帶來更多的設備實例,虛擬的硬件也會帶來更多的設備實例。隨着網絡技術,虛擬化技術的發展,更多的高級網絡設備被加入了到了 Linux 中,使得情況變得更加複雜。
Bridge
Bridge(橋)是 Linux 上用來做 TCP/IP 二層協議交換的設備,與現實世界中的交換機功能相似。Bridge 設備實例可以和 Linux 上其他網絡設備實例連接,既 attach 一個從設備,類似於在現實世界中的交換機和一個用戶終端之間連接一根網線。當有數據到達時,Bridge 會根據報文中的 MAC 信息進行廣播、轉發、丟棄處理。
Bridge 設備工作過程
這裏寫圖片描述
Bridge 的功能主要在內核裏實現。當一個從設備被 attach 到 Bridge 上時,相當於現實世界裏交換機的端口被插入了一根連有終端的網線。這時在內核程序裏,netdev_rx_handler_register()被調用,一個用於接受數據的回調函數被註冊。以後每當這個從設備收到數據時都會調用這個函數可以把數據轉發到 Bridge 上。當 Bridge 接收到此數據時,br_handle_frame()被調用,進行一個和現實世界中的交換機類似的處理過程:判斷包的類別(廣播/單點),查找內部 MAC 端口映射表,定位目標端口號,將數據轉發到目標端口或丟棄,自動更新內部 MAC 端口映射表以自我學習。
Bridge 和現實世界中的二層交換機有一個區別,圖中左側畫出了這種情況:數據被直接發到 Bridge 上,而不是從一個端口接受。這種情況可以看做 Bridge 自己有一個 MAC 可以主動發送報文,或者說 Bridge 自帶了一個隱藏端口和寄主 Linux 系統自動連接,Linux 上的程序可以直接從這個端口向 Bridge 上的其他端口發數據。所以當一個 Bridge 擁有一個網絡設備時,如 bridge0 加入了 eth0 時,實際上 bridge0 擁有兩個有效 MAC 地址,一個是 bridge0 的,一個是 eth0 的,他們之間可以通訊。由此帶來一個有意思的事情是,Bridge 可以設置 IP 地址。通常來說 IP 地址是三層協議的內容,不應該出現在二層設備 Bridge 上。但是 Linux 裏 Bridge 是通用網絡設備抽象的一種,只要是網絡設備就能夠設定 IP 地址。當一個 bridge0 擁有 IP 後,Linux 便可以通過路由表或者 IP 表規則在三層定位 bridge0,此時相當於 Linux 擁有了另外一個隱藏的虛擬網卡和 Bridge 的隱藏端口相連,這個網卡就是名爲 bridge0 的通用網絡設備,IP 可以看成是這個網卡的。當有符合此 IP 的數據到達 bridge0 時,內核協議棧認爲收到了一包目標爲本機的數據,此時應用程序可以通過 Socket 接收到它。一個更好的對比例子是現實世界中的帶路由的交換機設備,它也擁有一個隱藏的 MAC 地址,供設備中的三層協議處理程序和管理程序使用。設備裏的三層協議處理程序,對應名爲 bridge0 的通用網絡設備的三層協議處理程序,即寄主 Linux 系統內核協議棧程序。設備裏的管理程序,對應 bridge0 寄主 Linux 系統裏的應用程序。
Bridge 的實現當前有一個限制:當一個設備被 attach 到 Bridge 上時,那個設備的 IP 會變的無效,Linux 不再使用那個 IP 在三層接受數據。舉例如下:如果 eth0 本來的 IP 是 192.168.1.2,此時如果收到一個目標地址是 192.168.1.2 的數據,Linux 的應用程序能通過 Socket 操作接受到它。而當 eth0 被 attach 到一個 bridge0 時,儘管 eth0 的 IP 還在,但應用程序是無法接受到上述數據的。此時應該把 IP 192.168.1.2 賦予 bridge0。
另外需要注意的是數據流的方向。對於一個被 attach 到 Bridge 上的設備來說,只有它收到數據時,此包數據纔會被轉發到 Bridge 上,進而完成查表廣播等後續操作。當請求是發送類型時,數據是不會被轉發到 Bridge 上的,它會尋找下一個發送出口。用戶在配置網絡時經常忽略這一點從而造成網絡故障。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章