JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

碰撞網域、廣播網域與迴圈

上一篇打造了一台能學會每個人座位的交換器。這一篇要問兩個決定區域網路能多大、能多安靜的問題:誰必須輪流才能說話?誰會聽見每一次喊叫?接著我們會遇上能讓交換式網路熔毀的迴圈,以及那個悄悄馴服它的協定。

兩個不同的房間,兩個不同的問題

上一篇我們看著一台交換器學會每台機器坐在哪裡,並把每個訊框送到恰好正確的埠。那個故事回答了「這個訊框要去哪?」但對於任何一張區域網路,網路工程師還會問另外兩個問題,而初學者老是把它們糾在一起。第一個是:誰必須輪流說話,因為若其中兩個同時開口,話就會碰撞?第二個是:當有人一次對所有人喊話時,誰會聽見?這兩個聽起來很像,其實談的是完全不同的事,而修好其中一個的裝置,並不會修好另一個。

第一個問題談的是碰撞網域:一群共用同一個通道、必須輪流的裝置,使得兩次同時的傳輸會互相踩踏。第二個談的是廣播網域:一群全都會收到一個寄給所有人的訊框的裝置。碰撞網域關乎對發話時間的爭用;廣播網域關乎觸及範圍。把它們放進分開的心智盒子裡,這篇其餘的內容就會卡進定位;把它們混在一起,交換器、集線器、路由器與 VLAN 就會變成一鍋讓人困惑的糊湯。

碰撞網域:誰必須輪流

想像一具老式的多戶共用電話,或一間一次只能一個人說話的小房間。若兩個人在同一瞬間開始一句話,他們的話就糊在一起,雙方都得停下重試。這群被迫輪流的人就是一個碰撞網域。在最早的共用同軸電纜乙太網路上,或任何掛在集線器上的東西上,每台機器都坐在這樣一間房裡:兩次同時的傳輸在線上實際重疊、彼此損毀。

為了在共用通道上存活,這些機器執行 CSMA/CD——載波偵測多重存取/碰撞偵測。白話說:說話前先聽;通道忙就等;若你開口卻仍聽見碰撞,就立刻停止、等一段隨機退讓時間,再試一次。它行得通,但愈多機器擠進同一個碰撞網域,碰撞就愈多,每台實際拿到的有效頻寬就愈少。八台忙碌的機器接在同一台 100 Mbps 集線器上,並非各拿 100 Mbps,而是搶奪一份共用的 100 Mbps,真正的吞吐量遠遠沉到它之下。

這正是上一篇那台交換器取代集線器的原因。交換器給每台裝置自己的纜線與自己的埠,所以每個埠各自是一個碰撞網域。更棒的是,現代的交換式連結以全雙工運作:分開的線對(或光纖)同時承載傳送與接收,所以根本沒有東西可碰撞。一條 1 Gbps 的全雙工連結能同時各方向推送約 1 Gbps,CSMA/CD 變得多餘——在一條無法碰撞的連結上,碰撞偵測乾脆關掉。半雙工(兩個方向共用一個通道、必須輪流)如今主要存活於集線器或無線電這類共用媒介上。

廣播網域:誰聽見那聲喊叫

現在來看第二個問題。有時主機並非寄給某一台機器,而是一次寄給所有人——一個目的 MAC 為特殊的全為一的位址 ff:ff:ff:ff:ff:ff 的訊框,意思是「這個區域網路上的每一個人」。交換器處理廣播的方式和處理一般訊框很不一樣:它不做一次定向查表,而是把廣播從除了它進來的那個埠以外的每一個埠氾濫出去。所以即使交換器給了每個埠自己的碰撞網域,廣播仍會觸及它們全部。整台交換器——乃至一整棵用纜線連在一起的交換器樹——就是一個廣播網域。

廣播不是 bug;少了它區域網路根本無法運作。當你的筆電知道一個 IP 位址、卻需要相符的 MAC 才能組出訊框時,ARP 會廣播「誰有 192.168.1.20?」當一台剛開機的裝置完全沒有位址時,DHCP 會廣播去找一台伺服器。(這兩個輔助協定會在本單元稍後有自己的一篇。)問題出在量:每一次廣播都打擾網域裡的每一台機器,它至少得看一眼這個訊框才能判定自己沒興趣。把幾千台裝置放進一個又大又扁平的廣播網域,那持續不斷的背景喊叫就浪費掉實在的頻寬與 CPU。

那麼什麼能擋住廣播?不是另一台交換器——交換器會把廣播繼續氾濫下去。廣播在路由器處停下。路由器在上一層、針對 IP 位址運作,它根本不會把第二層的廣播轉送到另一個網路;它是一道喊叫爬不過的牆。界定廣播網域的另一種方法是 VLAN,它用軟體把一台實體交換器切成數個邏輯廣播網域——那正是下一篇的整個主題。現在只要把這個對照鎖牢:交換器、集線器與橋接器全都讓廣播網域維持完整;只有路由器(第三層)或 VLAN 才會拆分它。

能熔毀網路的迴圈

廣播網域在這裡變得危險。人們在交換器之間多接幾條備用纜線——這是個合理的直覺。但兩台交換器用兩條纜線相連、或三台交換器接成一個三角形,就形成一個實體迴圈,而迴圈在第二層是致命的。回想網路層的一個關鍵事實:IP 封包帶著一個 TTL,一個在跳太多次後就把它殺掉的跳數計數器。乙太網路訊框沒有這種計數器。訊框裡沒有任何東西會說「你已經走太遠了」。

現在把一個廣播送進迴圈。交換器 A 把它氾濫給交換器 B;B 又把它氾濫回 A 並繼續傳;A 再氾濫一次;這單一個訊框永遠繞圈,而且因為每台交換器也把它從其他埠氾濫出去,副本數量每繞一圈就翻倍。幾秒內這個迴圈就被一個訊框的數十億份副本淹沒地尖叫——一場廣播風暴——網路就此沒頂。更糟的是,持續的氾濫把 MAC 位址表攪亂,於是連正常流量也停止遞送。一條插錯的備用纜線,就能在片刻間癱瘓整棟樓的網路。

生成樹:保留纜線,殺死迴圈

我們想保留備用纜線以求韌性,卻不能容許迴圈。經典的答案是生成樹協定(STP)。它的工作很優雅:讓每一條備援纜線都實體插著,但讓交換器們同意在邏輯上關掉其中一些埠,使任兩點之間恰好只有一條作用中的路徑。作用中的拓樸於是成為一棵樹——一個沒有迴圈的形狀——而它仍連到(生成出)每一台交換器。若某條作用中的連結之後失效,一個被關掉的埠就會醒來、恢復路徑,這正是當初備用纜線存在的原因。

  1. 選出一個根。交換器交換稱為 BPDU 的小訊息,挑出一台作為樹的根——習慣上是橋 ID 最小的那台。
  2. 找出回到根的最佳路徑。其餘每台交換器算出自己回到根的最低成本路徑,並保留那條最佳路徑上的那一個埠為作用中(它的根埠)。
  3. 阻塞其餘的埠。任何會造成第二條通往某處路徑的埠,都被置於阻塞狀態:它不承載資料訊框,所以不會形成迴圈,但它持續聆聽。
  4. 失效時自癒。若某條作用中的連結斷裂,交換器透過缺失的 BPDU 察覺,先前被阻塞的埠便轉為轉送、接手那條路徑。

不過要誠實面對代價。STP 用「讓昂貴的連結在阻塞狀態閒置,直到發生故障」來換取無迴圈——你付錢買了那些纜線,它們大半時間卻什麼都不承載。經典 STP 重新收斂也慢,變動後要數十秒,這正是它在實務上被快速生成樹(RSTP)取代的原因。當你真的想同時使用所有連結時,有兩個更好的答案。一個是連結聚合,我們接下來就會遇到;另一個用在大型資料中心,是像搭配等價多路徑的葉脊拓樸那樣、同時在許多連結上路由而非阻塞它們的網狀架構設計。

連結聚合把兩台裝置之間的數條實體纜線綁成一條具有單一身分的邏輯連結。關鍵在於,因為 STP 把這個綑綁看成一條連結、而非數條平行連結,它就不會把多出來的當成要阻塞的迴圈——於是所有纜線同時承載流量。把四條 10 Gbps 連結綁起來,你就得到約 40 Gbps 的總容量,外加一條纜線失效時仍能存活。那個誠實的提醒很重要:單一一場對話會被雜湊到一條成員連結上,所以一筆巨大檔案的複製上限接近「一個」成員的速度、而非整個綑綁。聚合提升的是橫跨許多流的總吞吐量;它不會加速任何單一一條流。

把兩個網域放在一起

讓我們畫一張很小的網路,同時數一數兩種網域,因為這個計數正是各個概念最終扣合之處。下面的圖裡有一台集線器接了三台舊 PC、集線器插進交換器的一個埠、另外兩台 PC 各自接一個交換器埠,而交換器經由一台路由器上行。慢慢走一遍,留意這兩個問題給出兩個不同的答案。

        [ Router ]            <- broadcasts STOP here
            |
        [ Switch ]   port 2 --- PC-D
         | port 1    port 3 --- PC-E
        [ Hub ]
       /   |   \
    PC-A  PC-B  PC-C

Collision domains:
  - Hub + PC-A,B,C  ......... 1 (they all share, take turns, CSMA/CD)
  - PC-D link ............... 1 (its own port, full-duplex)
  - PC-E link ............... 1 (its own port, full-duplex)
  - Switch <-> Router link .. 1
                              = 4 collision domains

Broadcast domains:
  - everything below the router = 1 (a switch floods broadcasts;
                                      the router blocks them)
同一張網路,兩種計數:每個交換器埠(與那組集線器)各自是一個碰撞網域,但路由器界定出單一一個廣播網域。

把答案讀出來。碰撞網域:PC-A、PC-B、PC-C 那組集線器是一間共用的房間、他們在裡面輪流;PC-D、PC-E 與路由器各自的交換器連結則各是一個碰撞網域——總共四個。廣播網域:來自這些機器中任何一台的廣播,會氾濫過集線器與整台交換器、觸及路由器底下的所有人,但路由器拒絕把它傳下去,所以整張圖只是一個廣播網域。再加第二台路由器(或把交換器切成多個 VLAN),你才終於得到第二個廣播網域。

那張單一的圖,就是整篇的縮影。交換器把碰撞網域縮小到每埠一個,而全雙工徹底抹除碰撞;廣播仍會氾濫過每一台交換器,直到路由器或 VLAN 擋住它;而那個扁平的第二層網狀架構裡的任何迴圈,都必須由生成樹馴服,因為訊框沒有跳數能拯救它們。握住這三個事實,下一篇——把一台交換器切成許多 VLAN——就會感覺像是顯而易見的下一步。