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

  |   0 评论   |   0 浏览

图片

大家好,我是你们的老朋友。上篇文章我们聊了数据包的“一生”,今天我们把目光聚焦在交换网络。

你有没有遇到过这样的场景:明明只是插了一根网线,整个网络就瘫痪了,广播风暴把交换机CPU跑满,所有业务中断,这就是二层环路的“威力”。

今天,我们就来系统学习交换网络如何通过生成树协议(STP)破环,以及它如何一步步进化到RSTP、MSTP,实现秒级收敛和流量负载均衡

一、环路的噩梦:为什么交换网络必须破环?

在二层网络中,为了提高可靠性,我们常常会部署冗余链路 (比如交换机之间用两根线连接)。但物理上的冗余会带来逻辑上的环路,环路的后果有多严重?

  1. 广播风暴
    当网络中存在环路时,广播报文(如ARP请求、DHCP Discover)会在环路中无限循环转发,不断被复制,最终耗尽链路带宽和交换机CPU资源,导致网络瘫痪。
  2. MAC地址表不稳定
    交换机通过源MAC地址学习来建立转发表。在环路中,同一个MAC地址可能从多个接口不断被学习到,导致MAC表不停震荡,转发混乱。
  3. 网络卡顿、业务中断
    环路会引发大量重复报文,正常数据包被淹没,时延剧增,甚至完全无法通信。

一句话总结 :二层环路是交换网络的“癌症”,必须通过破环协议来预防。而生成树协议(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通过握手协议消除了等待时间。具体过程如下:

  1. Proposal发送
    当一台交换机(假设为上游交换机)的端口变为Forwarding后,它会立即向对端发送一个Proposal(提议)报文,声明自己准备成为指定端口。
  2. 同步操作
    下游交换机收到Proposal后,会检查自己的其他端口:
    • 如果有其他端口处于Forwarding状态且可能产生环路,它会先将这些端口暂时阻塞(Discarding),确保环路不会出现。
    • 这个过程称为同步(Sync) ,是RSTP防止临时环路的关键。
  3. 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算法
  1. 保护功能的优化

图片

图片

图片

图片

#开启全局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作为备份。

配置步骤 (以华为设备为例):

  1. 创建VLAN,配置Trunk (所有交换机相同)
vlan batch 2 3 4 5interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 2 3 4 5# 其他接口类似
  1. 配置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
  1. 指定各实例的根桥
# 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不设置根桥,作为普通成员
  1. 验证配置
display stp instance 1 briefdisplay stp instance 2 brief

此时,在实例1中,SW1是根桥,SW2和SW3的端口角色会按SPT算法选举,最终某个端口被阻塞。在实例2中,SW2是根桥,阻塞的端口会不同,从而实现链路复用。


五、STP家族对比

协议收敛速度生成树数量负载均衡适用场景
STP30-50秒1棵不支持小型网络,对收敛不敏感
RSTP1-3秒1棵不支持中型网络,要求快速收敛
MSTP1-3秒多棵支持(VLAN映射)大型园区网,需负载分担
STP端口状态RSTP端口状态端口在拓扑中的角色目的说明
ForwardingForwarding包括根端口、指定端口端口既转发用户流量也处理BPDU报文只有根端口或指定端口才能进入Forwarding状态
LearningLearning包括根端口、指定端口设备会根据收到的用户流量构建MAC地址表,但是不转发用户流量过渡状态,增加Learing状态防止临时环路
ListeningDiscarding包括根端口、指定端口确定端口角色,将选举出根桥、根端口和指定端口,可收发BPDU报文过渡状态
BlockingDiscarding包括Alternate端口、Backup端口端口仅仅接受并处理BPDU,不转发用户流量,不能转发BPDU阻塞端口的最终状态
DisabledDiscarding包括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 必考考点:RHEL 9 KVM虚拟化配置全流程

RHCE认证考试学习(十一):计划任务与Ansible自动化

RHCE认证考试学习笔记(十):Shell脚本编程

RHCE认证考试学习笔记(九):文件系统与存储管理

RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线

RHCE工程师认证学习笔记(七):网络配置与管理

RHCE认证学习笔记(六):软件包管理 – 从RPM到YUM仓库

RHCE认证学习笔记(五):进程管理与服务控制

RHCE认证学习笔记(四):用户管理与权限控制

RHCE认证学习笔记(三):重定向、管道与正则表达式

RHCE认证学习笔记(二):文件操作与Vim编辑器

RHCE认证考试学习笔记(一):Linux基础入门

#HCIE数通 #HCIE考试 #HCIE教程 #HCIE实验 #HCIE网络工程师 #ENSP #ensppro #二层破环技术 #STP


标题:HCIE数通-二层破环专题(上): STP/RSTP/MSTP:从“死锁”到“负载均衡”的进化史
作者:shuaiqijun
地址:https://shuaiqijun.com/articles/2026/03/26/1774505738778.html