做網路維運這行,見過各種疑難雜症,但有一種故障的「戲劇性」始終排在前段班:整間公司的網路在幾秒之內同時斷光,電話不通、電腦連不上伺服器、刷卡機叫不到主機,而機房裡的交換器指示燈卻閃到像跑馬燈。工程師衝到現場拔線、重開機、換設備,忙了半天摸不著頭緒,最後才發現罪魁禍首只是一條網路線:有人「好心」把它兩端都插上了。
我們實際遇過一個例子。高雄一間兩層樓的公司,員工嫌會議室的網路孔不夠用,自己從抽屜翻出一台不知道放多久、沒人在管的小交換器接上去,又順手拿了條跳線想「多接一個孔」,結果把同一台交換器的兩個孔用一條線接成了迴圈。不到幾秒鐘,整層樓的電話、電腦、刷卡機全部失聯,連隔壁棟的伺服器都受到牽連。這就是網路工程師聞之色變的網路環路(Loop)。
環路聽起來只是「線接錯」的小事,但它引發的連鎖反應,牽涉到乙太網路最底層的運作原理。搞懂它為什麼這麼致命,你才會明白為什麼一台看起來只是「比較貴」的網管型交換器,值得那個價差。
為什麼一個小迴圈,能讓整棟樓瞬間斷網
要理解環路的破壞力,得先知道交換器(switch)遇到「廣播封包」時的處理規則。當一台交換器收到一個廣播訊框(broadcast frame,例如最常見的 ARP 位址查詢),它的動作很簡單粗暴:從除了來源埠以外的每一個埠,全部各複製一份轉發出去。這在正常的樹狀網路裡沒問題,封包散一圈就結束了。但一旦網路裡出現迴圈,災難就會開始疊加,而且是三個災難同時發生。
第一個災難:乙太網路沒有「煞車」
網路層的 IP 封包有一個叫 TTL(Time To Live,存活時間)的欄位,每經過一台路由器就減一,歸零就被丟掉,這是防止封包無限繞圈的保險。但是第二層的乙太網路訊框,根本沒有 TTL 這個欄位。也就是說,一個廣播訊框只要進了迴圈,交換器就會照上面那條規則一直複製、一直轉發,沒有任何機制叫它停下來。
於是一個廣播封包在迴圈裡繞一圈,被複製成兩個、四個、八個……以指數速度暴增。短短幾秒鐘,成千上萬份複製品就把整個網段的頻寬塞爆,交換器忙著複製轉發到 CPU 使用率直接打滿。這就是惡名昭彰的廣播風暴(Broadcast Storm)。結果是整個網段動彈不得,合法的資料連一個位元都擠不進去,甚至連想連進管理介面救火都因為 CPU 過載而進不去。
第二個災難:MAC 位址表被打到「抖動」
廣播風暴還不是全部。交換器靠一張 MAC 位址表來記住「哪個 MAC 位址掛在哪個埠」,才知道單點傳送(unicast)的封包該往哪送。但在迴圈裡,同一個來源 MAC 的訊框,會幾乎同時從好幾個不同的埠灌進來,交換器就懵了:它會不停地改寫這張表:一下說 A 電腦掛在第 3 埠,一下又說在第 8 埠,反覆橫跳。
這叫做 MAC 位址表抖動(MAC Flapping/Thrashing)。後果是:就算不是廣播、而是正常的單點傳送封包,交換器也因為查表查不準,把它們亂送、甚至跟著在迴圈裡一起繞,連本來該乖乖點對點的流量都一起淪陷。廣播風暴塞爆頻寬、MAC 抖動癱瘓轉送、CPU 過載當機:三個災難同時引爆,這就是為什麼一個環路能在短短幾秒內讓整棟樓的網路徹底癱瘓。而且它的症狀往往不是「變慢」而是「全斷」,這也讓它比一般網路壅塞更難在第一時間判斷。
環路最常見的幾種釀禍方式
環路幾乎都不是「設計」出來的,而是「不小心」接出來的。以下這幾種,是我們在現場最常抓到的兇手:
- 一條線兩端插回同一台交換器。整理線材、換機櫃時最容易發生,尤其是一堆沒貼標籤的跳線,插到哪算哪。
- 使用者自己私接設備。員工嫌孔不夠,自己接小交換器、Wi-Fi 分享器或無線 AP,一個不小心就把上行線和下行線接成一圈。
- 為了「備援」重複互接,卻沒有防環機制。多台交換器之間拉了兩條線想做備援,立意良善,但如果沒有開啟任何防環協定,這兩條線本身就是一個現成的迴圈。
- 牆上網路孔的後端其實是相通的。兩個面板孔在弱電箱裡本來就跳接在一起,現場又被一條跳線串起來,肉眼完全看不出問題。
- 虛擬化與堆疊設定失誤。伺服器多網卡沒設好綁定、或是交換器堆疊、鏈路聚合的兩端設定不一致,也可能在邏輯上繞出一個迴圈。
這些動作有個共通點:做的人看起來都「很合理」,完全沒意識到自己按下了核彈按鈕。所以真正可靠的防線,不能寄望「大家都不要接錯」,而要靠交換器本身有沒有自動防環的能力。
STP 生成樹:讓網路自己「剪掉」多餘的路
對付環路,業界的標準答案是 STP(生成樹協定,IEEE 802.1D)。它是網管型交換器才有的功能,核心概念很聰明:既然實體上有迴圈,那我就在邏輯上把多餘的那條路徑擋起來,讓整個網路收斂成一棵沒有迴圈的「樹」。
運作上,所有交換器會先透過互相交換一種叫 BPDU(橋接協定資料單元)的小封包,選出一台「根橋(Root Bridge)」當作這棵樹的樹根,然後每台交換器各自算出到根橋成本最低的一條路當主幹,其餘那些會構成迴圈的備援路徑,則被設成 阻斷(Blocking)狀態:實體線還在,但邏輯上不通,封包過不去,自然就沒有迴圈。等哪天主幹斷了,STP 偵測到,再把原本阻斷的備援路徑打開接手。這就是它同時做到「防環」和「線路備援」的巧妙之處。
傳統 STP 的代價:30 到 50 秒的空窗
STP 的問題是「慢」。傳統 802.1D 的一個埠要從阻斷變成可以轉送,必須依序經過 接聽(Listening)、學習(Learning)兩個過渡狀態,每個狀態預設要等一個 15 秒的轉送延遲(Forward Delay),再加上偵測拓樸改變用的 Max Age(預設 20 秒),整個網路重新收斂常常要耗上 30 到 50 秒。
這 30 到 50 秒是什麼概念?就是主線一斷,備援路徑要將近一分鐘後才會真正接通,這中間網路是「頓住」的。對現在動不動就要開視訊會議、連雲端系統、即時刷卡結帳的環境,半分鐘的空窗已經足以讓一票連線逾時、交易失敗。所以傳統 STP 雖然能防環,但那個收斂速度,以今天的標準來看是不及格的。
RSTP 快速生成樹:把收斂壓到「秒」的等級
為了解決「慢」這個痛點,RSTP(快速生成樹協定,IEEE 802.1w)登場,現在的網管型交換器大多預設就跑 RSTP。它把收斂時間從幾十秒,一口氣壓到 大約 1 到 3 秒,甚至在點對點鏈路的切換上可以達到不到一秒的等級。幾個關鍵改良值得認識:
- 簡化狀態機。把原本的五種埠狀態精簡成三種:丟棄(Discarding)、學習(Learning)、轉送(Forwarding),少掉了那些空等的過渡狀態。
- 不再死等計時器,改用「提議/同意」握手。在點對點的交換器互連上,兩端直接用 BPDU 快速協商,確認沒有迴圈就放行,這個握手像骨牌一樣一段一段往網路邊緣傳遞,瞬間打通,不必再乾等那 15 秒的轉送延遲。
- 預先算好備援角色。RSTP 多了 替代埠(Alternate Port)和 備份埠(Backup Port)兩種角色,等於事先把「主線斷了誰頂上」都算好、備著,主線一掛,替代埠幾乎可以無縫接手。
- 邊緣埠可快速轉送,但不是「保證不會成環」:只有確認是 host-facing、預期不接 bridge 或交換器的埠,才設成 Edge/PortFast。IP Phone passthrough、hypervisor bridge、下游 unmanaged switch 都可能把路徑接成環;因此還要搭配 BPDU Guard、loop detection 與 storm control。
如果網路裡切了很多 VLAN,還有更進一步的 MSTP(多重生成樹,IEEE 802.1s),能讓不同的 VLAN 群組走不同的生成樹拓樸,把備援線路的頻寬也利用起來。不過對絕大多數中小企業來說,RSTP 已經綽綽有餘,會用到 MSTP 的多半是 VLAN 切得很細的大型網路。
光開 STP 還不夠:真正的防線在「邊緣防護」
這裡是很多人的盲點:以為核心交換器把 STP 開起來就高枕無憂了。其實不然。生成樹保護的是交換器之間的骨幹拓樸,但最常出事的地方,恰恰是「使用者隨手接設備」的那些邊緣埠。真正成熟的做法,是在邊緣再多疊幾道防護:
- BPDU 防護(BPDU Guard):接使用者的邊緣埠,理論上不該收到任何 BPDU。一旦這種埠偵測到有人私接了會發 BPDU 的交換器,它會立刻把該埠強制關閉(進入 err-disabled 錯誤停用狀態)。這一招的精髓在於「隔離」:把闖禍鎖死在那一個孔,問題根本沒機會擴散到全網,事後查起來也一目瞭然:哪個孔被關了,兇手就在那裡。
- 根橋防護(Root Guard):防止下游設備送出較優 BPDU 搶走根橋角色。STP 是數值較低者優先,不要用「priority 設很高」這種容易搞反的說法;根橋位置與數值應在設計文件中明確指定。
- 迴圈防護(Loop Guard):用在交換器之間的骨幹連線上。萬一因為線路單向故障導致 BPDU 突然收不到,它能避免原本阻斷的埠誤判成「迴圈已經消失」而貿然開通,反而製造出一個真正的迴圈。
- 環路偵測(Loopback Detection):就算下游接的是一台沒有生成樹功能的廉價非網管交換器,環路偵測也能靠交換器自己送出的偵測封包又繞回自己,抓到迴圈並把埠關掉。這剛好補上了 STP 管不到的死角。
- 風暴控制(Storm Control):直接對每個埠設一個廣播、多播流量的上限,例如超過該埠頻寬的某個百分比就開始丟棄。它用「上升門檻」擋、「下降門檻」恢復,等於在任何協定都還來不及反應的那一瞬間,先替頻寬留一條活路。要注意的是,不少設備的預設門檻偏高(有的高達常見頻寬),對廣播來說形同虛設,務必手動調到合理的低水位。
幾個工程上的判斷準則與常見誤區
裝備買對了,設定觀念錯了照樣出事。這幾點是我們在規劃時一定會盯緊的:
- 誤區一:非網管交換器也能防環。純粹的廉價非網管交換器沒有 STP、也沒有環路偵測,遇到迴圈完全束手無策,反而是廣播風暴的最佳幫兇。核心與骨幹一定要用網管型交換器。
- 誤區二:STP 和 RSTP 混著用沒差。網路裡只要有一台舊設備只支援傳統 STP,和它相連的那段鏈路往往會退回慢速的 STP 模式,讓你精心規劃的秒級收斂破功。設備世代盡量統一。
- 誤區三:邊緣埠開了 BPDU 防護就不用管了。err-disabled 是一種「保護性關閉」,原因排除後那個埠不會自己活過來,要嘛人工重啟、要嘛設定自動復原(errdisable recovery)搭配合理的冷卻時間,否則使用者明明插對線也上不了網,反而變成另一種客訴。
- 備援互接不等於亂接。想做線路備援是對的,但一定要在有開 STP/RSTP 的網管交換器之間做,讓協定去決定哪條通、哪條備;在沒有防環機制的設備上硬拉兩條線,那不叫備援,叫自埋地雷。
- 邊界要認清:協定防的是「拓樸」,防不了「物理蠢事」被無限放大。STP 這一家族解決的是交換器彼此之間的迴圈判斷,但真正的第一線,永遠是清楚的線材標籤、規範化的機櫃整線,以及「要擴充孔位請先通報、別自己亂接」的內部規矩。技術與管理這兩條腿,缺一不可。
回到開頭那間高雄的公司。事後我們把核心換成網管型交換器、開好 RSTP,邊緣埠一律加上 BPDU 防護與環路偵測,再搭配風暴控制的合理門檻,機櫃與牆孔的線材標籤也重新整理清楚(可參考我們另一篇談整線的文章)。之後,同樣的插錯又發生過一次:差別是,這回只有那個被私接的孔被自動關掉,指示燈一亮就知道去哪找人,全公司其他人完全無感。這就是「有沒有做防護」的天壤之別。