1. 情境動畫
按「下一步」逐步看。這一課由小故事 7 的三部 Switch(交換器)開始,它們用 STP(生成樹協定)解開了環路:S1 是 Root Bridge(根橋),S3 通往 S2 的 Port 被 Blocked(阻斷)。
序幕:溫習一下
第 1 步/共 9 步
三部 Switch 的樹
還記得小故事 7 嗎?三部 Switch 圍成一個圈。STP(生成樹協定)選了 S1 做 Root Bridge(根橋),S3 往 S2 的 Port 暫停轉發,圈就解開了。
動畫文字版(全部步驟)
- 序幕:溫習一下
- 三部 Switch 的樹 八爪:還記得小故事 7 嗎?三部 Switch 圍成一個圈。STP(生成樹協定)選了 S1 做 Root Bridge(根橋),S3 往 S2 的 Port 暫停轉發,圈就解開了。
- 詳細內容:網絡小故事 7「八爪的迷路風暴」
- 其實是抽籤 八爪:不過 S1 為什麼當選?三部 Switch 的優先值都是預設的 32768,加上 VLAN 10,全部是 32778。最後只能比 MAC Address(硬體位址),S1 的
…:A1剛好最小。這其實是抽籤! - 第一幕:客廳來了新朋友
- 牆身插座多了一部 Switch 阿麥:表哥帶來一部舊 Switch,隨手插進客廳的牆身插座,即 S2 的 Gi0/5。它以前在公司做核心 Switch,優先值早已調低到 4096。
- 「我的 Bridge ID 最小!」 八爪:S4 一接上就發出 BPDU(橋接協定資料單元):Bridge ID 是 4096 + 10 = 4106。我們三個核對一下,32778 比 4106 大,真的輸了。
- 樹根搬到客廳 八爪:整棵樹以 S4 為中心重新計算:S2 的 Root Port 變成 Gi0/5,S1 要經 S2 才到得了樹根,S3 往 S1 的那條線反而變成後備。
- 繞遠路 小比:我由書房的 Access Point 出發,要去 S1 那邊的家中 Router。以前經 S3 → S1 一步就到,現在要繞經客廳的 S2!而且 S4 一被拔走,全屋又要重新計算一次。
- 第二幕:修好網絡
- BPDU Guard 關門 八爪:牆身插座只應該接電腦。在 S2 的 Gi0/5 開啟 BPDU Guard(BPDU 防護):這個 Port 一收到 BPDU,就立即把它變成 err-disabled(錯誤停用)。
- 正式指定樹根 八爪:再用
root primary把 S1 的優先值設成 24576,用root secondary把 S2 設成 28672。以後樹根由我們決定,不再抽籤。 - PortFast:一插上就上網 阿麥:最後,接我和電視的 Port 開啟 PortFast(快速連接埠)。我開機後幾乎立即可以上網,不用再等大約 30 秒。
2. 任務簡報
發生了什麼事?
阿麥的表哥帶來一部舊 Switch,我們叫它 S4。他隨手把它插進客廳的牆身網絡插座。S4 以前在公司當核心 Switch,優先值早已被調低到 4096,而且接網線的 Port 同樣屬於 VLAN(虛擬區域網絡)10,即家人區。
S4 一接上,就不停發出 BPDU(橋接協定資料單元),宣稱「我的 Bridge ID 最小」。其他 Switch 核對後同意,於是:
- S4 成為新的 Root Bridge。
- 全屋的「樹」以 S4 為中心重新計算,連 S1 往外的流量也要繞經客廳。
- 以後 S4 一關機或被拔走,全屋又要重新計算一次,網絡會斷斷續續。
小故事 7 裡,S1 當選 Root Bridge 其實是「抽籤」的結果:大家的優先值都是預設的 32768,只是 S1 的 MAC Address(硬體位址)剛好最小。任何一部 MAC Address 更小、或者優先值更低的 Switch 接進來,都可以搶走樹根。
拓撲圖
| Switch | MAC Address | Cisco 寫法 | 原本的優先值 | Port |
|---|---|---|---|---|
| S1(核心) | 00:00:5E:00:53:A1 |
0000.5e00.53a1 |
32768 | Gi0/1 → S2、Gi0/2 → S3、Gi0/3 → 家中 Router |
| S2(客廳) | 00:00:5E:00:53:A2 |
0000.5e00.53a2 |
32768 | Gi0/1 → S1、Gi0/2 → S3、Gi0/3 → 阿麥、Gi0/4 → 電視、Gi0/5 → 牆身插座 |
| S3(書房) | 00:00:5E:00:53:A3 |
0000.5e00.53a3 |
32768 | Gi0/1 → S1、Gi0/2 → S2、Gi0/3 → Access Point(無線基地台) |
| S4(冒牌) | 00:00:5E:00:53:A0 |
0000.5e00.53a0 |
4096 | 接到 S2 的 Gi0/5 |
Cisco 設備把 MAC Address 寫成三組、每組四個十六進制數字,中間用點分隔。00:00:5E:00:53:A1 和 0000.5e00.53a1 是同一個地址,只是寫法不同。
「Gi0/1」是 GigabitEthernet0/1 的簡寫,即第 1 個 1 Gbps Port(連接埠)。所有 Switch 之間的網線都是 1 Gbps,Path Cost(路徑成本)為 4。為了簡單,這一課每條 Switch 之間的連線都當成一條網線;下一課才把 S1 和 S3 之間捆成兩條。
今課目標
- 看懂
show spanning-tree的輸出,找出誰是 Root Bridge、每個 Port 擔任什麼角色。 - 用 BPDU Guard(BPDU 防護)把接終端裝置的 Port 保護好,阻止冒牌 Switch。
- 正式指定 S1 為 Root Bridge、S2 為後備,不再靠 MAC Address「抽籤」。
- 用 PortFast(快速連接埠)讓電腦一插上網線就可以上網。
3. 原理深入
Bridge ID 的真正樣子
小故事說 Bridge ID(橋接器識別碼)=優先值+MAC Address。在今天的 Switch 上,它其實有 8 個位元組(64 位元):
- Bridge Priority(優先值)只剩 4 位元,所以只可以設成 4096 的倍數:0、4096、8192……61440,共 16 個選擇。
- Extended System ID(擴充系統識別碼)佔 12 位元,自動填上 VLAN 號碼。這個設計來自 IEEE 802.1t,讓每個 VLAN 都有自己的 Bridge ID。
所以在 VLAN 10,預設的 Bridge ID 優先值部分是 32768 + 10 = 32778。在 show 輸出裡看到 32778、24586 這類「奇怪」數字,就是這個原因。
STP 家族:誰是誰?
| 名稱 | 標準 | 樹的數目 | 恢復速度 |
|---|---|---|---|
| STP | IEEE 802.1D | 全個網絡一棵 | 30 至 50 秒 |
| PVST+(每 VLAN 生成樹) | Cisco 專有 | 每個 VLAN 一棵 | 30 至 50 秒 |
| RSTP(快速生成樹協定) | IEEE 802.1w(2001 年),後來併入 802.1D-2004 | 全個網絡一棵 | 通常幾秒內 |
| Rapid PVST+ | Cisco 專有 | 每個 VLAN 一棵 RSTP | 通常幾秒內 |
| MST(多重生成樹) | IEEE 802.1s,後來併入 802.1Q | 幾個 VLAN 共用一棵,數目自訂 | 通常幾秒內 |
「每個 VLAN 一棵樹」有個好處:VLAN 10 可以用 S1 做樹根,VLAN 20 可以用 S2 做樹根,兩條上行線各自分擔一部分流量。代價是 VLAN 越多,Switch 要計算的樹越多。這一課用 Cisco Switch 最常見的 Rapid PVST+,只看 VLAN 10 那棵樹。
RSTP 的 Port Role(連接埠角色)
小故事的 Blocked Port,在 RSTP 裡分得更細:
| 角色 | 在 show 裡寫成 |
意思 |
|---|---|---|
| Root Port(根連接埠) | Root |
通往 Root Bridge 最近的 Port,每部非樹根 Switch 只有一個 |
| Designated Port(指定連接埠) | Desg |
每條網線上負責轉送的一端 |
| Alternate Port(替代連接埠) | Altn |
另一條通往 Root Bridge 的後備路;Root Port 斷了,它可以立即頂上 |
| Backup Port(備份連接埠) | Back |
同一部 Switch 有兩個 Port 接在同一個網段上時的後備,今天很少見 |
RSTP 的 Port State(連接埠狀態)
傳統 STP 有五個狀態,RSTP 簡化成三個:
| RSTP 狀態 | 對應的傳統狀態 | 學 MAC Address? | 轉送 Frame(訊框)? |
|---|---|---|---|
| Discarding(丟棄) | Disabled、Blocking、Listening | 否 | 否 |
| Learning(學習) | Learning | 是 | 否 |
| Forwarding(轉發) | Forwarding | 是 | 是 |
Cisco 的 show spanning-tree 在 Rapid PVST+ 下仍然把 Discarding 寫成 BLK,所以看到 Altn BLK 不用奇怪。
RSTP 為什麼快?
- 每部 Switch 自己發 BPDU,每 2 秒一次(Hello Time)。連續 3 次收不到鄰居的 BPDU(約 6 秒),就當鄰居已經不在;網線直接斷開更是立即知道。
- Alternate Port 早已準備好。 Root Port 一斷,Alternate Port 立即升級為新的 Root Port,不用重新聆聽和學習。
- Proposal/Agreement(提議/同意)交握。 在 Point-to-Point(點對點)連線上,兩部 Switch 直接互相確認「你這邊安全嗎?」,確認後 Port 立即轉發,不用等計時器。
Edge Port(邊緣連接埠)與 PortFast
接電腦、電視、打印機的 Port 叫 Edge Port,因為那一端不會再有 Switch。問題是:電腦不會回覆 Proposal,Switch 只好慢慢等,由 Discarding 經 Learning 到 Forwarding,前後約 30 秒。阿麥的電腦開機後,DHCP(動態主機設定協定)可能等得不耐煩而逾時,拿不到 IP Address(網絡位址)。
在 Cisco Switch 上開啟 PortFast,就等於告訴 Switch:「這是 Edge Port。」效果有兩個:
- 網線一插上,Port 立即進入 Forwarding。
- 這個 Port 上落時,不會觸發 Topology Change(拓撲變更)。否則每次有人開關電腦,全網的 Switch 都要清走一部分 MAC Address Table(MAC 位址表),重新 Flooding(泛洪)。
保護 STP:四種 Guard 和 Filter
PortFast 有個危險:如果有人在 Edge Port 接上 Switch,Port 仍然立即轉發,有機會短暫形成環路,甚至像 S4 一樣搶走樹根。所以要配合保護功能:
| 功能 | 放在哪裡 | 收到 BPDU 時怎樣做 | 恢復方法 |
|---|---|---|---|
| BPDU Guard(BPDU 防護) | 接終端裝置的 Edge Port | 立即把 Port 變成 err-disabled(錯誤停用),完全關閉 | 手動 shutdown/no shutdown,或設定自動恢復 |
| Root Guard(根防護) | 接下游 Switch、而樹根不應在那邊的 Designated Port | 只在收到「更好」的 BPDU(想搶樹根)時,把 Port 變成 root-inconsistent,暫停轉送 | 對方停止發出更好的 BPDU 後自動恢復 |
| Loop Guard(環路防護) | Root Port 和 Alternate Port | 如果突然收不到 BPDU(例如單向網線故障),不會貿然轉發,而是變成 loop-inconsistent | 再收到 BPDU 後自動恢復 |
| BPDU Filter(BPDU 過濾) | 很少用 | 停止收發 BPDU | — |
BPDU Filter 等於令 Port 對 STP「又聾又啞」,用錯地方會造成真正的環路。CCNA 要求認識它,但實際工作中要非常小心。
這一課的冒牌 Switch 接在 Edge Port 上,最適合用 BPDU Guard。
Path Cost 的兩套數值
| 網線速度 | Short(802.1D-1998) | Long(802.1t) |
|---|---|---|
| 100 Mbps | 19 | 200 000 |
| 1 Gbps | 4 | 20 000 |
| 10 Gbps | 2 | 2 000 |
| 100 Gbps | — | 200 |
很多 Cisco Switch 預設用 Short,但部分新型號預設用 Long。同一個網絡內的 Switch 一定要用同一套,否則大家計算出來的「遠近」會不一致。本課一律用 Short,1 Gbps = 4。
4. 設定步驟
以下指令以 Cisco IOS 為例。其他廠牌(例如 Juniper、Aruba、華為)的寫法不同,但要設定的東西一樣:Root Bridge、Edge Port 和 BPDU 保護。
第 1 步:三部 Switch 都用 Rapid PVST+
S1# configure terminal
S1(config)# spanning-tree mode rapid-pvst ! 很多新型號已是預設
S1(config)# end
S2 和 S3 做同樣的設定。模式不一致時,Rapid PVST+ 仍然可以和舊式 PVST+ 溝通,但那一段會退回舊的慢速做法。
第 2 步:在 Edge Port 開啟 BPDU Guard
先處理冒牌 Switch。在 S2 的牆身插座 Port 開啟 BPDU Guard:
S2# configure terminal
S2(config)# interface gi0/5
S2(config-if)# spanning-tree bpduguard enable
%SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port GigabitEthernet0/5 with BPDU Guard enabled. Disabling port.
%PM-4-ERR_DISABLE: bpduguard error detected on Gi0/5, putting Gi0/5 in err-disable state
S4 仍然接著,下一個 BPDU 一到,Port 就被關掉。這正是我們想要的。
第 3 步:正式指定 Root Bridge 和後備
S1(config)# spanning-tree vlan 10 root primary ! 通常設成 24576
S2(config)# spanning-tree vlan 10 root secondary ! 設成 28672
root primary 和 root secondary 是 Cisco 的「巨集」指令,它們只是幫你計算並寫入優先值。在 show running-config 裡,你看到的會是:
spanning-tree vlan 10 priority 24576
你也可以直接寫 spanning-tree vlan 10 priority 24576,效果一樣,而且數值更可預計。
第 4 步:為其他 Edge Port 開啟 PortFast
S2(config)# interface range gi0/3 - 4
S2(config-if-range)# spanning-tree portfast
%Warning: portfast should only be enabled on ports connected to a single
host. Connecting hubs, concentrators, switches, bridges, etc... to this
interface when portfast is enabled, can cause temporary bridging loops.
Use with CAUTION
Switch 會印出警告,提醒你這個 Port 只可以接單一部終端裝置。
懶人設定:全部 PortFast Port 自動有 BPDU Guard
S2(config)# spanning-tree portfast bpduguard default
這一行令所有開了 PortFast 的 Port 自動啟用 BPDU Guard,不用逐個 Port 設定。很多公司把它列為標準設定。
5. 驗證結果
修好之前:S1 看到的世界
S1# show spanning-tree vlan 10
VLAN0010
Spanning tree enabled protocol rstp
Root ID Priority 4106
Address 0000.5e00.53a0
Cost 8
Port 1 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Address 0000.5e00.53a1
讀法:
protocol rstp:這棵樹用 RSTP 計算,即 Rapid PVST+。- Root ID 是「我認為的樹根」,Bridge ID 是「我自己」。兩者不同,所以 S1 不是樹根。
- 樹根的優先值是 4106 = 4096 + VLAN 10,地址
0000.5e00.53a0,正是冒牌的 S4。 - Cost 8:由 S1 到樹根要走兩段 1 Gbps 網線(4 + 4)。
- Port 1:S1 的 Root Port 是 Gi0/1,即往 S2 的那條線。
修好之後:S1 成為樹根
S1# show spanning-tree vlan 10
VLAN0010
Spanning tree enabled protocol rstp
Root ID Priority 24586
Address 0000.5e00.53a1
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 24586 (priority 24576 sys-id-ext 10)
Address 0000.5e00.53a1
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/1 Desg FWD 4 128.1 P2p
Gi0/2 Desg FWD 4 128.2 P2p
Gi0/3 Desg FWD 4 128.3 P2p
Root Bridge 的所有 Port 都是 Desg FWD。
S3:找出 Alternate Port
S3# show spanning-tree vlan 10
(上半部省略)
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/1 Root FWD 4 128.1 P2p
Gi0/2 Altn BLK 4 128.2 P2p
Gi0/3 Desg FWD 4 128.3 P2p
表格每一欄的意思:
| 欄位 | 意思 |
|---|---|
| Role | Port Role:Root、Desg、Altn、Back |
| Sts | 狀態:FWD(Forwarding)、BLK(Discarding)、LRN(Learning) |
| Cost | 這個 Port 自己的 Path Cost |
| Prio.Nbr | Port Priority(連接埠優先值,預設 128)和 Port 編號,打和時用來比較 |
| Type | P2p 是 Point-to-Point;Edge 表示開了 PortFast;Shr 是 Shared(半雙工,例如接 Hub(集線器)) |
S3 通往 S2 的 Gi0/2 是 Altn BLK:S2 和 S3 去樹根的成本一樣(都是 4),但 S2 的 Bridge ID(28682)比 S3(32778)小,所以 S2 那一端當選 Designated Port。
S2:看 Edge Port 和 err-disabled
S2# show spanning-tree vlan 10
(上半部省略)
Gi0/1 Root FWD 4 128.1 P2p
Gi0/2 Desg FWD 4 128.2 P2p
Gi0/3 Desg FWD 4 128.3 P2p Edge
Gi0/4 Desg FWD 4 128.4 P2p Edge
S2# show interfaces status
Port Name Status Vlan Duplex Speed Type
Gi0/3 amai-pc connected 10 a-full a-1000 10/100/1000BaseTX
Gi0/5 living-room-wall err-disabled 10 auto auto 10/100/1000BaseTX
Gi0/5 已經不在 STP 表內,因為它被關掉了;show interfaces status 顯示它是 err-disabled。
6. CLI Lab
輪到你了!下面是一個模擬終端機,S1、S2、S3 由你控制,冒牌的 S4 已經接在客廳。模擬器會按 Bridge ID 和 Path Cost 真正計算結果,所以用不同的次序設定,也會看到相應的變化,包括常見的錯誤。
CLI Lab
趕走冒牌 Root Bridge
S4 已經接在客廳的牆身插座,搶走了 Root Bridge 的位置。登入 S1、S2、S3,按任務清單逐步修好整個網絡。
輸入指令後按 Enter。可用縮寫(例如 sh span vl 10)、? 看可用指令、↑/↓ 翻查剛才的指令。
7. 疑難排解
| 症狀 | 可能原因 | 檢查指令 | 修正 |
|---|---|---|---|
| Root Bridge 不是你想要的那部 Switch | 沒有設定優先值,或者有優先值更低的 Switch 接入 | show spanning-tree vlan 10,看 Root ID 的 Address |
用 root primary 或 priority 指定樹根;在 Edge Port 開 BPDU Guard |
| 電腦插上網線後要等約 30 秒才可以上網 | Edge Port 沒有開 PortFast | show spanning-tree,Type 欄沒有 Edge |
spanning-tree portfast |
| 某個 Port 突然「死了」,燈號熄滅 | BPDU Guard 偵測到 BPDU,Port 變成 err-disabled | show interfaces status、show logging |
先找出並拔走接錯的 Switch,再 shutdown、no shutdown |
用了 root primary,優先值卻變成 20480、16384 甚至 0 |
當時已經有一部優先值低於 24576 的 Switch 做樹根,巨集會設成比它再低 4096 | show running-config、show spanning-tree |
先處理那部 Switch,再用 priority 寫入確定的數值 |
| 設了優先值 25000,Switch 不接受 | 優先值必須是 4096 的倍數 | 看錯誤訊息 | 改用 24576 或 28672 等數值 |
| Switch 之間的上行線被關掉 | 把 BPDU Guard 開在連接自己 Switch 的 Port 上 | show interfaces status |
取消該 Port 的 BPDU Guard,再重新啟用 Port |
讓 err-disabled 自動恢復
如果不想每次都人手重啟 Port,可以設定自動恢復:
S2(config)# errdisable recovery cause bpduguard
S2(config)# errdisable recovery interval 300 ! 秒,預設也是 300
不過冒牌 Switch 仍然接著的話,Port 每 5 分鐘恢復一次,又立即被關掉。自動恢復只是方便,找出源頭才是真正的修正。
8. 常見誤解
- 「Root Bridge 應該選最新、最快的 Switch,STP 會自動做到。」 不會。STP 只比較 Bridge ID,完全不理會 Switch 的型號和速度。不設定優先值,樹根可能落在一部角落裡的舊 Switch。
- 「BPDU Guard 會把 Port 暫停一會兒,之後自動恢復。」 預設不會。err-disabled 的 Port 會一直關閉,直至管理員處理,或者設定了
errdisable recovery。會自動恢復的是 Root Guard 和 Loop Guard。 - 「PortFast 會關掉那個 Port 的 STP。」 不會。PortFast 只是跳過等待;Port 仍然會發出 BPDU,也會處理收到的 BPDU。在 Cisco Switch 上,Edge Port 收到 BPDU 後會失去 Edge 身份,變回普通 Port,所以才需要 BPDU Guard 做第二道保護。
- 「
root primary一定設成 24576。」 不一定。當時的樹根如果已經低於 24576,它會設成更低的數值,見疑難排解。 - 「
Altn BLK的 Port 什麼都不做。」 它不轉送一般 Frame,但會繼續收 BPDU,隨時準備接替 Root Port。 - 動畫和 Lab 簡化了時間。 在真實網絡,BPDU Guard 通常在一兩秒內就把 Port 關掉;RSTP 重新計算也很快,但不同型號和網絡大小會有分別。
9. 小測驗
10. 重點筆記
- Bridge ID 的優先值部分=Bridge Priority(4096 的倍數)+ Extended System ID(VLAN 號碼),所以 VLAN 10 的預設值是 32778。
- Rapid PVST+ 是「每個 VLAN 一棵 RSTP 樹」;RSTP 的 Port Role 有 Root、Designated、Alternate、Backup,狀態只有 Discarding、Learning、Forwarding。
- 一定要正式指定 Root Bridge(
root primary/secondary或priority),不要讓 MAC Address「抽籤」。 - 接終端裝置的 Port 開 PortFast,並配合 BPDU Guard;收到 BPDU 的 Port 會變成 err-disabled,要找出源頭後才重新啟用。
- 讀
show spanning-tree:先比較 Root ID 和 Bridge ID,再看每個 Port 的 Role、Sts 和 Type。
下一站
S1 和 S3 之間只有一條網線,而 S3 通往 S2 的後備線平時只能休息。下一課,八爪會把兩條網線捆成一條邏輯連線,STP 會把它們當成一個 Port 看待:。