HCIE数通-二层破环专题(上): STP/RSTP/MSTP:从“死锁”到“负载均衡”的进化史

大家好,我是你们的老朋友。上篇文章我们聊了数据包的“一生”,今天我们把目光聚焦在交换网络。
你有没有遇到过这样的场景:明明只是插了一根网线,整个网络就瘫痪了,广播风暴把交换机CPU跑满,所有业务中断,这就是二层环路的“威力”。
今天,我们就来系统学习交换网络如何通过生成树协议(STP)破环,以及它如何一步步进化到RSTP、MSTP,实现秒级收敛和流量负载均衡
一、环路的噩梦:为什么交换网络必须破环?
在二层网络中,为了提高可靠性,我们常常会部署冗余链路 (比如交换机之间用两根线连接)。但物理上的冗余会带来逻辑上的环路,环路的后果有多严重?
- 广播风暴
当网络中存在环路时,广播报文(如ARP请求、DHCP Discover)会在环路中无限循环转发,不断被复制,最终耗尽链路带宽和交换机CPU资源,导致网络瘫痪。 - MAC地址表不稳定
交换机通过源MAC地址学习来建立转发表。在环路中,同一个MAC地址可能从多个接口不断被学习到,导致MAC表不停震荡,转发混乱。 - 网络卡顿、业务中断
环路会引发大量重复报文,正常数据包被淹没,时延剧增,甚至完全无法通信。
一句话总结 :二层环路是交换网络的“癌症”,必须通过破环协议来预防。而生成树协议(STP)就是解决这个问题的开山鼻祖。
二、STP:初代破环技术,30秒的“阵痛”
STP(Spanning Tree Protocol,IEEE 802.1D)是一种通过逻辑阻塞冗余端口,将环状网络修剪成无环树状结构的协议。用于解决在网络的核心层构建冗余链路里产生的网络环路问题,通过在交换机之间传递网桥协议数据单元(Bridge Protocol Data Unit,简称BPDU),通过采用STA生成树算法选举根桥、根端口和指定端口的方式,最终将网络形成一个树形结构的网络,其中,根端口、指定端口都处于转发状态,其他端口处于禁用状态。如果网络拓扑发生改变,将重新计算生成树拓扑。生成树协议的存在,既解决了核心层网络需要冗余链路的网络健壮性要求,又解决了因为冗余链路形成的物理环路导致“广播风暴”问题。

1. STP的核心算法:三步选举法
STP通过选举根桥 、根端口 、指定端口 ,最终阻塞剩余端口来打破环路。
第一步:选举根桥(Root Bridge)
- 交换机之间通过发送BPDU(Bridge Protocol Data Unit)报文来选举。
- 桥ID(BID)最小的交换机当选为根桥 。桥ID = 桥优先级(默认32768)+ 桥MAC地址。
- 根桥上的所有端口都是指定端口(DP) ,始终处于转发状态。
第二步:选举根端口(Root Port)
- 非根桥上,到达根桥路径开销最小 的端口成为根端口。
- 如果开销相同,则依次比较:对端桥ID → 对端端口ID → 本端端口ID,选出最优。
- RPC------>BID------>PID------>本端PID开销值------>対端桥ID------>対端端口ID------>本端端口ID
第三步:选举指定端口(Designated Port)
- 每条链路上,桥ID较小 的交换机端口成为指定端口。
- 如果桥ID相同(比如同一台交换机的两个端口),则比较端口优先级和端口ID。
- RPC-------->本端BID-------->本端PID
第四步:阻塞剩余端口
- 既不是根端口也不是指定端口的端口,将被阻塞(Blocking),不转发任何数据帧。
2. STP的端口状态机
STP端口有5种状态,从启动到最终收敛需要经历漫长的过渡:
| 状态 | 说明 | 处理BPDU | 转发数据 |
|---|---|---|---|
| Disabled | 端口关闭 | 否 | 否 |
| Blocking | 阻塞状态,仅监听BPDU | 是 | 否 |
| Listening | 监听状态,选举角色 | 是 | 否 |
| Learning | 学习MAC地址,仍不转发数据 | 是 | 否 |
| Forwarding | 正常转发数据 | 是 | 是 |
从Blocking到Forwarding需要经历两个Forward Delay (默认15秒),加上Max Age(默认20秒),STP收敛时间通常在30-50秒 。这在企业网络中几乎是不可接受的。


💡 提示:BPDU(bridge protocol data unit),就是stp报文,根桥每隔2s发送一次。报文里面含有BID、链路cost开销等等。对于stp报文目标MAC地址始终是:01:08:C2:00:00:00,属于组播mac地址。
三、RSTP:快速收敛的进化,秒级切换
RSTP(Rapid Spanning Tree Protocol,IEEE 802.1w)在STP基础上做了大量改进,将收敛时间缩短到秒级甚至毫秒级 。
1. RSTP的三大改进
改进一:精简端口状态

RSTP将端口状态减少到3种:Discarding(丢弃)、Learning(学习)、Forwarding(转发)。Blocking、Listening、Disabled统一归为Discarding,简化了状态机。
改进二:新增端口角色

- Alternate Port(替代端口) :作为根端口的备份,当根端口失效时,Alternate立即切换为根端口。
- Backup Port(备份端口) :作为指定端口的备份,当指定端口失效时,Backup立即切换。
- 这两种角色在STP中都属于Blocking状态,但RSTP赋予了它们明确的备份职责,实现了快速切换。
改进三:P/A(Proposal/Agreement)机制





这是RSTP实现快速收敛的核心。当一条新链路启用时,上游交换机直接发送Proposal报文,下游交换机如果确认自己是根端口,立即同意(Agreement),双方端口瞬间进入Forwarding状态,不再依赖计时器。
改进四:BPDU的处理



2. P/A机制详解:如何实现秒级收敛?
传统STP的缺陷 :
当链路启用时,端口必须经历Listening(15秒)和Learning(15秒)才能进入Forwarding,这是为了等待网络中所有交换机同步BPDU信息,防止临时环路。这种“等待”是STP收敛慢的根本原因。
RSTP的突破 :
RSTP通过握手协议消除了等待时间。具体过程如下:
- Proposal发送
当一台交换机(假设为上游交换机)的端口变为Forwarding后,它会立即向对端发送一个Proposal(提议)报文,声明自己准备成为指定端口。 - 同步操作
下游交换机收到Proposal后,会检查自己的其他端口:- 如果有其他端口处于Forwarding状态且可能产生环路,它会先将这些端口暂时阻塞(Discarding),确保环路不会出现。
- 这个过程称为同步(Sync) ,是RSTP防止临时环路的关键。
- Agreement应答
下游交换机完成同步后,向对端发送Agreement(同意)报文。
上游交换机收到Agreement后,立即将端口从Discarding切换到Forwarding。
下游交换机收到上游的Agreement确认后,也将自己的端口切换到Forwarding。
整个过程在几百毫秒内 完成,不需要等待任何计时器。
示例 :
假设交换机A和B新连一条链路,A的端口角色为指定端口,B的端口角色为根端口。
- A发送Proposal → B收到后,阻塞其他可能导致环路的端口 → B发送Agreement → A收到后,A的端口立即Forwarding → B的端口也立即Forwarding。
两端同时进入转发状态,链路瞬间启用。
3. 边缘端口(Edge Port):加速终端接入

RSTP引入了边缘端口 概念,专门连接PC、服务器等终端设备。边缘端口一旦up,直接进入Forwarding状态,不参与生成树计算,极大加快终端接入速度。
# 配置边缘端口[Huawei-GigabitEthernet0/0/1] stp edged-port enable
当前端口设置成边缘端口后,如果收到BPDU报文,交换机会自动将边缘端口设置为非边缘端口。
4. 拓扑变更机制的优化


STP的拓扑变更机制 :
- 当链路故障时,检测到故障的交换机会向根桥发送TCN(Topology Change Notification)报文。
- 根桥收到后,会广播TC(Topology Change)报文通知全网,所有交换机将自己的MAC表老化时间强制缩短为Forward Delay(默认15秒),快速刷新。
- 这种“全网通知”的方式效率低,且涉及根桥集中处理,耗时长。
RSTP的拓扑变更机制 :
- 当链路故障时,检测到故障的交换机只通知与自己直连的邻居 ,不再依赖根桥。
- 邻居收到消息后,立即刷新自己的MAC表,并将消息继续向其他邻居传播,形成“扩散”。
- 只有真正受影响的链路所在区域的交换机才会刷新MAC表,大大减少了不必要的刷新开销,收敛速度更快。
此外,RSTP引入了Proposal/Agreement 机制,使得链路故障时,备份端口(Alternate/Backup)可以立即 切换为转发状态,无需等待任何计时器,实现亚秒级收敛。



#配置底层vlan和trunk(每台交换机上的VLAN要保持一致)[sw1]vlan batch 2 3 4 5[sw1]port-group group-member g0/0/1 to g0/0/2[sw1-port-group]port link-type trunk[sw1-GigabitEthernet0/0/1]port link-type trunk[sw1-GigabitEthernet0/0/2]port link-type trunk[sw1-port-group]port trunk allow-pass vlan 2 3 4 5[sw1-GigabitEthernet0/0/1]port trunk allow-pass vlan 2 3 4 5[sw1-GigabitEthernet0/0/2]port trunk allow-pass vlan 2 3 4 5[sw1]dis stp region-configuration Oper configuration Format selector :0 Region name :4c1fcc2f1acd Revision level :0 Instance VLANs Mapped 0 1 to 4094[sw2]vlan batch 2 to 5[sw2]port-g group-member g0/0/1 to g0/0/2[sw2-port-group]port link-type trunk[sw2-GigabitEthernet0/0/1]port link-type trunk[sw2-GigabitEthernet0/0/2]port link-type trunk[sw2-port-group]port trunk allow-pass vlan 2 3 4 5[sw2-GigabitEthernet0/0/1]port trunk allow-pass vlan 2 3 4 5[sw2-GigabitEthernet0/0/2]port trunk allow-pass vlan 2 3 4 5[sw2]dis stp region-configuration Oper configuration Format selector :0 Region name :4c1fcce31e1f Revision level :0 Instance VLANs Mapped 0 1 to 4094[sw3]vlan batch 2 3 4 5[sw3]port-group group-member g0/0/3 to g0/0/6[sw3-port-group]port link-type access[sw3-GigabitEthernet0/0/3]port link-type access[sw3-GigabitEthernet0/0/4]port link-type access[sw3-GigabitEthernet0/0/5]port link-type access[sw3-GigabitEthernet0/0/6]port link-type access[sw3-port-group]quit[sw3]interface g0/0/3[sw3-GigabitEthernet0/0/3]port default vlan 2[sw3-GigabitEthernet0/0/3]interface g0/0/4[sw3-GigabitEthernet0/0/4]port default vlan 3[sw3-GigabitEthernet0/0/4]interface g0/0/5[sw3-GigabitEthernet0/0/5]port default vlan 4[sw3-GigabitEthernet0/0/5]interface g0/0/6[sw3-GigabitEthernet0/0/6]port default vlan 5[sw3-GigabitEthernet0/0/6]interface g0/0/1[sw3-GigabitEthernet0/0/1]port link-type trunk[sw3-GigabitEthernet0/0/1]port trunk allow-pass vlan 2 3 4 5[sw3-GigabitEthernet0/0/1]interface g0/0/2[sw3-GigabitEthernet0/0/2]port link-type trunk[sw3-GigabitEthernet0/0/2]port trunk allow-pass vlan 2 3 4 5所有交换机mstp配置[sw1]stp region-configuration //进入mstp配置界面[sw1-mst-region]region-name aa //mstp域名[sw1-mst-region]revision-level 1[sw1-mst-region]instance 1 vlan 2 3[sw1-mst-region]instance 2 vlan 4 5[sw1-mst-region]active region-configuration //激活mstp配置[sw1]stp instance 1 root primary //sw1设置为组1的根桥[sw1]stp instance 2 root secondary //sw1设置为组2的备份根桥[sw1]stp instance 1 priority ? //修改sw1组1优先级 INTEGER<0-61440> Bridge priority, in steps of 4096stp region-configuration region-name aarevision-level 1instance 1 vlan 2 3instance 2 vlan 4 5[sw2]stp region-configuration [sw2-mst-region]region-name aa[sw2-mst-region]revision-level 1[sw2-mst-region]instance 1 vlan 2 3[sw2-mst-region]instance 2 vlan 4 5[sw2-mst-region]active region-configuration[sw2]stp instance 2 root primary //sw2设置为组2的根桥[sw2]stp instance 1 root secondary //sw2设置为组1的备份根桥[sw2-mst-region]display thisstp region-configuration region-name aa revision-level 1 instance 1 vlan 2 to 3 instance 2 vlan 4 to 5 active region-configuration[sw3]stp region-configuration [sw3-mst-region]region-name aa[sw3-mst-region]revision-level 1[sw3-mst-region]instance 1 vlan 2 3[sw3-mst-region]instance 2 vlan 4 5[sw3-mst-region]active region-configuration[sw3]display stp instance 1-------[MSTI 1 Global Info]-------MSTI Bridge ID :32768.4c1f-cc32-0273MSTI RegRoot/IRPC :0.4c1f-cc2f-1acd / 20000MSTI RootPortId :128.1Master Bridge :32768.4c1f-cc2f-1acdCost to Master :20000TC received :3TC count per hello :0Time since last TC :0 days 0h:8m:22sNumber of TC :5Last TC occurred :GigabitEthernet0/0/1 ----[Port1(GigabitEthernet0/0/1)][FORWARDING]---- Port Role :Root Port Port Priority :128 Port Cost(Dot1T ) :Config=auto / Active=20000 Designated Bridge/Port :0.4c1f-cc2f-1acd / 128.1 Port Times :RemHops 20 TC or TCN send :2 TC or TCN received :2 ----[Port2(GigabitEthernet0/0/2)][DISCARDING]---- Port Role :Alternate Port Port Priority :128 Port Cost(Dot1T ) :Config=auto / Active=20000 Designated Bridge/Port :4096.4c1f-cce3-1e1f / 128.2 Port Times :RemHops 19 TC or TCN send :2 TC or TCN received :1 ----[Port3(GigabitEthernet0/0/3)][FORWARDING]---- Port Role :Designated Port Port Priority :128 Port Cost(Dot1T ) :Config=auto / Active=20000 Designated Bridge/Port :32768.4c1f-cc32-0273 / 128.3 Port Times :RemHops 19 TC or TCN send :4 TC or TCN received :0 ----[Port4(GigabitEthernet0/0/4)][FORWARDING]---- Port Role :Designated Port Port Priority :128 Port Cost(Dot1T ) :Config=auto / Active=20000 Designated Bridge/Port :32768.4c1f-cc32-0273 / 128.4 Port Times :RemHops 19 TC or TCN send :4 TC or TCN received :0[sw3]dis stp brief MSTID Port Role STP State Protection 0 GigabitEthernet0/0/1 ROOT FORWARDING NONE 0 GigabitEthernet0/0/2 DESI FORWARDING NONE 0 GigabitEthernet0/0/3 DESI FORWARDING NONE 0 GigabitEthernet0/0/4 DESI FORWARDING NONE 0 GigabitEthernet0/0/5 DESI FORWARDING NONE 0 GigabitEthernet0/0/6 DESI FORWARDING NONE 1 GigabitEthernet0/0/1 ROOT FORWARDING NONE 1 GigabitEthernet0/0/2 ALTE DISCARDING NONE 1 GigabitEthernet0/0/3 DESI FORWARDING NONE 1 GigabitEthernet0/0/4 DESI FORWARDING NONE 2 GigabitEthernet0/0/1 ALTE DISCARDING NONE 2 GigabitEthernet0/0/2 ROOT FORWARDING NONE 2 GigabitEthernet0/0/5 DESI FORWARDING NONE 2 GigabitEthernet0/0/6 DESI FORWARDING NONE[sw3]display stp region-configuration Oper configuration Format selector :0 Region name :aa Revision level :1 Instance VLANs Mapped 0 1, 6 to 4094 1 2 to 3 2 4 to 5#注意:每个实例使用独立的RSTP算法
- 保护功能的优化




#开启全局BPDU保护功能全局: stp bpdu-protection# 自动恢复<10秒后自动恢复>全局: error-down auto-recovery cause bpdu-protection interval 10
# 指定接口开启根保护功能:接口下 stp root-protection
设置tc bpdu报文阙值[SW1]stp tc-protection threshold ?INTEGER<1-255> The threshold of TC-BPDU protection, default is 1
四、MSTP:多实例负载均衡,让冗余链路不再闲置
虽然RSTP解决了收敛速度问题,但它仍然只能生成一棵生成树 。这意味着所有VLAN的流量都走相同的路径,冗余链路被阻塞后完全闲置,无法利用。
MSTP(Multiple Spanning Tree Protocol,IEEE 802.1s)通过多生成树实例 ,实现了不同VLAN流量的负载均衡。

1. MSTP的核心概念
MST域(Region)
%3E)
- 一组具有相同域名、相同VLAN映射关系、相同修订级别的交换机组成一个MST域。
- 域内可以创建多个实例(MSTI),每个实例对应一棵独立的生成树。
实例(MSTI)

- 一个实例可以映射一个或多个VLAN。
- 不同实例的生成树相互独立,可以分别控制根桥和路径。

总根(CIST Root)
- 整个MSTP网络中唯一的根桥,负责连接各个域。
域根(Regional Root)
- 每个域内,距离总根最近的交换机,负责域内与域外的通信。
2. MSTP的域间原理:CST、IST、CIST、SST
MSTP虽然支持多实例,但它依然要保证整个二层网络(可能包含多个域)是无环的。为此,MSTP引入了几个关键概念:

- CST(Common Spanning Tree,公共生成树)
连接所有MST域的单个生成树。每个域在CST中被视为一个“节点”,域间通过CST互联。CST保证了不同域之间不会产生环路。

- IST(Internal Spanning Tree,内部生成树)
在每个MST域内部,实例0(默认实例)的生成树被称为IST。IST负责域内与域外(其他域)的通信,它也是CST在域内的延伸。

- CIST(Common and Internal Spanning Tree,公共与内部生成树)
CST + 所有域的IST共同组成CIST。CIST是整个MSTP网络的总生成树 ,它保证整个二层网络(无论跨越多少个域)是无环的。

- SST(Single Spanning Tree,单生成树)
如果一个域中只运行了一棵生成树(比如只配置了实例0),那么这个域就被称为SST。SST可以与其他域通过CST互联。
举例 :
假设有三个域:域A、域B、域C,每个域内部都有多个实例。
- CIST的根桥(总根)可能位于域A中的某台交换机。
- 域A内部的IST(实例0)会计算出到达总根的最优路径。
- 域B和域C各自计算出自己的IST,并找到自己域内到达总根的出口(即域根)。
- 跨域的流量通过CST转发,域内不同VLAN的流量通过各自的MSTI实现负载均衡。






3. MSTP如何实现负载均衡?
假设我们有VLAN 10和VLAN 20,以及两条冗余链路。通过MSTP,我们可以:
- 将VLAN 10映射到实例1,设置实例1的根桥为交换机A ,根端口在A的某条链路上,另一条链路阻塞。
- 将VLAN 20映射到实例2,设置实例2的根桥为交换机B ,根端口在B的某条链路上,两条链路的阻塞状态相反。
这样,VLAN 10的流量走链路1,VLAN 20的流量走链路2,实现了流量的负载分担 。

4. MSTP配置实战(扩展)
拓扑 :交换机SW1、SW2、SW3组成三角形环,VLAN 2、3、4、5需要负载均衡。

目标 :
- VLAN 2、3的流量走SW1→SW2路径,SW3作为备份。
- VLAN 4、5的流量走SW1→SW3路径,SW2作为备份。
配置步骤 (以华为设备为例):
- 创建VLAN,配置Trunk (所有交换机相同)
vlan batch 2 3 4 5interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 2 3 4 5# 其他接口类似
- 配置MST域
# SW1stp region-configuration region-name HCIE revision-level 1 instance 1 vlan 2 3 instance 2 vlan 4 5 active region-configuration
# SW2、SW3配置相同的region-name和revision-level
- 指定各实例的根桥
# SW1作为实例1的根桥,实例2的备份根桥stp instance 1 root primarystp instance 2 root secondary
# SW2作为实例2的根桥,实例1的备份根桥stp instance 2 root primarystp instance 1 root secondary
# SW3不设置根桥,作为普通成员
- 验证配置
display stp instance 1 briefdisplay stp instance 2 brief
此时,在实例1中,SW1是根桥,SW2和SW3的端口角色会按SPT算法选举,最终某个端口被阻塞。在实例2中,SW2是根桥,阻塞的端口会不同,从而实现链路复用。
五、STP家族对比
| 协议 | 收敛速度 | 生成树数量 | 负载均衡 | 适用场景 |
|---|---|---|---|---|
| STP | 30-50秒 | 1棵 | 不支持 | 小型网络,对收敛不敏感 |
| RSTP | 1-3秒 | 1棵 | 不支持 | 中型网络,要求快速收敛 |
| MSTP | 1-3秒 | 多棵 | 支持(VLAN映射) | 大型园区网,需负载分担 |
| STP端口状态 | RSTP端口状态 | 端口在拓扑中的角色 | 目的 | 说明 |
|---|---|---|---|---|
| Forwarding | Forwarding | 包括根端口、指定端口 | 端口既转发用户流量也处理BPDU报文 | 只有根端口或指定端口才能进入Forwarding状态 |
| Learning | Learning | 包括根端口、指定端口 | 设备会根据收到的用户流量构建MAC地址表,但是不转发用户流量 | 过渡状态,增加Learing状态防止临时环路 |
| Listening | Discarding | 包括根端口、指定端口 | 确定端口角色,将选举出根桥、根端口和指定端口,可收发BPDU报文 | 过渡状态 |
| Blocking | Discarding | 包括Alternate端口、Backup端口 | 端口仅仅接受并处理BPDU,不转发用户流量,不能转发BPDU | 阻塞端口的最终状态 |
| Disabled | Discarding | 包括Disable端口 | 端口不仅不处理BPDU报文,也不转发用户流量 | 端口状态为Down |
六、总结与思考
| 关键点 | 说明 |
|---|---|
| 环路危害 | 广播风暴、MAC表震荡、网络瘫痪 |
| STP核心 | 通过选举根桥、根端口、指定端口阻塞冗余链路 |
| RSTP改进 | 端口角色增加、P/A机制、边缘端口、拓扑变更优化,实现秒级收敛 |
| MSTP突破 | 多实例映射VLAN,不同VLAN走不同生成树,实现负载均衡;CST/IST/CIST保证跨域无环 |
除了生成树,还有哪些更专业的环网保护技术?RRPP、SEP、ERPS如何实现毫秒级切换?它们与STP有何异同?我们将在“二层破环专题(下)”中一一揭晓。
💡 文末互动:你在实际工作中是否遇到过因环路引发的网络事故?当时是如何排查和解决的?欢迎在评论区分享你的经验!
📌 关注公众号,后台回复【HCIE数通】获取本文高清思维导图和实验拓扑文件、笔记教程和最新版的ENSP PRO软件,并订阅后续系列文章。
下期预告 :二层破环专题(下) | RRPP、SEP、ERPS:企业级环网保护技术深度对比
往期回顾:
HCIE数通-网络基石篇:OSI与TCP/IP、你真的理解数据包的“一生”吗?
RHCE认证:
RHCE认证考试学习(十一):计划任务与Ansible自动化
RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线
RHCE认证学习笔记(六):软件包管理 – 从RPM到YUM仓库
#HCIE数通 #HCIE考试 #HCIE教程 #HCIE实验 #HCIE网络工程师 #ENSP #ensppro #二层破环技术 #STP
标题:HCIE数通-二层破环专题(上): STP/RSTP/MSTP:从“死锁”到“负载均衡”的进化史
作者:shuaiqijun
地址:https://www.shuaiqijun.com/articles/2026/03/26/1774505738778.html