1. 程式人生 > >【小菜學網路】交換機與MAC地址學習

【小菜學網路】交換機與MAC地址學習

上一小節介紹了 **集線器** ,一種工作於物理層的簡單網路裝置。由於集線器採用廣播的方式中繼、轉發物理訊號,傳輸效率受到極大制約。 ## 精準轉發 為了解決集線器工作效率低下的尷尬,我們需要設計一種更高階的網路裝置。新裝置根據乙太網幀的目的 _MAC_ 地址,將它精準地轉發到正確埠: ![](https://cdn.fasionchan.com/p/4f8cfcc7704f3a7e634bb37a8c4228ae3be83583.png#width=412px) > 註釋:這裡 **埠** ( _port_ )指的是轉發裝置的插口,也可叫做網口。 如上圖,中間節點是轉發裝置,它在內部維護著一張主機 _MAC_ 地址與對應埠的對映表,現與 _3_ 臺主機相連。這樣一來, 當轉發裝置接到主機 _A_ 發給主機 _C_ 的資料後,根據目的 _MAC_ 地址搜尋對映表,便可將資料準確地轉發到對應的埠 _3_ 。 現在,傳輸模式變得更有針對性了——資料幀被精準轉發到正確的埠,其他埠不再收到多餘的資料: ![](https://cdn.fasionchan.com/p/3fe963220b2e39bb6dac958d4fc8035afb0a9192.png?x-oss-process=image/resize,w_340) 不僅如此,主機 _A_ 與 _B_ 通訊的同時,其他計算機也可通訊,互不干擾。轉發裝置每個埠是一個獨立的衝突域,頻寬也是獨立的。 集線器的缺陷全部避免了! ## 交換機 能夠根據乙太網幀目的地址轉發資料的網路裝置就是 **乙太網交換機** ( _ethernet switch_ ): ![](https://cdn.fasionchan.com/p/0ed02724a1ab5c184fd3106b12a6e6d699f99206.png?x-oss-process=image/resize,w_360) 交換機長相跟集線器沒啥區別嘛。當然了,大部分網路裝置都是一個佈滿埠的盒子,關鍵在於內部構造。 再看看現實中的交換機長啥樣: ![](https://cdn.fasionchan.com/p/19d5e5116be0582bfecb9c6b830a064aa6d9f99a.jpg?x-oss-process=image/resize,w_450) 總結起來,乙太網交換機屬於 **二層網路裝置** ,特點如下: - 根據目的地址轉發乙太網幀; - 每個埠是獨立衝突域; - 每個埠頻寬獨立; ## Mac地址學習 交換機完美地解決集線器的缺點,但新問題又來了,對映表如何獲得呢? 最原始的方式是:維護一張靜態對映表。當新裝置接入,向對映表新增一條記錄;當裝置移除,從對映表刪除對應記錄。然而,純手工操作方式多少有些煩躁。 好在計算機領域可以實現各種花樣的自動化——通過演算法自動學習對映表。我們先來看看大致思路: ![](https://cdn.fasionchan.com/p/0018212e4156ba3b03c50b8669d4e17702baad2d.png#width=372px) 初始狀態下,對映表是空的。現在,主機 _A_ 向 _B_ 傳送一個數據幀 _FRAME1_ 。因為對映表中沒有地址 _B_ 的記錄,交換機便將資料幀廣播到其他所有埠。 由於交換機是從 `Fa0/1` 埠收到資料幀的,便知道 _A_ 連線 `Fa0/1` 埠,而資料幀的源地址就是 _A_ 的地址!此時,交換機可以將 _A_ 的地址和埠 `Fa0/1` 作為一條記錄加入對映表。交換機學習到 _A_ 的地址! ![](https://cdn.fasionchan.com/p/978d91349c17ca0c04a88d05bf5b2df9c089f521.png#width=372px) 接著,主機 _B_ 向 _A_ 回覆一個數據幀 _FRAME2_  。由於對映表中已經存在地址 _A_ 的記錄了,因此交換機將資料幀精準轉發到埠 `Fa0/1` 。同理,交換機學習到主機 _B_ 的地址。 當主機 _C_ 開始傳送資料時,交換機同樣學到其地址,學習過程完成! ![](https://cdn.fasionchan.com/p/742e3a4ce47f0928da014869e33bc752db1bf7cb.png#width=372px) 這就是 **MAC地址自動學習** 的基本原理。 【[小菜學網路](https://fasionchan.com/network/)】系列文章首發於公眾號【小菜學程式設計】,敬請關注: ![](https://cdn.fasionchan.com/coding-fan-wechat-soso.png?x-oss-process=image/resiz