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 标准定义,其核心思想可以概括为三步:
- 在全网交换机中选举出一台根桥(Root Bridge);
- 每台非根桥计算到达根桥的最优路径,确定自己的根端口(Root Port);
- 每条链路上选举一个指定端口(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,优于 SW2G0/0/1的4,因此 SW1G0/0/1为 指定端口 DP。 - SW1-SW3 网段 :同理,SW1
G0/0/2为 指定端口 DP。 - SW2-SW3 网段 :SW2
G0/0/2和 SW3G0/0/2发出的 BPDU 根路径开销都是4,继续比较发送桥 ID,SW2 的 MAC 更小,因此 SW2G0/0/2为 指定端口 DP ;SW3G0/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、SW3G0/0/1; - 指定端口 DP :SW1
G0/0/1、SW1G0/0/2、SW2G0/0/2、SW2G0/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 握手快速确定端口状态:
- 交换机 SW1 的指定端口发送 Proposal(提议) 报文,请求快速进入转发状态;
- 对端交换机 SW2 如果同意,将其与 SW1 相连的端口设置为根端口,并回复 Agreement(同意);
- 收到 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 握手,把收敛速度从几十秒提升到秒级。