第16篇:STP 生成树协议原理:根桥、根端口、指定端口选举
关键词:STP、生成树协议、根桥选举、根端口、指定端口、BPDU、路径开销、桥ID、802.1D
一、引言
在上一篇文章中,我们目睹了环路导致的广播风暴如何瘫痪整个网络。要解决环路问题,最简单粗暴的方法是只保留一条物理链路——但这意味着失去了冗余能力。STP(Spanning Tree Protocol,生成树协议)的诞生,就是为了在保留冗余链路的同时,逻辑上断开环路。STP 通过一套选举算法,自动确定哪些端口转发数据、哪些端口阻塞备份。本文将系统讲解 STP 的核心概念和选举规则。
二、核心概念
2.1 STP 的基本思想
STP 的目标是:在一个存在物理环路的二层网络中,构造一棵无环的逻辑树。
| 要素 | 说明 |
|---|---|
| 输入 | 物理网络拓扑(可能包含环路) |
| 输出 | 逻辑树拓扑(无环,但保持连通性) |
| 方法 | 选举一个根桥,计算最短路径,阻塞冗余端口 |
| 协议 | IEEE 802.1D(标准 STP) |
2.2 BPDU(Bridge Protocol Data Unit)
BPDU 是 STP 协议的数据单元,交换机之间通过交换 BPDU 来构建生成树。
| 字段 | 长度 | 说明 |
|---|---|---|
| Protocol ID | 2 字节 | 固定值 0,表示 STP |
| Version | 1 字节 | 0=STP, 2=RSTP, 3=MSTP |
| Message Type | 1 字节 | 0=配置 BPDU, 2=TCN BPDU |
| Root Bridge ID | 8 字节 | 当前最优根桥的标识 |
| Root Path Cost | 4 字节 | 到根桥的累计路径开销 |
| Sender Bridge ID | 8 字节 | 发送此 BPDU 的交换机标识 |
| Sender Port ID | 2 字节 | 发送此 BPDU 的端口标识 |
2.3 Bridge ID(桥标识)
Bridge ID 是交换机的唯一标识,由优先级和 MAC 地址组成。
| 组成部分 | 长度 | 说明 |
|---|---|---|
| 优先级(Priority) | 2 字节 | 默认 32768,可配置(步长 4096) |
| MAC 地址 | 6 字节 | 交换机的基 MAC 地址 |
Bridge ID 比较规则:数值小者优。先比较优先级,优先级相同比较 MAC 地址。
2.4 STP 的三种端口角色
| 端口角色 | 数量 | 数据转发 | 选举范围 |
|---|---|---|---|
| 根端口(Root Port, RP) | 每台非根桥 1 个 | 是 | 每台非根桥选举 |
| 指定端口(Designated Port, DP) | 每条链路 1 个 | 是 | 每条链路选举 |
| 非指定端口(Non-Designated Port, NDP) | 若干个 | 否(阻塞) | 其余端口 |
三、技术细节
3.1 选举流程:四步走
STP 的选举按严格顺序执行:

3.2 第一步:选举根桥
规则:全网络 Bridge ID 最小的交换机成为根桥。
| 比较顺序 | 比较项 | 规则 |
|---|---|---|
| 1 | 优先级 | 数值小者优先 |
| 2 | MAC 地址 | 数值小者优先 |
# 查看当前 STP 根桥
<HUAWEI> display stp brief
MSTID PortName PortRole PortSt
0 GE0/0/1 Root Forwarding
0 GE0/0/2 Desi Forwarding
Root Bridge: 32768.00e0.fc12.0001 ← 当前根桥
# 修改优先级使本设备成为根桥
[HUAWEI] stp priority 4096
# 优先级必须是 4096 的倍数。缺省情况下,交换设备在指定生成树中的优先级是32768。
3.3 第二步:选举根端口
范围:每台非根桥交换机选举一个根端口。
规则:选择到达根桥最优路径的端口。
| 比较顺序 | 比较项 | 规则 |
|---|---|---|
| 1 | 到达根桥的路径开销(Root Path Cost) | 小者优先 |
| 2 | 发送 BPDU 的交换机 Bridge ID | 小者优先 |
| 3 | 发送 BPDU 的端口 ID | 小者优先 |
| 4 | 本地端口 ID | 小者优先(打破平局) |
路径开销计算:累计从本交换机到根桥经过的所有链路的开销。
| 链路带宽 | 802.1D 原始开销 | 802.1t 开销(华为默认) |
|---|---|---|
| 10 Mbps | 100 | 2,000,000 |
| 100 Mbps | 19 | 200,000 |
| 1 Gbps | 4 | 20,000 |
| 10 Gbps | 2 | 2,000 |
| 40 Gbps | 1 | 500 |
注意:IEEE 802.1D 原始开销表只定义到 10 Gbps,25/40/100 Gbps 在该标准中没有对应值;华为设备实际使用 802.1t 的短路径开销(GE 端口默认 20000,10GE 端口默认 2000),因此工程中看到的都是 802.1t 数值。
# 查看端口路径开销
<HUAWEI> display stp
Root Cost: 20000 ← 到根桥的累计开销
# 手动修改端口开销(影响根端口选举)
[HUAWEI] interface GigabitEthernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] stp cost 10000
[HUAWEI-GigabitEthernet0/0/1] quit
3.4 第三步:选举指定端口
范围:每条链路上选举一个指定端口。
规则:比较哪个交换机端口能为该网段提供最优到达根桥的路径。
| 比较顺序 | 比较项 | 规则 |
|---|---|---|
| 1 | 到达根桥的路径开销(Root Path Cost) | 小者优先 |
| 2 | 发送 BPDU 的交换机 Bridge ID | 小者优先 |
| 3 | 发送 BPDU 的端口 ID | 小者优先 |
特殊规则:根桥的所有端口都是指定端口(因为根桥的 Root Path Cost = 0,永远最优)。
3.5 第四步:阻塞非指定端口
既不是根端口也不是指定端口的端口,进入阻塞(Discarding/Blocking)状态,不转发用户数据,只接收 BPDU。
3.6 端口 ID 的组成
端口 ID 由端口优先级和端口编号组成,用于打破选举平局。
| 组成部分 | 长度 | 说明 |
|---|---|---|
| 端口优先级 | 1 字节 | 默认 128,可配置(步长 16) |
| 端口编号 | 1 字节 | 端口号 |
# 修改端口优先级
[HUAWEI] interface GigabitEthernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] stp port priority 64
[HUAWEI-GigabitEthernet0/0/1] quit
四、实战配置/案例分析
4.1 案例一:三台交换机的 STP 选举完整推演
网络描述:三台交换机 S1、S2、S3 组成三角形拓扑,全部使用默认配置。
| 交换机 | Bridge ID(默认) | MAC 地址 |
|---|---|---|
| S1 | 32768.00e0.fc12.0001 | 00e0.fc12.0001 |
| S2 | 32768.00e0.fc12.0002 | 00e0.fc12.0002 |
| S3 | 32768.00e0.fc12.0003 | 00e0.fc12.0003 |
链路开销:全部为 GE 链路,开销 = 20,000
第一步:选举根桥
优先级相同(都是 32768),比较 MAC 地址: - S1(0001)< S2(0002)< S3(0003) - S1 成为根桥
第二步:选举根端口
| 交换机 | 到 S1 的路径 | 根端口 |
|---|---|---|
| S1 | 根桥自身 | 无(根桥没有根端口) |
| S2 | S2→S1(开销 20,000) | S2 连接 S1 的端口 |
| S3 | S3→S1(开销 20,000) | S3 连接 S1 的端口 |
第三步:选举指定端口
| 链路 | 两端比较 | 指定端口 |
|---|---|---|
| S1↔S2 | S1 的 Cost=0,S2 的 Cost=20,000 | S1 侧为 DP |
| S1↔S3 | S1 的 Cost=0,S3 的 Cost=20,000 | S1 侧为 DP |
| S2↔S3 | S2 的 Cost=20,000,S3 的 Cost=20,000 | S2(MAC 小)侧为 DP |
第四步:阻塞端口
| 交换机 | 端口 | 角色 | 状态 |
|---|---|---|---|
| S1 | 连 S2 | DP | Forwarding |
| S1 | 连 S3 | DP | Forwarding |
| S2 | 连 S1 | RP | Forwarding |
| S2 | 连 S3 | DP | Forwarding |
| S3 | 连 S1 | RP | Forwarding |
| S3 | 连 S2 | NDP | Discarding |
4.2 案例二:手动调整根桥位置
需求:将核心交换机设为根桥,确保最优的转发路径。
# ========== 核心交换机(设为根桥)==========
[Core-SW] stp mode rstp
# 方式一(推荐):快捷命令,stp root primary 直接把优先级设为 0(全网最小,必当选根桥)
[Core-SW] stp root primary
# 方式二:手动指定,取较小值(4096 的倍数),与方式一选一即可
[Core-SW] stp priority 4096
# ========== 汇聚交换机(设为备份根桥)==========
[Agg-SW] stp mode rstp
# 方式一(推荐):快捷命令,stp root secondary 直接把优先级设为 4096
[Agg-SW] stp root secondary
# 方式二:手动指定,取比根桥大、比默认 32768 小的值(如 8192),与方式一选一即可
[Agg-SW] stp priority 8192
# 注意:同一台设备上"快捷命令 / stp priority"只能选其一,勿重复设置
# ========== 接入交换机(默认优先级)==========
[Access-SW] stp mode rstp
# 保持默认优先级 32768
# ========== 验证 ==========
<Core-SW> display stp
Device MAC: 00e0.fc12.0001
Root/Local Bridge: Yes ← 本设备是根桥
<Agg-SW> display stp
Root Bridge:
Bridge ID: 4096.00e0.fc12.0001 ← 根桥是 Core-SW
4.3 案例三:通过端口开销影响根端口选举
需求:接入交换机有两条上联链路(GE 到核心和 GE 到汇聚),希望主链路走核心。
# 默认情况:两条链路开销相同,靠对端 Bridge ID 决定
# 汇聚交换机优先级更低(8192),接入交换机可能选择汇聚作为根端口
# 方案:修改上联汇聚的端口开销,使其更大
[Access-SW] interface GigabitEthernet 0/0/23
[Access-SW-GigabitEthernet0/0/23] description To-Aggregation
[Access-SW-GigabitEthernet0/0/23] stp cost 40000
[Access-SW-GigabitEthernet0/0/23] quit
# 上联核心的端口保持默认开销 20000
# 验证根端口选举
<Access-SW> display stp brief
PortName PortRole PortSt
GE0/0/24 Root Forwarding ← 上联核心(Cost=20000)
GE0/0/23 NDP Discarding ← 上联汇聚(Cost=40000,被阻塞)
4.4 案例四:STP 基本配置与查看
# ========== 全局启用 STP ==========
[HUAWEI] stp mode stp # 传统 STP(仅兼容性需求时使用)
[HUAWEI] stp mode rstp # 快速生成树(推荐)
[HUAWEI] stp mode mstp # 多实例生成树(大型网络)
[HUAWEI] stp enable # 全局启用
# ========== 查看 STP 信息 ==========
<HUAWEI> display stp # 详细 STP 信息
<HUAWEI> display stp brief # 简要端口角色和状态
<HUAWEI> display stp port # 端口详细信息
<HUAWEI> display stp topology-changes # 拓扑变更统计
五、总结
| 选举步骤 | 选举对象 | 选举范围 | 关键比较项 |
|---|---|---|---|
| 第一步 | 根桥 | 全网所有交换机 | Bridge ID(优先级 + MAC) |
| 第二步 | 根端口 | 每台非根桥 | 路径开销、对端 BID、对端 PID |
| 第三步 | 指定端口 | 每条链路 | 路径开销、BID、PID |
| 第四步 | 阻塞端口 | 其余端口 | 非 RP 也非 DP 的端口 |
| 端口角色 | 数据转发 | 接收 BPDU | 数量 |
|---|---|---|---|
| 根端口(RP) | 是 | 是 | 每台非根桥 1 个 |
| 指定端口(DP) | 是 | 是 | 每条链路 1 个 |
| 非指定端口(NDP) | 否 | 是 | 若干(阻塞状态) |
| 优化手段 | 命令 | 适用场景 |
|---|---|---|
| 调整根桥 | stp priority 4096 |
确保核心交换机为根桥 |
| 快捷设根桥 | stp root primary/secondary |
快速配置主备根桥 |
| 调整端口开销 | stp cost X |
影响根端口选举 |
| 调整端口优先级 | stp port-priority X |
打破选举平局 |
| 边缘端口 | stp edged-port enable |
加速接入端口收敛 |
思考
- 如果全网所有交换机的优先级都是默认值 32768,根桥是如何确定的?有什么风险?
- 根桥的所有端口都是指定端口吗?为什么?
- 如果两条到达根桥的路径开销相同,交换机如何选择根端口?请按优先级列出比较因素。
下篇预告:第17篇:STP 端口状态迁移:从 Disable 到 Forwarding