網橋是什么
我們這兒所說的網橋(Bridge),是最基本的二層交換機(不支持VLAN功能的交換機),其基本功能是轉發網絡中的二層報文。其工作總體流程如下:
- 從某個端口收到的二層報文,解析二層報文的源MAC和目的MAC
- 根據源MAC學習形成MAC表
- 根據目的MAC,原封不動的將該報文轉發到適當的出端口,從而保證最終目的設備能收到這個報文。這個轉發過程有兩個關鍵:
a. 原封不動的: 所謂原封不動,就是交換機不會修改報文內容,包括報文的源MAC,目的MAC(這一點與路由器形成區別,路由器工作在三層,在轉發過程中每一跳都會修改源MAC和目的MAC)
b. 適當的:交換機要確保報文最終能安全可靠的到達目的地,為了達到這個目的,這兒的適當的目的端口有可能不是一個。 比如:為了保證報文能最終達到這個目標,交換機在不知道目的設備在哪個端口的時候,會將一個報文復制多份,并從多個端口發送出去(除報文源端口以外的所有端口--這種行為成為泛洪-flood)。
網橋要解決哪些問題
網橋:不支持VLAN的二層交換機
網橋轉發報文的流程如下:
收到一個報文后,根據報文的目的MAC,選擇適當的端口進行轉發。對于不同的報文,起轉發流程略有差異:
a. 已知單播 - 單播:對于單播報文,如果知道目的地址在哪個端口(MAC表中能找到該目的MAC),就從該端口轉發出去
b. 未知單播 - 泛洪:對于單播報文,如果暫時還不知道目的地址是哪個端口,則從所有非源端口泛洪出去
c. 組播廣播 - 泛洪:對于廣播和組播,也需要泛洪。
*注:網橋這樣工作方式,總的來說,就是為了盡量達到一個目的:以盡可能小的代價保證報文能最終到達它的目的地 *
為了網橋上面轉發行為能正常實施,網橋還需要考慮下面的問題:
- 維護MAC表:需要維護一張
MAC地址-接口 映射表
,并保證這張表的正確性。 - 報文轉發環路的問題:防止報文環路的一個基本思路就是通過STP等控制面協議,將網絡中的環剪斷(破環)。也就是說,這個網絡中雖然物理上有一些環路,但可以故意讓某些鏈路停止工作,從而將物理上的有環網絡(離散數學中的圖),轉變為邏輯上的無環網絡(離散數學中的樹)。
工作原理細節
MAC學習:維護MAC表
MAC學習簡單示例
mac表實際上就是一個mac地址到出接口的映射表
S1的mac表
mac表 | 出接口 |
---|---|
macA | eth0 |
macB | eth1 |
macC | eth2 |
macD | eth2 |
S2的mac表
mac表 | 出接口 |
---|---|
macA | eth0 |
macB | eth0 |
macC | eth1 |
macD | eth2 |
- **監聽學習: **當交換機從某個端口收到一個數據包,它先讀取包頭中的源MAC地址,這樣它就知道源MAC地址的機器是連在哪個端口上的;
比如S1從eth2收到C發送的報文,這樣S1網橋就會在mac表中增加一個條目
[macC --> eth2] 表示macC與eth2連著,以后收到目的地是macC的報文,就應該往eth2發送。
但如果S1剛剛啟動,還不知道macC連著哪個端口怎么辦? 網橋的解決方法是將報文轉發給所有網口(接收報文的那個網口除外)。雖然效率不高,但至少能保證報文最終能到達目的地
- 監聽更新: 然而,網絡拓撲不可能是永不改變的。假設我們將主機B和主機C換個位置,當主機C發出報文時(不管發給誰),交換機S1的eth1口收到報文,于是交換機 S1會更新其學習到的地址,將原來的“主機C是通過eth2網口接入的”改為“主機C是通過eth1網口接入的”。
如果B和C換了一個位置,則S1會更新macC的出接口
[macC --> eth1]
- **定時老化: ** 網絡拓撲變化還有一種可能性,就是直接將機器C拔掉了,這種情況下怎么保證mac表的正確性呢。很簡單,如果一定時間內該端口沒有收到C的任何報文,則假設該主機以及離線,將改主機對應的mac表象老化刪除。 (加入該主機還在,只是這段時間沒有發送報文怎么辦? 想想,其實沒有關系,大不了再次泛洪,重新學習,就和剛啟動時一樣)
轉發環路
轉發環路的問題,通常需要通過STP等信令協議進行破環。通過STP對某些鏈路進行剪枝操作,故意讓某些鏈路停止工作,從而將物理上的有環網絡(離散數學中的圖),轉變為邏輯上的無環網絡(離散數學中的樹)。
具體參見后面STP工作原理