STP / RSTP 协议学习:从环路保护到快速收敛

1. 为什么需要生成树协议

在二层交换网络中,为了提高可靠性,工程师通常会部署冗余链路。但冗余链路在带来高可用的同时,也引入了二层环路这一致命问题。

二层以太网帧头没有TTL(生存时间) 字段,一旦形成环路,广播帧、未知单播帧和多播帧就会在环路中无限循环转发,最终耗尽交换机的 CPU 与链路带宽,导致全网瘫痪,也就是常说的广播风暴。

生成树协议(STP,Spanning Tree Protocol)就是为了解决这一问题而诞生的:它在逻辑上阻塞冗余链路,把物理上的环形拓扑修剪成一棵无环的树,当主用链路故障时又能重新启用备份链路,实现冗余与无环的平衡。
#mermaid-svg-ruLd30bmG7O9BuCh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ruLd30bmG7O9BuCh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ruLd30bmG7O9BuCh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ruLd30bmG7O9BuCh .error-icon{fill:#552222;}#mermaid-svg-ruLd30bmG7O9BuCh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ruLd30bmG7O9BuCh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ruLd30bmG7O9BuCh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ruLd30bmG7O9BuCh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ruLd30bmG7O9BuCh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ruLd30bmG7O9BuCh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ruLd30bmG7O9BuCh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ruLd30bmG7O9BuCh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ruLd30bmG7O9BuCh .marker.cross{stroke:#333333;}#mermaid-svg-ruLd30bmG7O9BuCh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ruLd30bmG7O9BuCh p{margin:0;}#mermaid-svg-ruLd30bmG7O9BuCh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ruLd30bmG7O9BuCh .cluster-label text{fill:#333;}#mermaid-svg-ruLd30bmG7O9BuCh .cluster-label span{color:#333;}#mermaid-svg-ruLd30bmG7O9BuCh .cluster-label span p{background-color:transparent;}#mermaid-svg-ruLd30bmG7O9BuCh .label text,#mermaid-svg-ruLd30bmG7O9BuCh span{fill:#333;color:#333;}#mermaid-svg-ruLd30bmG7O9BuCh .node rect,#mermaid-svg-ruLd30bmG7O9BuCh .node circle,#mermaid-svg-ruLd30bmG7O9BuCh .node ellipse,#mermaid-svg-ruLd30bmG7O9BuCh .node polygon,#mermaid-svg-ruLd30bmG7O9BuCh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ruLd30bmG7O9BuCh .rough-node .label text,#mermaid-svg-ruLd30bmG7O9BuCh .node .label text,#mermaid-svg-ruLd30bmG7O9BuCh .image-shape .label,#mermaid-svg-ruLd30bmG7O9BuCh .icon-shape .label{text-anchor:middle;}#mermaid-svg-ruLd30bmG7O9BuCh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ruLd30bmG7O9BuCh .rough-node .label,#mermaid-svg-ruLd30bmG7O9BuCh .node .label,#mermaid-svg-ruLd30bmG7O9BuCh .image-shape .label,#mermaid-svg-ruLd30bmG7O9BuCh .icon-shape .label{text-align:center;}#mermaid-svg-ruLd30bmG7O9BuCh .node.clickable{cursor:pointer;}#mermaid-svg-ruLd30bmG7O9BuCh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ruLd30bmG7O9BuCh .arrowheadPath{fill:#333333;}#mermaid-svg-ruLd30bmG7O9BuCh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ruLd30bmG7O9BuCh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ruLd30bmG7O9BuCh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ruLd30bmG7O9BuCh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ruLd30bmG7O9BuCh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ruLd30bmG7O9BuCh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ruLd30bmG7O9BuCh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ruLd30bmG7O9BuCh .cluster text{fill:#333;}#mermaid-svg-ruLd30bmG7O9BuCh .cluster span{color:#333;}#mermaid-svg-ruLd30bmG7O9BuCh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ruLd30bmG7O9BuCh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ruLd30bmG7O9BuCh rect.text{fill:none;stroke-width:0;}#mermaid-svg-ruLd30bmG7O9BuCh .icon-shape,#mermaid-svg-ruLd30bmG7O9BuCh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ruLd30bmG7O9BuCh .icon-shape p,#mermaid-svg-ruLd30bmG7O9BuCh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ruLd30bmG7O9BuCh .icon-shape .label rect,#mermaid-svg-ruLd30bmG7O9BuCh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ruLd30bmG7O9BuCh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ruLd30bmG7O9BuCh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ruLd30bmG7O9BuCh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SW1 核心交换机
SW2 汇聚交换机
SW3 汇聚交换机
PC 终端

如上图,SW1、SW2、SW3 之间构成一个三角形环路。STP 的任务就是自动把其中某条链路阻塞掉,例如阻塞 SW2 与 SW3 之间的链路。

2. 二层环路的三大危害

在深入 STP 之前,先理解环路到底会带来哪些具体问题:

  • 广播风暴:广播帧在环路中不断复制、转发,迅速占满链路带宽和交换机转发能力。
  • MAC 地址表震荡:同一台主机的 MAC 地址会从不同端口被反复学习,导致 MAC 地址表项不断刷新,无法稳定转发。
  • 多帧复制:同一数据帧可能被复制成多份送达目的主机,造成上层协议处理混乱。

这三者叠加,轻则网络卡顿,重则设备宕机、全网不可用。因此,只要存在物理冗余环路,就必须运行生成树协议。

3. STP 核心概念

STP 由 IEEE 802.1D 标准定义,其核心思想可以概括为三步:

  1. 在全网交换机中选举出一台根桥(Root Bridge);
  2. 每台非根桥计算到达根桥的最优路径,确定自己的根端口(Root Port);
  3. 每条链路上选举一个指定端口(Designated Port) ,其余冗余端口被阻塞。

3.1 BPDU 报文

交换机之间通过 BPDU(Bridge Protocol Data Unit,网桥协议数据单元) 交互生成树信息。STP 中最重要的两种 BPDU 是:

  • 配置 BPDU(Configuration BPDU) :用于根桥选举、路径开销计算、端口角色选举和拓扑稳定维护,默认由根桥每 2 秒发送一次;
  • TCN BPDU(Topology Change Notification BPDU):用于在拓扑发生变化时通知根桥,触发全网更新 MAC 地址表。

日常 STP 计算主要依赖配置 BPDU ,它的目标 MAC 地址是组播地址 01-80-C2-00-00-00,只在相邻交换机之间交互,路由器不会转发。

3.1.1 配置 BPDU 的完整格式

配置 BPDU 从「协议标识」开始,到「转发延迟」结束,共 35 字节。完整字段格式如下:

字段 字节数 作用
协议标识(Protocol Identifier) 2 固定为 0x0000,表示 IEEE 802.1D 生成树协议
协议版本标识(Protocol Version Identifier) 1 STP 为 0x00,RSTP 为 0x02,MSTP 为 0x03
BPDU 类型(BPDU Type) 1 0x00 表示配置 BPDU,0x80 表示 TCN BPDU
标志位(Flags) 1 用于标记拓扑变更确认等状态,STP 主要使用其中的 TCN / TCA 位
根桥 ID(Root Identifier) 8 当前交换机认为的根桥标识:2 字节桥优先级 + 6 字节 MAC 地址
根路径开销(Root Path Cost) 4 从发送该 BPDU 的交换机到根桥的累计路径开销
发送桥 ID(Bridge Identifier) 8 发送该 BPDU 的交换机桥标识:2 字节桥优先级 + 6 字节 MAC 地址
发送端口 ID(Port Identifier) 2 发送该 BPDU 的端口标识,由端口优先级和端口号组成
消息年龄(Message Age) 2 BPDU 从根桥发出后已经过的时间,当超过 Max Age 时认为根桥失效
最大年龄(Max Age) 2 默认 20 秒,用于判断 BPDU 是否过期
Hello 时间(Hello Time) 2 默认 2 秒,根桥周期性发送配置 BPDU 的间隔
转发延迟(Forward Delay) 2 默认 15 秒,Listening 和 Learning 状态各自持续的时间

其中 Message Age、Max Age、Hello Time、Forward Delay 四个计时器字段的单位都是 1/256 秒 。例如 Hello Time 字段值为 512,就表示 512 / 256 = 2 秒。

3.1.2 关键字段的字节结构

桥 ID / 根桥 ID,各 8 字节:

text 复制代码
+---------- 2 字节 ----------+---------- 6 字节 ----------+
|        桥优先级(默认 32768)  |            MAC 地址          |
+----------------------------+----------------------------+

端口 ID,2 字节:

text 复制代码
+----- 4 位 -----+------ 12 位 ------+
|   端口优先级(默认 128) |      端口号      |
+----------------+------------------+
3.1.3 BPDU 的以太网封装格式

BPDU 作为二层帧的数据部分发送,标准 802.3 封装结构如下:

字段 字节数 值或说明
目的 MAC 地址 6 组播地址 01-80-C2-00-00-00
源 MAC 地址 6 发送端口的 MAC 地址
长度 2 表示后续 LLC + BPDU 数据的长度
LLC 头部(DSAP + SSAP + Control) 3 固定为 0x42 0x42 0x03
配置 BPDU 35 上表所述的 BPDU 字段

因此完整帧的头部开销约 6 + 6 + 2 + 3 = 17 字节,加上 BPDU 本体 35 字节后,实际承载内容约 52 字节,发送时还会按以太网最小帧长度要求填充到至少 64 字节。

3.1.4 以 SW2 发出的配置 BPDU 为例

假设 SW2 已经认为 SW1 是根桥,并且 SW2 到达根桥的累计开销为 4,那么 SW2 从端口 G0/0/2 发出的配置 BPDU 关键字段如下:

text 复制代码
协议标识        = 0x0000
协议版本标识    = 0x00
BPDU 类型       = 0x00(配置 BPDU)
标志位          = 0x00
根桥 ID         = 4096.00e0-fc11-1111   (SW1)
根路径开销      = 4
发送桥 ID       = 32768.00e0-fc22-2222  (SW2)
发送端口 ID     = 128.2(默认端口优先级 128,端口编号 2)
消息年龄        = 0
最大年龄        = 20 秒
Hello 时间      = 2 秒
转发延迟        = 15 秒

对端交换机收到这份 BPDU 后,会读取其中的根桥 ID、根路径开销、发送桥 ID、发送端口 ID,用来判断自己能否接受该根桥、是否需要更新根端口,以及是否需要阻塞某个端口。

3.2 桥 ID 与根桥选举

每台交换机都有一个 桥 ID(Bridge ID),由两部分组成:

text 复制代码
桥 ID = 桥优先级(默认 32768,可配置)+ MAC 地址

选举根桥时,按以下顺序比较,数值越小越优:

text 复制代码
先比较桥优先级,优先级相同再比较 MAC 地址。

因此,如果管理员不手工调整优先级,那么 MAC 地址最小的交换机会意外成为根桥。生产环境中通常会手动把核心交换机配置为根桥。

3.3 路径开销

路径开销(Path Cost)表示端口带宽的代价,带宽越高、开销越小、越优先。常见参考值如下:

链路带宽 路径开销(802.1D 默认)
10 Gbps 2
1 Gbps 4
100 Mbps 19
10 Mbps 100

每台非根桥计算自身到达根桥的累计路径开销,并选出开销最小的端口作为根端口。

3.4 端口角色

STP 中有三种端口角色:

  • 根端口(Root Port,RP) :非根桥上到达根桥开销最小的端口,每台非根桥有且只有一个,负责向根桥方向转发数据。
  • 指定端口(Designated Port,DP):每条网段上选举出的、负责向该网段转发 BPDU 和数据的端口,根桥上的所有端口通常都是指定端口。
  • 阻塞端口(Blocking Port):既不是根端口也不是指定端口的冗余端口,只监听 BPDU,不转发用户数据。

3.5 端口状态

STP 端口从初始化到转发数据,需要经历五种状态:

text 复制代码
Disabled → Blocking → Listening → Learning → Forwarding
状态 转发数据 学习 MAC 收发 BPDU
Disabled 否 否 否
Blocking 否 否 是
Listening 否 否 是
Learning 否 是 是
Forwarding 是 是 是

Listening 状态: 系统固定15 秒等待最终收敛。

**Learning 状态:**系统固定15 秒。学习MAC表阶段,即使无STP也需要MAC表学习,但listening完成只能确保本机BPDU完成,必须等拓扑中其他交换机完成。

因此一个端口从 Blocking 到 Forwarding 至少需要约 30 秒,这也是 STP 收敛慢的直接原因。

4. STP 完整工作流程

下面结合一个具体的三交换机环形拓扑,逐步说明「每一步发送什么 BPDU、用来计算什么」。假设拓扑与参数如下:

  • SW1 :桥优先级 4096,MAC 地址 00e0-fc11-1111,端口 G0/0/1 连接 SW2,G0/0/2 连接 SW3;
  • SW2 :桥优先级 32768,MAC 地址 00e0-fc22-2222,端口 G0/0/1 连接 SW1,G0/0/2 连接 SW3;
  • SW3 :桥优先级 32768,MAC 地址 00e0-fc33-3333,端口 G0/0/1 连接 SW1,G0/0/2 连接 SW2;
  • 三条链路均为 1 Gbps ,按 802.1D 默认路径开销,每个端口开销为 4。

#mermaid-svg-qmnDmnSdUiogrGS6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qmnDmnSdUiogrGS6 .error-icon{fill:#552222;}#mermaid-svg-qmnDmnSdUiogrGS6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qmnDmnSdUiogrGS6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qmnDmnSdUiogrGS6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qmnDmnSdUiogrGS6 .marker.cross{stroke:#333333;}#mermaid-svg-qmnDmnSdUiogrGS6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qmnDmnSdUiogrGS6 p{margin:0;}#mermaid-svg-qmnDmnSdUiogrGS6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qmnDmnSdUiogrGS6 .cluster-label text{fill:#333;}#mermaid-svg-qmnDmnSdUiogrGS6 .cluster-label span{color:#333;}#mermaid-svg-qmnDmnSdUiogrGS6 .cluster-label span p{background-color:transparent;}#mermaid-svg-qmnDmnSdUiogrGS6 .label text,#mermaid-svg-qmnDmnSdUiogrGS6 span{fill:#333;color:#333;}#mermaid-svg-qmnDmnSdUiogrGS6 .node rect,#mermaid-svg-qmnDmnSdUiogrGS6 .node circle,#mermaid-svg-qmnDmnSdUiogrGS6 .node ellipse,#mermaid-svg-qmnDmnSdUiogrGS6 .node polygon,#mermaid-svg-qmnDmnSdUiogrGS6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qmnDmnSdUiogrGS6 .rough-node .label text,#mermaid-svg-qmnDmnSdUiogrGS6 .node .label text,#mermaid-svg-qmnDmnSdUiogrGS6 .image-shape .label,#mermaid-svg-qmnDmnSdUiogrGS6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-qmnDmnSdUiogrGS6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qmnDmnSdUiogrGS6 .rough-node .label,#mermaid-svg-qmnDmnSdUiogrGS6 .node .label,#mermaid-svg-qmnDmnSdUiogrGS6 .image-shape .label,#mermaid-svg-qmnDmnSdUiogrGS6 .icon-shape .label{text-align:center;}#mermaid-svg-qmnDmnSdUiogrGS6 .node.clickable{cursor:pointer;}#mermaid-svg-qmnDmnSdUiogrGS6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qmnDmnSdUiogrGS6 .arrowheadPath{fill:#333333;}#mermaid-svg-qmnDmnSdUiogrGS6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qmnDmnSdUiogrGS6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qmnDmnSdUiogrGS6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qmnDmnSdUiogrGS6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qmnDmnSdUiogrGS6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qmnDmnSdUiogrGS6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qmnDmnSdUiogrGS6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qmnDmnSdUiogrGS6 .cluster text{fill:#333;}#mermaid-svg-qmnDmnSdUiogrGS6 .cluster span{color:#333;}#mermaid-svg-qmnDmnSdUiogrGS6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qmnDmnSdUiogrGS6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qmnDmnSdUiogrGS6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-qmnDmnSdUiogrGS6 .icon-shape,#mermaid-svg-qmnDmnSdUiogrGS6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qmnDmnSdUiogrGS6 .icon-shape p,#mermaid-svg-qmnDmnSdUiogrGS6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qmnDmnSdUiogrGS6 .icon-shape .label rect,#mermaid-svg-qmnDmnSdUiogrGS6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qmnDmnSdUiogrGS6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qmnDmnSdUiogrGS6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qmnDmnSdUiogrGS6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} G0/0/1 <-> G0/0/1
G0/0/2 <-> G0/0/1
G0/0/2 <-> G0/0/2
SW1

优先级 4096

00e0-fc11-1111
SW2

优先级 32768

00e0-fc22-2222
SW3

优先级 32768

00e0-fc33-3333

4.1 第一步:初始时各交换机都认为自己是根桥

交换机启动后,每台交换机都从自己的所有指定端口向外发送配置 BPDU。此时 BPDU 中的关键字段为:

  • 根桥 ID:填写自己;
  • 根路径开销 :填写 0;
  • 发送桥 ID:填写自己;
  • 发送端口 ID:填写发送该 BPDU 的端口。

以 SW2 为例,它从 G0/0/1 和 G0/0/2 发出去的初始 BPDU 都是:

text 复制代码
根桥 ID = 32768.00e0-fc22-2222
根路径开销 = 0
发送桥 ID = 32768.00e0-fc22-2222
发送端口 ID = G0/0/1(或 G0/0/2)

这一步的作用是:让每台交换机都能通过收到的 BPDU 比较「谁更适合当根桥」。比较规则是先比根桥 ID 中的桥优先级,再比 MAC 地址,数值越小越优。

4.2 第二步:选举根桥

各交换机把收到的 BPDU 与自己的桥 ID 比较:

  • SW1 优先级 4096,低于 SW2、SW3 的 32768;
  • 因此比较后,SW1 成为根桥。

根桥选举完成后,只有根桥才会主动从所有指定端口发送原始 BPDU。SW1 从 G0/0/1 和 G0/0/2 发送的 BPDU 内容为:

text 复制代码
根桥 ID = 4096.00e0-fc11-1111
根路径开销 = 0
发送桥 ID = 4096.00e0-fc11-1111
发送端口 ID = G0/0/1(或 G0/0/2)

4.3 第三步:非根桥计算根路径开销并选举根端口

非根桥收到根桥发来的 BPDU 后,会计算自己到达根桥的累计根路径开销:

text 复制代码
本地累计根路径开销 = 收到 BPDU 中的根路径开销 + 接收端口的端口开销

SW2 的计算过程:

  • SW2 从 G0/0/1 收到 SW1 的 BPDU,其中根路径开销为 0,接收端口 G0/0/1 开销为 4;
  • 因此 SW2 到达根桥的累计开销 = 0 + 4 = 4;
  • SW2 比较后,把 G0/0/1 选举为根端口(Root Port)。

随后 SW2 会从非根端口 G0/0/2 向外转发更新后的 BPDU:

text 复制代码
根桥 ID = 4096.00e0-fc11-1111
根路径开销 = 4
发送桥 ID = 32768.00e0-fc22-2222
发送端口 ID = G0/0/2

SW3 的计算过程:

SW3 会从两条链路收到两份 BPDU:

  • 从 G0/0/1 收到 SW1 直接发来的 BPDU:根路径开销 0,端口开销 4,累计开销 = 0 + 4 = 4;
  • 从 G0/0/2 收到 SW2 转发来的 BPDU:根路径开销 4,端口开销 4,累计开销 = 4 + 4 = 8。

SW3 选择累计开销更小的 G0/0/1 作为根端口 ,因为 4 < 8。

4.4 第四步:每条链路上选举指定端口

确定根端口后,还要在每个网段上选举指定端口(Designated Port)。选举方法是比较该网段两端端口「发出的 BPDU 质量」,比较顺序为:

text 复制代码
根桥 ID → 根路径开销 → 发送桥 ID → 发送端口 ID

SW1 与 SW2 之间的网段:

  • SW1 G0/0/1 发出的 BPDU:根路径开销为 0,发送桥 ID 为 SW1;
  • SW2 G0/0/1 发出的 BPDU:根路径开销为 4,发送桥 ID 为 SW2;
  • 根桥 ID 相同,接着比较根路径开销,0 < 4,所以 SW1 的 G0/0/1 成为指定端口。

SW1 与 SW3 之间的网段:

  • SW1 G0/0/2 发出的 BPDU:根路径开销为 0;
  • SW3 G0/0/1 发出的 BPDU:根路径开销为 4;
  • 同样是 SW1 更优,SW1 的 G0/0/2 成为指定端口。

SW2 与 SW3 之间的网段:

  • SW2 G0/0/2 发出的 BPDU:根路径开销为 4,发送桥 ID 为 SW2;
  • SW3 G0/0/2 发出的 BPDU:根路径开销同样为 4,发送桥 ID 为 SW3;
  • 根桥 ID、根路径开销都相同,继续比较发送桥 ID,SW2 的 MAC 00e0-fc22-2222 小于 SW3 的 00e0-fc33-3333;
  • 因此 SW2 的 G0/0/2 成为指定端口 ,SW3 的 G0/0/2 进入 Blocking,被阻塞。

4.5 最终收敛结果

经过上述计算,STP 最终收敛后的端口角色如下:

交换机 端口 角色 状态
SW1 G0/0/1 指定端口 DP Forwarding
SW1 G0/0/2 指定端口 DP Forwarding
SW2 G0/0/1 根端口 RP Forwarding
SW2 G0/0/2 指定端口 DP Forwarding
SW3 G0/0/1 根端口 RP Forwarding
SW3 G0/0/2 阻塞端口 Blocking Blocking

可以看到,SW3 的 G0/0/2 被阻塞后,SW2 与 SW3 之间的物理链路被逻辑断开,整网变成一棵以 SW1 为根的树,环路被消除。

若某条活动链路发生故障,阻塞端口在经历监听、学习两个阶段后重新进入转发状态,从而恢复连通性。

4.6 消息转发

为便于理解,下面给每台交换机各接入一台终端设备:PC1 接在 SW1 上、PC2 接在 SW2 上、PC3 接在 SW3 上,并假设 STP 已经收敛,各端口角色已经确定。

STP 收敛后,端口只有在 Forwarding 状态下才能收发用户数据,Blocking 端口只监听 BPDU、不转发任何数据帧。

通信方向 实际二层路径
PC1 → PC2 PC1 → SW1 G0/0/1 → SW2 G0/0/1 → PC2
PC2 → PC1 PC2 → SW2 G0/0/1 → SW1 G0/0/1 → PC1
PC1 → PC3 PC1 → SW1 G0/0/2 → SW3 G0/0/1 → PC3
PC3 → PC1 PC3 → SW3 G0/0/1 → SW1 G0/0/2 → PC1
PC2 → PC3 PC2 → SW2 G0/0/1 → SW1 G0/0/1 → SW1 G0/0/2 → SW3 G0/0/1 → PC3
PC3 → PC2 PC3 → SW3 G0/0/1 → SW1 G0/0/2 → SW1 G0/0/1 → SW2 G0/0/1 → PC2

PC2 要与 PC3 通信时,不能走 SW2 与 SW3 之间的直连物理链路 。虽然 SW2 的 G0/0/2 是指定端口、处于 Forwarding 状态,但 SW3 一侧的 G0/0/2 是 Blocking 阻塞端口。

广播帧的转发同样受生成树约束:

以 PC2 发送广播帧为例,SW2 会向所有 Forwarding 端口泛洪,其中包括 G0/0/1 和 G0/0/2:

  • 从 G0/0/1 发出的广播帧到达 SW1,SW1 再向 SW3 泛洪,进而到达 PC3;
  • 从 G0/0/2 发出的广播帧虽然会沿物理链路到达 SW3 的 G0/0/2,但该端口处于 Blocking 状态,直接在入口被丢弃,不会进入 SW3 的转发逻辑,因此不会形成环路。

所以最终生效的广播路径仍然是 PC2 → SW2 → SW1 → SW3 → PC3。

5. STP 的不足

虽然 STP 解决了环路问题,但在现代网络中暴露出明显缺陷:

  • 收敛速度慢:端口从阻塞到转发需要约 30 到 50 秒,对实时业务影响大。
  • 端口角色单一:被阻塞的端口只能被动等待,无法快速切换。
  • 缺乏边缘端口概念:连接终端主机的端口也要经历完整的监听、学习过程,主机开机后长时间无法上网。

为了弥补这些不足,RSTP(Rapid Spanning Tree Protocol,快速生成树协议) 应运而生。

6. RSTP 概述

RSTP 由 IEEE 802.1w 定义,后来被合入 IEEE 802.1D-2004 标准。RSTP 完全兼容 STP,可以与 STP 交换机互联互通,同时在以下几个方面做了重大改进:

  • 端口状态由 5 种简化为 3 种;
  • 端口角色增加 Alternate(替代)端口 和 Backup(备份)端口 两种;
  • 通过 P/A(Proposal/Agreement)机制 实现点到点链路的快速收敛;
  • 引入边缘端口,使连接终端主机的端口可以立即进入转发状态。

7. RSTP 的端口角色与状态

7.1 端口角色

RSTP 将端口角色扩展为四种:

端口角色 说明
根端口(RP) 非根桥上到达根桥开销最小的端口
指定端口(DP) 每条网段上负责转发的端口
替代端口(Alternate) 根端口的备份,收到更优 BPDU 而被阻塞,主根端口故障时可快速切换
备份端口(Backup) 指定端口的备份,通常出现在同一台交换机通过集线器互联的场景

7.2 端口状态

RSTP 把 STP 的五种状态合并为三种:

text 复制代码
Discarding(丢弃) → Learning(学习) → Forwarding(转发)
RSTP 状态 对应 STP 状态 是否转发数据帧
Discarding Disabled / Blocking / Listening 否
Learning Learning 否
Forwarding Forwarding 是

减少状态数量本身就缩短了端口迁移时间,再加上快速切换机制,RSTP 的收敛时间可以缩短到秒级甚至亚秒级。

7.3 收敛过程

下面换一个新的拓扑示例来说明 RSTP 的收敛过程。与第 4 章不同,这次在 SW2 上增加一个通过集线器连接的共享网段,以便完整展示 RSTP 的四种端口角色:根端口 RP、指定端口 DP、替代端口 Alternate、备份端口 Backup。

拓扑与参数如下:

  • SW1 :桥优先级 4096,MAC 地址 00e0-fc11-1111,G0/0/1 连接 SW2,G0/0/2 连接 SW3;
  • SW2 :桥优先级 32768,MAC 地址 00e0-fc22-2222,G0/0/1 连接 SW1,G0/0/2 连接 SW3,G0/0/3 和 G0/0/4 通过 Hub1 接入同一个共享网段;
  • SW3 :桥优先级 32768,MAC 地址 00e0-fc33-3333,G0/0/1 连接 SW1,G0/0/2 连接 SW2;
  • 三台交换机之间的链路均为 1 Gbps ,端口开销为 4;Hub1 所在共享网段仅用于演示 Backup 端口,不参与本次根桥选举。

#mermaid-svg-5ZJzvZEctWbdFSRf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5ZJzvZEctWbdFSRf .error-icon{fill:#552222;}#mermaid-svg-5ZJzvZEctWbdFSRf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5ZJzvZEctWbdFSRf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5ZJzvZEctWbdFSRf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5ZJzvZEctWbdFSRf .marker.cross{stroke:#333333;}#mermaid-svg-5ZJzvZEctWbdFSRf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5ZJzvZEctWbdFSRf p{margin:0;}#mermaid-svg-5ZJzvZEctWbdFSRf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5ZJzvZEctWbdFSRf .cluster-label text{fill:#333;}#mermaid-svg-5ZJzvZEctWbdFSRf .cluster-label span{color:#333;}#mermaid-svg-5ZJzvZEctWbdFSRf .cluster-label span p{background-color:transparent;}#mermaid-svg-5ZJzvZEctWbdFSRf .label text,#mermaid-svg-5ZJzvZEctWbdFSRf span{fill:#333;color:#333;}#mermaid-svg-5ZJzvZEctWbdFSRf .node rect,#mermaid-svg-5ZJzvZEctWbdFSRf .node circle,#mermaid-svg-5ZJzvZEctWbdFSRf .node ellipse,#mermaid-svg-5ZJzvZEctWbdFSRf .node polygon,#mermaid-svg-5ZJzvZEctWbdFSRf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5ZJzvZEctWbdFSRf .rough-node .label text,#mermaid-svg-5ZJzvZEctWbdFSRf .node .label text,#mermaid-svg-5ZJzvZEctWbdFSRf .image-shape .label,#mermaid-svg-5ZJzvZEctWbdFSRf .icon-shape .label{text-anchor:middle;}#mermaid-svg-5ZJzvZEctWbdFSRf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5ZJzvZEctWbdFSRf .rough-node .label,#mermaid-svg-5ZJzvZEctWbdFSRf .node .label,#mermaid-svg-5ZJzvZEctWbdFSRf .image-shape .label,#mermaid-svg-5ZJzvZEctWbdFSRf .icon-shape .label{text-align:center;}#mermaid-svg-5ZJzvZEctWbdFSRf .node.clickable{cursor:pointer;}#mermaid-svg-5ZJzvZEctWbdFSRf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5ZJzvZEctWbdFSRf .arrowheadPath{fill:#333333;}#mermaid-svg-5ZJzvZEctWbdFSRf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5ZJzvZEctWbdFSRf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5ZJzvZEctWbdFSRf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5ZJzvZEctWbdFSRf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5ZJzvZEctWbdFSRf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5ZJzvZEctWbdFSRf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5ZJzvZEctWbdFSRf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5ZJzvZEctWbdFSRf .cluster text{fill:#333;}#mermaid-svg-5ZJzvZEctWbdFSRf .cluster span{color:#333;}#mermaid-svg-5ZJzvZEctWbdFSRf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5ZJzvZEctWbdFSRf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5ZJzvZEctWbdFSRf rect.text{fill:none;stroke-width:0;}#mermaid-svg-5ZJzvZEctWbdFSRf .icon-shape,#mermaid-svg-5ZJzvZEctWbdFSRf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5ZJzvZEctWbdFSRf .icon-shape p,#mermaid-svg-5ZJzvZEctWbdFSRf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5ZJzvZEctWbdFSRf .icon-shape .label rect,#mermaid-svg-5ZJzvZEctWbdFSRf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5ZJzvZEctWbdFSRf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5ZJzvZEctWbdFSRf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5ZJzvZEctWbdFSRf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} G0/0/1 <-> G0/0/1
G0/0/2 <-> G0/0/1
G0/0/2 <-> G0/0/2
G0/0/3
G0/0/4
SW1 根桥

优先级 4096

00e0-fc11-1111
SW2

优先级 32768

00e0-fc22-2222
SW3

优先级 32768

00e0-fc33-3333
Hub1 共享网段

1. 选举根桥

交换机启动后,各端口先进入 Discarding,并互相发送配置 BPDU。比较桥 ID 后,SW1 优先级 4096 最小,成为根桥;根桥 SW1 的所有活动端口自动成为指定端口 DP。

2. 选举根端口 RP

  • SW2 :从 G0/0/1 收到 SW1 的 BPDU,累计开销 = 0 + 4 = 4,因此 G0/0/1 被选为 根端口 RP。
  • SW3 :从 G0/0/1 收到 SW1 的 BPDU,累计开销 = 0 + 4 = 4;从 G0/0/2 收到 SW2 转发的 BPDU,累计开销 = 4 + 4 = 8。因为 4 < 8,所以 G0/0/1 被选为 根端口 RP。

3. 选举指定端口 DP,并确定 Alternate 与 Backup

  • SW1-SW2 网段 :SW1 G0/0/1 发出的 BPDU 根路径开销为 0,优于 SW2 G0/0/1 的 4,因此 SW1 G0/0/1 为 指定端口 DP。
  • SW1-SW3 网段 :同理,SW1 G0/0/2 为 指定端口 DP。
  • SW2-SW3 网段 :SW2 G0/0/2 和 SW3 G0/0/2 发出的 BPDU 根路径开销都是 4,继续比较发送桥 ID,SW2 的 MAC 更小,因此 SW2 G0/0/2 为 指定端口 DP ;SW3 G0/0/2 落选指定端口,成为根端口 的 替代端口 Alternate。
  • Hub1 共享网段 :SW2 的 G0/0/3 和 G0/0/4 发出的 BPDU 根路径开销、发送桥 ID 都相同,继续比较发送端口 ID,G0/0/3 端口号更小,因此 G0/0/3 为 指定端口 DP ,G0/0/4 成为 备份端口 Backup。

4. P/A 握手加速收敛

在 RSTP 中,点到点链路通过 Proposal/Agreement 握手加速收敛:根桥 SW1 的指定端口发送 Proposal,SW2、SW3 的根端口回复 Agreement,相关指定端口和根端口快速进入 Forwarding,不再等待两个 Forward Delay。Alternate 和 Backup 端口则稳定在 Discarding,作为快速切换备份。

5. 最终收敛结果

交换机 端口 RSTP 端口角色 稳定状态 说明
SW1 G0/0/1 指定端口 DP Forwarding 根桥端口,向 SW2 转发
SW1 G0/0/2 指定端口 DP Forwarding 根桥端口,向 SW3 转发
SW2 G0/0/1 根端口 RP Forwarding 到根桥累计开销为 4
SW2 G0/0/2 指定端口 DP Forwarding SW2-SW3 网段的指定端口
SW2 G0/0/3 指定端口 DP Forwarding Hub1 网段的指定端口
SW2 G0/0/4 备份端口 Backup Discarding 指定端口 G0/0/3 的备份
SW3 G0/0/1 根端口 RP Forwarding 到根桥累计开销为 4
SW3 G0/0/2 替代端口 Alternate Discarding 根端口 G0/0/1 的备份

这样,四个端口角色就分别落在:

  • 根端口 RP :SW2 G0/0/1、SW3 G0/0/1;
  • 指定端口 DP :SW1 G0/0/1、SW1 G0/0/2、SW2 G0/0/2、SW2 G0/0/3;
  • 替代端口 Alternate :SW3 G0/0/2,是根端口的备份;
  • 备份端口 Backup :SW2 G0/0/4,是指定端口的备份。

Alternate 与 Backup 都稳定在 Discarding 状态,只收发 BPDU、不转发用户数据。一旦主端口故障,RSTP 可以立即把它们切换到转发状态,实现快速收敛。

8. RSTP 快速收敛机制

8.1 P/A 握手机制

对于点到点链路,RSTP 通过 Proposal / Agreement 握手快速确定端口状态:

  1. 交换机 SW1 的指定端口发送 Proposal(提议) 报文,请求快速进入转发状态;
  2. 对端交换机 SW2 如果同意,将其与 SW1 相连的端口设置为根端口,并回复 Agreement(同意);
  3. 收到 Agreement 后,交换机 SW1 的指定端口立即进入转发状态。

SW2 根端口 SW1 指定端口 SW2 根端口 SW1 指定端口 #mermaid-svg-guRqvlzOdZ9COzlJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-guRqvlzOdZ9COzlJ .error-icon{fill:#552222;}#mermaid-svg-guRqvlzOdZ9COzlJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-guRqvlzOdZ9COzlJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-guRqvlzOdZ9COzlJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-guRqvlzOdZ9COzlJ .marker.cross{stroke:#333333;}#mermaid-svg-guRqvlzOdZ9COzlJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-guRqvlzOdZ9COzlJ p{margin:0;}#mermaid-svg-guRqvlzOdZ9COzlJ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-guRqvlzOdZ9COzlJ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-guRqvlzOdZ9COzlJ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-guRqvlzOdZ9COzlJ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-guRqvlzOdZ9COzlJ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-guRqvlzOdZ9COzlJ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-guRqvlzOdZ9COzlJ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-guRqvlzOdZ9COzlJ .sequenceNumber{fill:white;}#mermaid-svg-guRqvlzOdZ9COzlJ #sequencenumber{fill:#333;}#mermaid-svg-guRqvlzOdZ9COzlJ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-guRqvlzOdZ9COzlJ .messageText{fill:#333;stroke:none;}#mermaid-svg-guRqvlzOdZ9COzlJ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-guRqvlzOdZ9COzlJ .labelText,#mermaid-svg-guRqvlzOdZ9COzlJ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-guRqvlzOdZ9COzlJ .loopText,#mermaid-svg-guRqvlzOdZ9COzlJ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-guRqvlzOdZ9COzlJ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-guRqvlzOdZ9COzlJ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-guRqvlzOdZ9COzlJ .noteText,#mermaid-svg-guRqvlzOdZ9COzlJ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-guRqvlzOdZ9COzlJ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-guRqvlzOdZ9COzlJ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-guRqvlzOdZ9COzlJ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-guRqvlzOdZ9COzlJ .actorPopupMenu{position:absolute;}#mermaid-svg-guRqvlzOdZ9COzlJ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-guRqvlzOdZ9COzlJ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-guRqvlzOdZ9COzlJ .actor-man circle,#mermaid-svg-guRqvlzOdZ9COzlJ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-guRqvlzOdZ9COzlJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 收到 Agreement 后立即进入 Forwarding 发送 Proposal(提议进入转发)回复 Agreement(同意)

这种方式让新接入的交换机能在极短时间内完成协商,而不必像 STP 那样等待两个 Forward Delay。

8.2 边缘端口

连接 PC、服务器等终端设备的端口,可以配置为边缘端口(Edge Port)。边缘端口具有以下特点:

  • 启动后立即进入转发状态,无需经历学习等待;
  • 端口断开或恢复不会触发拓扑变更,避免全网重新收敛;
  • 一旦收到 BPDU,会自动转变为普通生成树端口,防止误接交换机形成环路。

边缘端口类似于思科体系中的 PortFast 端口。

9. STP 与 RSTP 对比

对比项 STP(802.1D) RSTP(802.1w)
端口状态 5 种 3 种
端口角色 根端口、指定端口、阻塞端口 根端口、指定端口、替代端口、备份端口
收敛速度 约 30~50 秒 通常 1~3 秒,甚至亚秒级
边缘端口 不支持 支持
快速切换 不支持 支持(P/A 机制)
兼容性 基线标准 向下兼容 STP

总的来说,现代网络环境中应优先启用 RSTP;只有在对老设备兼容要求极高时才考虑保留 STP。

11. 总结

STP 与 RSTP 是二层网络中最基础的防环协议,其核心逻辑都是"选举根桥、计算最优路径、阻塞冗余链路",区别在于 RSTP 通过精简状态、引入替代/备份端口和 P/A 握手,把收敛速度从几十秒提升到秒级。

相关推荐
不一样的故事1261 小时前
Skill封装(Agent Skill / 智能体技能封装)
网络
qq_429432302 小时前
叫班系统对接 IP-PBX/SIP 与排班系统:接口方式与部署选型要点
网络·网络协议·tcp/ip·信息与通信·ip·1024程序员节·voip通信协议
SHENGWEI胜为9 小时前
二层网络广播风暴如何排查?从交换机接口计数器到 STP 拓扑变化分析
网络
艾芯微科技10 小时前
HR911130C|汉仁 HANRUN 集成变压器千兆 RJ45 网口参数、电路、PCB 布线、替代与采购避坑
网络·单片机·嵌入式硬件·集成测试·51单片机
日常筹谋记10 小时前
工业厂房 TPO 防水卷材:技术需求如何传导到配方层面?
运维·网络·html
玄芯散人13 小时前
【元婴·106】I2C总线:地址冲突、Clock Stretching、总线死锁怎么破
网络
YH_Analytics13 小时前
2026 年增亮膜(DBEF)行业市场格局深度解析
大数据·网络
dk_tjy14 小时前
迪康网络运维故障自愈的自动化闭环技术路径分析
运维·网络·自动化