4、STP/RSTP/MSTP:生成树协议原理,边缘端口优化,防止广播风暴的工程经验
说到网络冗余,很多人第一反应就是「多接几条线」。没错,物理上冗余确实能提高可靠性。但你想过没有——如果两台交换机之间连了两根网线,会发生什么?
广播风暴。我早年刚入行时就吃过这个亏。那时候在工厂调试设备,手一抖多插了一根跳线,整个产线网络直接瘫痪。车间主任拎着扳手就过来了……嗯,从那以后,我再也不敢小看生成树协议。
4.1 为什么需要生成树?——冗余带来的甜蜜烦恼
先说说网络拓扑里的一个经典问题:环路。
你为了可靠性,给核心交换机之间做了双链路备份。结果呢?广播帧在环路里无限转发,交换机CPU飙升,带宽被占满,所有终端都连不上服务器。这就是典型的广播风暴。
生成树协议(Spanning Tree Protocol,STP)就是干这个的。它的核心思想很简单:
- 逻辑上切断冗余链路,让网络拓扑变成一棵无环的树
- 物理上保留冗余链路,一旦主链路故障,自动恢复备份链路
说白了,就是「物理上我有备份,逻辑上我只用一条」。
核心原则:冗余是为了高可用,不是为了让网络自己把自己搞死。
4.2 STP:老祖宗级别的协议
STP是IEEE 802.1D标准,1980年代就出来了。虽然老,但原理必须懂——后面RSTP和MSTP都是它的改进版。
4.2.1 STP的工作流程
STP通过BPDU(Bridge Protocol Data Unit)报文来协商拓扑。整个过程分三步:
- 选举根桥(Root Bridge):所有交换机中,桥ID最小的成为根桥。桥ID = 优先级 + MAC地址。
- 选举根端口(Root Port):每台非根桥上,到根桥路径开销最小的端口。
- 选举指定端口(Designated Port):每条链路上,到根桥路径开销最小的端口。
剩下的端口,统统变成阻塞状态(Blocking)。
我的经验:桥优先级默认是32768。我习惯把核心交换机优先级改成4096,确保它永远是根桥。这样拓扑稳定,不会因为新加一台交换机就重新选举。
4.2.2 STP的五个端口状态
| 状态 | 说明 | 转发数据 | 学习MAC |
|---|---|---|---|
| Disabled | 端口关闭 | 否 | 否 |
| Blocking | 阻塞状态,只收BPDU | 否 | 否 |
| Listening | 监听状态,准备参与选举 | 否 | 否 |
| Learning | 学习状态,构建MAC表 | 否 | 是 |
| Forwarding | 转发状态,正常通信 | 是 | 是 |
你想想看,从Blocking到Forwarding,要经过50秒(20秒Max Age + 15秒Listening + 15秒Learning)。这在工业现场简直是灾难——设备掉线50秒,PLC可能已经报警了。
注意:STP收敛慢是硬伤。如果你的网络对实时性有要求,别用STP,直接上RSTP。
4.3 RSTP:快速生成树,收敛速度质的飞跃
RSTP(Rapid Spanning Tree Protocol,IEEE 802.1w)把收敛时间从50秒降到了1秒以内。怎么做到的?
4.3.1 端口角色增加了
RSTP在STP的基础上,增加了两个端口角色:
- Alternate Port:根端口的备份。如果根端口挂了,Alternate直接顶上。
- Backup Port:指定端口的备份。一般出现在共享链路上。
说白了,RSTP提前把备份路径算好了,不用像STP那样重新选举。
4.3.2 边缘端口(Edge Port)——我的最爱
这是RSTP里最实用的优化。边缘端口就是直接连接终端设备的端口,比如连PC、连摄像头、连PLC。
为什么叫边缘?因为这种端口后面不可能再接交换机,所以不可能形成环路。
配置成边缘端口后:
- 端口启动后直接进入Forwarding状态,不用等30秒
- 如果收到BPDU,端口自动退出边缘模式,变成普通STP端口
实战建议:所有接入层端口,只要确定后面不接交换机,一律配成边缘端口。我经手的项目,边缘端口配置率必须100%。
配置示例(华为交换机):
interface GigabitEthernet0/0/1
port link-type access
port default vlan 10
stp edged-port enable
思科交换机:
interface GigabitEthernet0/1
switchport mode access
switchport access vlan 10
spanning-tree portfast
避坑指南:我曾经在一个项目里,把所有端口都配了Portfast。结果现场有人误把两根网线插到了同一个交换机上,环路瞬间形成,广播风暴直接干翻全网。所以记住——边缘端口只配在接入侧,互联端口千万别配。
4.4 MSTP:多生成树,让VLAN不再打架
STP和RSTP都有一个共同的问题:整台交换机只有一个生成树实例。所有VLAN共用一棵树。
这意味着什么?
- VLAN 10的流量走链路A
- VLAN 20的流量也只能走链路A
- 链路B闲着,链路A累死
MSTP(Multiple Spanning Tree Protocol,IEEE 802.1s)解决了这个问题。它可以把多个VLAN映射到不同的生成树实例上,实现负载均衡。
4.4.1 MSTP的核心概念
| 概念 | 说明 |
|---|---|
| MST Region | MST域,一组配置相同的交换机组成一个域 |
| IST | 内部生成树,域内所有实例的公共树 |
| MSTI | 多生成树实例,每个实例对应一组VLAN |
| CIST | 公共与内部生成树,跨域的生成树 |
举个例子:
- MSTI 1:映射VLAN 10-20,根桥是Switch A
- MSTI 2:映射VLAN 30-40,根桥是Switch B
这样VLAN 10的流量走Switch A,VLAN 30的流量走Switch B,两条链路都用上了。
4.4.2 MSTP配置要点
配置MSTP时,最关键的是一致性。同一个域内的交换机,必须满足:
- 域名(Region Name)相同
- 修订版本号(Revision Level)相同
- VLAN映射表相同
只要有一条对不上,交换机就会认为不在同一个域,生成树计算就会出问题。
我曾经踩过的坑:有一次升级固件,忘了检查MSTP配置。结果新交换机域名默认是空字符串,老交换机域名是"EDGE-FACTORY"。两台交换机死活不认对方,VLAN 30的流量全走不通。排查了整整半天……后来我养成了一个习惯:每次开局,第一件事就是核对MSTP域名和映射表。
4.5 防止广播风暴的工程经验
生成树协议能防环路,但广播风暴的成因不止环路一个。这里分享几个实战经验:
4.5.1 风暴控制(Storm Control)
不管STP配得多好,总有意外。比如有人插错线、交换机故障、BPDU被过滤……
所以,我建议在所有交换机上开启风暴控制:
# 华为
interface GigabitEthernet0/0/1
broadcast-suppression 20
# 思科
interface GigabitEthernet0/1
storm-control broadcast level 20
这个配置的意思是:广播流量超过端口带宽的20%时,直接丢弃多余的广播帧。
我的习惯:接入层端口设20%,汇聚层设10%,核心层设5%。越往上,对广播的容忍度越低。
4.5.2 BPDU保护
如果有人恶意或无意地在接入端口上接了一台交换机,可能会影响生成树的计算。BPDU保护就是干这个的:
# 华为
stp bpdu-protection
# 思科
spanning-tree portfast bpduguard default
一旦边缘端口收到BPDU,端口立即进入Error-Disable状态。需要手动恢复或配置自动恢复。
4.5.3 环路检测(Loop Detection)
有些场景下,STP可能来不及反应。比如两台傻瓜交换机之间形成了环路。这时候就需要环路检测功能:
# 华为
loop-detection enable
loop-detection action shutdown
环路检测会定期发送探测帧,如果发现自己的探测帧从另一个端口回来了,说明有环路,直接关闭端口。
总结一下我的三层防护:
- STP/RSTP/MSTP:逻辑上防环路
- 风暴控制:物理上限广播
- BPDU保护 + 环路检测:兜底保命
4.6 选型建议
| 场景 | 推荐协议 | 理由 |
|---|---|---|
| 小型网络,<10台交换机 | RSTP | 配置简单,收敛快 |
| 大型网络,多VLAN | MSTP | 负载均衡,资源利用率高 |
| 工业现场,实时性要求高 | RSTP + 边缘端口 | 收敛时间<1秒 |
| 数据中心,低延迟 | 考虑堆叠或MLAG | STP不适合超低延迟场景 |
嗯,生成树这块内容不少,但核心就一句话:冗余要做,环路要防,收敛要快。你只要把这三个点拿捏住了,网络冗余设计基本不会出大问题。
下一章我们聊聊链路聚合和堆叠技术,那又是另一种冗余思路了。