第16篇:STP 生成树协议原理——根桥、根端口、指定端口选举
一、写在前面
上一篇文章我们看到了环路有多可怕——广播风暴让全网瘫痪。那怎么既保留冗余链路(万一一条断了还有备胎),又避免环路呢?
STP(Spanning Tree Protocol,生成树协议) 就是干这个的:
STP 通过逻辑阻塞某些端口,把环形拓扑"剪"成一个无环的树形拓扑,同时保留冗余链路作为备份。
二、STP 的核心思想
2.1 树 vs 环
环 树
┌───A───┐ A(根桥)
│ │ │
B───C───D B C
│ │ │
E D───E
(C↔D 某条链路被阻塞)
STP 的核心就是在网络中选出一棵"树",多余的链路逻辑上阻塞,只留一条最优路径。
2.2 三个选举步骤
STP 通过三步选举计算出树:
| 步骤 | 选举什么 | 谁能当选 |
|---|---|---|
| 1 | 根桥(Root Bridge) | 桥 ID 最小的交换机 |
| 2 | 根端口(Root Port) | 每台非根桥上到根桥最近的端口 |
| 3 | 指定端口(Designated Port) | 每条链路上离根桥更近的端口 |
最终的端口角色:Root Port + Designated Port 转发(Forwarding),其他端口阻塞(Blocking)。
三、关键参数
3.1 桥 ID(Bridge ID)
桥 ID 是交换机在 STP 中的"身份证":
桥 ID = 桥优先级(2 字节) + MAC 地址(6 字节)
- 优先级范围:0~65535(默认 32768)
- 优先级步长:4096(华为只能配置 4096 的倍数)
- 桥优先级越高(数值越小),越可能成为根桥
3.2 路径开销(Path Cost)
路径开销衡量到达根桥的距离:
| 链路速率 | STP 开销(802.1D) | RSTP 开销(802.1t) |
|---|---|---|
| 10 Mbps | 100 | 2,000,000 |
| 100 Mbps | 19 | 200,000 |
| 1 Gbps | 4 | 20,000 |
| 10 Gbps | 2 | 2,000 |
端口开销 = 端口所在链路的标准开销值。 路径开销 = 从本设备到根桥沿途端口开销之和。
3.3 端口 ID(Port ID)
当桥优先级和路径开销都相同时比较:
端口 ID = 端口优先级(1 字节) + 端口号(1 字节)
- 端口优先级默认 128(范围 0~240,步长 16)
- 端口号是物理端口编号
四、STP 选举过程详解
用下面的拓扑来说明:
[SW-A] Priority=8192, MAC=AAAA
G0/0/1 G0/0/2
│ 100M │ 100M
│ │
G0/0/1 G0/0/1
[SW-B] [SW-C]
Priority=32768 Priority=32768
MAC=BBBB MAC=CCCC
G0/0/2
│ 1G
│
G0/0/2
[SW-D]
Priority=32768
MAC=DDDD
第 1 步:选举根桥
所有交换机通过交换 BPDU 报文,比较桥 ID:
| 交换机 | 优先级 | MAC | 桥 ID(越小越优) |
|---|---|---|---|
| SW-A | 8192 | AAAA | 8192.AAAA ← 最小! |
| SW-B | 32768 | BBBB | 32768.BBBB |
| SW-C | 32768 | CCCC | 32768.CCCC |
| SW-D | 32768 | DDDD | 32768.DDDD |
结果:SW-A 成为根桥(Root Bridge)。
第 2 步:选举根端口(每台非根桥)
根端口是每台非根桥上到达根桥路径开销最小的端口。
计算路径开销:
| 设备 | 端口 | 到根桥路径 | 路径开销 | 结论 |
|---|---|---|---|---|
| SW-B | G0/0/1 | SW-B→SW-A | 19(100M) | 最小 → 根端口 |
| SW-B | G0/0/2 | SW-B→SW-D→SW-C→SW-A | 19+4+19=42 | 更大 |
| SW-C | G0/0/1 | SW-C→SW-A | 19(100M) | 最小 → 根端口 |
| SW-D | G0/0/2 | SW-D→SW-B→SW-A | 4+19=23 | 最小 → 根端口 |
| SW-D | 间接 | SW-D→SW-C→SW-A | 19+4=23 | 相等(比较端口 ID)→ G0/0/2 更小 |
注意:SW-D 两个路径开销都是 23(D→B→A 和 D→C→A),此时比较: - 对端桥 ID(B vs C):32768.BBBB < 32768.CCCC → B 更优 - 所以走 B 路径的 G0/0/2 成为根端口
第 3 步:选举指定端口(每条链路)
每条链路上,离根桥更近的端口成为指定端口。
| 链路 | 候选 A | 候选 B | 谁更近 | 指定端口 |
|---|---|---|---|---|
| SW-A↔SW-B | SW-A(A 自己就是根桥) | SW-B(非根桥) | SW-A | G0/0/1 on SW-A |
| SW-A↔SW-C | SW-A(根桥) | SW-C(非根桥) | SW-A | G0/0/2 on SW-A |
| SW-B↔SW-D | SW-B(根桥距离=0+19) | SW-D(根桥距离=4+19=23) | SW-B | G0/0/2 on SW-B |
| SW-C↔SW-D | SW-C(根桥距离=0+19) | SW-D(根桥距离=4+19=23) | SW-C | G0/0/1 on SW-C |
最终端口角色
| 交换机 | 端口 | 角色 | 状态 |
|---|---|---|---|
| SW-A(根桥) | G0/0/1 | Designated | Forwarding |
| SW-A(根桥) | G0/0/2 | Designated | Forwarding |
| SW-B | G0/0/1 | Root | Forwarding |
| SW-B | G0/0/2 | Designated | Forwarding |
| SW-C | G0/0/1 | Root | Forwarding |
| SW-C | G0/0/2 | 阻塞(Alternate) | Blocking ← 冗余链路被阻塞 |
| SW-D | G0/0/2 | Root | Forwarding |
| SW-D | G0/0/1 | 阻塞(Alternate) | Blocking |
结果:SW-C↔SW-D 的链路被阻塞,环被打破,形成树形拓扑。
五、STP 定时器
| 定时器 | 默认值 | 作用 |
|---|---|---|
| Hello 时间 | 2 秒 | 根桥发送 BPDU 的间隔 |
| Max Age | 20 秒 | 设备等待 BPDU 超时(10 个 Hello) |
| Forward Delay | 15 秒 | 端口状态迁移的等待时间 |
六、BPDU 报文
STP 通过 BPDU(Bridge Protocol Data Unit) 报文通信:
Protocol ID (2B) = 0x0000 Version (1B) = 0x00 Message Type (1B) = 0x00 Flags (1B) Root Bridge ID (8B) Root Path Cost (4B) Bridge ID (8B) Port ID (2B) ...
根桥每 2 秒发送一次 BPDU,非根桥收到后计算并转发 BPDU。
七、思考
- 根桥是怎么选出来的?桥 ID 由哪两部分组成?
- 一台交换机优先级设为 4096,另一台是默认值 32768,谁的桥 ID 更小?谁会成为根桥?
- 根端口和指定端口的选举前提各是什么?
- 在一条链路上,如果两端交换机的路径开销相同,怎么决定指定端口?
- 逻辑阻塞的端口在链路故障时会发生什么变化?
- STP 的 Forward Delay 为什么需要 15 秒?为什么不能直接切换到转发状态?
下篇预告:第17篇《STP端口状态迁移_从Disable到Forwarding》——理解STP端口状态从Disable到Forwarding的完整迁移过程。