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)报文来协商拓扑。整个过程分三步:

  1. 选举根桥(Root Bridge):所有交换机中,桥ID最小的成为根桥。桥ID = 优先级 + MAC地址。
  2. 选举根端口(Root Port):每台非根桥上,到根桥路径开销最小的端口。
  3. 选举指定端口(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

环路检测会定期发送探测帧,如果发现自己的探测帧从另一个端口回来了,说明有环路,直接关闭端口。

总结一下我的三层防护:

  1. STP/RSTP/MSTP:逻辑上防环路
  2. 风暴控制:物理上限广播
  3. BPDU保护 + 环路检测:兜底保命

4.6 选型建议

场景 推荐协议 理由
小型网络,<10台交换机 RSTP 配置简单,收敛快
大型网络,多VLAN MSTP 负载均衡,资源利用率高
工业现场,实时性要求高 RSTP + 边缘端口 收敛时间<1秒
数据中心,低延迟 考虑堆叠或MLAG STP不适合超低延迟场景

嗯,生成树这块内容不少,但核心就一句话:冗余要做,环路要防,收敛要快。你只要把这三个点拿捏住了,网络冗余设计基本不会出大问题。

下一章我们聊聊链路聚合和堆叠技术,那又是另一种冗余思路了。