3. STP/RSTP/MSTP 生成树协议优化
生成树协议,说白了就是给交换网络装个「防环刹车」。我刚入行那会儿,觉得这玩意儿就是交换机自己玩的东西,直到有一次在机房亲眼看到广播风暴——所有端口灯狂闪,交换机烫得能煎鸡蛋。嗯,从那以后我再也不敢轻视 STP 了。
3.1 生成树的工作原理与选举机制
STP 的核心逻辑其实很简单:通过阻塞冗余链路,把物理上有环的网络修剪成逻辑上无环的树形结构。但具体怎么选根、怎么堵端口,这里头有门道。
3.1.1 桥 ID 与根桥选举
每台交换机都有一个桥 ID,由桥优先级(2 字节)和MAC 地址(6 字节)组成。选举根桥时,先比优先级,数值越小越优先;优先级一样,再比 MAC 地址,也是越小越优先。
3.1.2 端口角色与状态
STP 定义了三种端口角色:
- 根端口(RP):非根桥上离根桥最近的端口,负责接收 BPDU。
- 指定端口(DP):每条链路上离根桥最近的端口,负责发送 BPDU。
- 阻塞端口(AP):既不是 RP 也不是 DP 的端口,逻辑上被堵住。
端口状态有 5 种:Blocking、Listening、Learning、Forwarding、Disabled。从 Blocking 到 Forwarding 要经过 30 秒(2 个 Forward Delay + 1 个 Max Age),这就是 STP 慢的原因。
3.2 RSTP 快速收敛优化参数
RSTP(802.1w)把 STP 的 30 秒收敛压缩到了 1 秒以内。怎么做到的?说白了就是改了三个东西:端口角色更丰富、状态更少、主动协商代替被动等待。
3.2.1 端口角色扩展
RSTP 在 STP 基础上加了两个角色:
- 替代端口(Alternate Port):根端口的备份,如果 RP 挂了,它立刻顶上。
- 备份端口(Backup Port):指定端口的备份,一般出现在共享链路上。
端口状态也从 5 种精简到 3 种:Discarding、Learning、Forwarding。Discarding 合并了原来的 Blocking、Listening 和 Disabled。
3.2.2 关键优化参数
| 参数 | 默认值 | 优化建议 | 说明 |
|---|---|---|---|
| Hello Time | 2 秒 | 1 秒 | BPDU 发送间隔,调小能加快故障检测 |
| Forward Delay | 15 秒 | 4 秒 | 端口从 Discarding 到 Forwarding 的等待时间 |
| Max Age | 20 秒 | 6 秒 | BPDU 老化时间,调小能加速拓扑变更 |
| Link Type | 自动 | 点对点 | 强制点对点模式,避免共享链路误判 |
我建议:在接入层交换机上,把连接终端的端口开启 PortFast 和 BPDU Guard。PortFast 让端口跳过 Listening 和 Learning 直接进入 Forwarding,BPDU Guard 防止非法交换机接入导致环路。这两个组合拳,能解决 90% 的接入层环路问题。
3.2.3 配置示例
# 全局启用 RSTP
spanning-tree mode rapid-pvst
# 调整定时器(建议在根桥上配置)
spanning-tree vlan 1 hello-time 1
spanning-tree vlan 1 forward-time 4
spanning-tree vlan 1 max-age 6
# 端口优化
interface GigabitEthernet0/1
spanning-tree portfast
spanning-tree bpduguard enable
spanning-tree link-type point-to-point
3.3 MSTP 多实例负载均衡配置实战
RSTP 虽然快,但所有 VLAN 共用一棵树,流量只能走一条路。MSTP(802.1s)把多个 VLAN 映射到不同的实例里,每个实例独立跑生成树,实现真正的负载均衡。
3.3.1 实例与 VLAN 映射
MSTP 的核心是「实例」这个概念。一个实例就是一棵独立的生成树,你可以把不同的 VLAN 分到不同的实例里。比如:
- 实例 1:VLAN 10、20、30
- 实例 2:VLAN 40、50、60
- 实例 0:其余所有 VLAN(默认实例)
3.3.2 配置步骤
- 进入 MST 配置模式:
spanning-tree mst configuration - 设置域名:
name YOUR_DOMAIN(所有交换机必须一致) - 创建实例并映射 VLAN:
instance 1 vlan 10,20,30 - 设置实例优先级:
spanning-tree mst 1 priority 4096
3.3.3 完整配置示例
# 交换机 A(实例 1 的根桥)
spanning-tree mode mst
spanning-tree mst configuration
name CORP-MST
revision 1
instance 1 vlan 10,20,30
instance 2 vlan 40,50,60
!
spanning-tree mst 1 priority 4096
spanning-tree mst 2 priority 8192
# 交换机 B(实例 2 的根桥)
spanning-tree mode mst
spanning-tree mst configuration
name CORP-MST
revision 1
instance 1 vlan 10,20,30
instance 2 vlan 40,50,60
!
spanning-tree mst 1 priority 8192
spanning-tree mst 2 priority 4096
这样配置后,VLAN 10/20/30 的流量走交换机 A,VLAN 40/50/60 的流量走交换机 B,两条链路都用起来了。
3.4 常见环路故障排查与恢复
环路故障是网络工程师的噩梦。我经历过几次,总结了一套排查流程,分享给你。
3.4.1 环路症状
- 端口灯狂闪:所有端口指示灯像跑马灯一样快速闪烁。
- CPU 飙升:交换机 CPU 利用率冲到 90% 以上,SSH 都连不上。
- 网络时断时续:Ping 延迟从 1ms 跳到 2000ms,甚至丢包。
- 广播包暴增:用
show interface看到广播包数量异常高。
3.4.2 排查步骤
- 物理隔离:先拔掉疑似环路的链路,恢复网络再说。
- 查看生成树状态:
show spanning-tree,看端口角色和状态是否异常。 - 检查 BPDU 收发:
show spanning-tree detail,看 BPDU 计数是否正常。 - 定位环路端口:
show interface status,找那些流量异常高的端口。 - 启用 BPDU Guard:在接入端口上开启 BPDU Guard,防止非法设备引发环路。
3.4.3 恢复命令
# 清除生成树拓扑(慎用,会引发短暂中断)
clear spanning-tree detected-protocols
# 重置端口状态
interface GigabitEthernet0/1
shutdown
no shutdown
# 查看历史拓扑变更
show spanning-tree history
3.5 本章知识体系
下面这张图帮你理清 STP、RSTP、MSTP 的关系和优化要点:
生成树协议优化,说白了就是三件事:选对根桥、调快收敛、用好带宽。STP 是保底方案,RSTP 是速度方案,MSTP 是效率方案。你想想看,如果你的网络里只有几十台交换机,RSTP 完全够用;但如果核心层有冗余链路,又想充分利用带宽,MSTP 才是正解。
我的最终建议:别把生成树协议当成「配完就不管」的东西。定期检查拓扑变更次数、端口角色变化、BPDU 异常计数,这些指标能帮你提前发现隐患。我每个月都会跑一次 show spanning-tree summary,看看有没有异常。养成这个习惯,环路故障至少减少 80%。