0. 课件来源
本节在 HCIA STP 基础上,深入讲解 STP 的 选路原则完整推导、BPDU 结构、计时器、拓扑变更机制(TCN),为理解 RSTP / MSTP 快速切换原理打基础。
1. STP 协议全景
| 协议 | 标准 | 优点 | 缺点 |
|---|---|---|---|
| STP | 802.1D(CST) | 无环、冗余、最优路径 | 不能负载、切换 30''~50'' |
| PVST(思科私有) | Per-VLAN STP | 无环、冗余、最优路径、负载、部分快速切换 | vlan 过多时资源消耗大 |
| RSTP | 802.1W | 无环、冗余、快速切换 0''、最优路径 | 不能负载 |
| MSTP | 802.1S | 无环、冗余、快速切换、最优路径、负载 | — |
💡 单生成树 vs 多生成树
- CST(Common STP):所有 VLAN 共享同一棵公共生成树 → 单生成树(SST)。
- MSTP:通过 Instance(实例) 区分多棵生成树。
Instance 0是默认存在的"根本大树",映射所有 VLAN;Instance XX把部分 VLAN 映射进去,实现按实例的最优路径与负载分担。
2. 桥 ID(BID)与扩展系统 ID
BID 共 8 字节 = 2 字节 Priority + 6 字节 MAC。
| 字段 | 说明 |
|---|---|
| Priority | 默认 32768,步长 4096 |
| System Extended ID | 在 PVST/MSTP 中,Priority 的 16 bit 被拆为 4 bit 优先级 + 12 bit 扩展 ID(VLAN/Instance ID) |
| MAC | 交换机背板 MAC,人工不可改 |
BID 拆解(PVST/MSTP):
+---------- 16 bit Priority ----------+
| 4 bit 优先级 | 12 bit 扩展 ID (VLAN/Instance) |
+---------+-------------------------------+
| 32768 | vlan10 / instance10 | + MAC 地址⚠️ 为什么拆扩展 ID
单生成树(CST)所有 VLAN 共用同一个 BID 不冲突;但 PVST/MSTP 中每 VLAN/Instance 都要参与选举,若 BID 仅用 Priority+MAC,则同一台交换机不同 VLAN 的 BID 完全相同,无法区分。拆出 12 bit 作为 VLAN/Instance 标识后,32768 + vlan10 + MAC 与 32768 + vlan20 + MAC 才不同。
3. STP 端口角色
| 角色 | 数据 | BPDU | 说明 |
|---|---|---|---|
| DP(Designated,指定端口) | 收发 | 发 | 每段链路最优端口 |
| RP(Root,根端口) | 收发 | 收 | 非根上到根最优端口 |
| 阻塞端口 | 不收发 | 收 | 既非 RP 又非 DP |
4. STP 选举完整流程
4.1 三步法
- 选根(ROOT):整个交换网络 BID 最小的交换机
- 选 RP:非根交换机上到根最优(BPDU 最小)的端口
- 选 DP:每段链路上最优端口;既非 RP 又非 DP 的端口被阻塞
4.2 初始化阶段(存 → 比 → 发)
步骤一:存 — 保存最优 BPDU 每段链路互发 BPDU,按选路原则比较,每个接口保存"最优 BPDU"(最小):
- 若交换机所有接口保存的都是自己的 BPDU → 我是 ROOT
- 若部分接口保存的是对方的 BPDU → 我是 nonROOT
步骤二:比 — 计算累加(选举 RP) 非根交换机选举 RP:去往根最优(BPDU 最小)的端口。入向累加 Cost,出向不累加。
以 SW2 为例(千兆全双工接口 Cost = 20000,802.1T 标准):
G0/0/23 存 小[0][小24] → 计算:0 + 20000(入向) = 小24
G0/0/21 存 中[0][中21] → 计算:0 + 20000(入向) = 中21
→ G0/0/23 更优,成为 RP(初始化阶段不靠 cost,靠 RID 不同区分)💡 初始化 vs 正常化
- 初始化阶段:RP 还没选出,各接口存的 BPDU 的 RID 不同,先靠 RID 比较。
- 正常化阶段:RP 选出后 RID 都相同(都是根),此时靠 RPC(cost)比较。
步骤三:发 — 改变(继承 RP 属性) RP 选出后,其他所有端口发送 BPDU 都要 继承 RP 的相关属性,重新生成 BPDU 再发。
4.3 选路原则(必背)
| 顺序 | 字段 | 作用阶段 |
|---|---|---|
| 1 | RID | 选举根 |
| 2 | RPC(Root Path Cost) | 正常阶段选举 RP |
| 3 | BID(发送方桥 ID) | 默认随机选举一个 |
| 4 | PID(发送方端口 ID) | 前面选不出来时随机 |
| 5 | 本地 PID | 前面选不出来时随机 |
5. BPDU 结构
STP BPDU 封装在 802.3 以太帧中:
- DMAC =
0180-C200-0000(所有交换机侦听的组播 MAC),收后不转发 - LLC Type =
0x4242,标识是 STP BPDU,提交给 STP 进程
Protocol ID : 0000 (spanning-tree)
Version ID : 00(STP-802.1D) / 02(RSTP-802.1w) / 03(MSTP-802.1s)
BPDU Type : 00(Configuration) / 80(TCN 拓扑变更通告)
Flag : 1 字节,bit7=TCA,bit0=TC
RID : 根 BID (priority + system-id + MAC)
RPC : 根路径开销
BID : 自身桥 ID
PID : 端口 ID (priority + port-id)💡 STP vs RSTP/MSTP BPDU
- STP:
BPDU Type = 00(Configuration),80(TCN) - RSTP / MSTP:
Version = 02,使用统一的 RSTP/MSTP BPDU,Type =02
6. STP 计时器
| 计时器 | 默认值 | 说明 |
|---|---|---|
| Hello | 2 秒(200 厘秒) | 根发送配置 BPDU 周期 |
| Max-Age | 20 秒(2000 厘秒) | BPDU 老化时间 |
| Forward-Delay | 15 秒(1500 厘秒) | Listening→Learning、Learning→Forwarding 延时 |
⚠️ 关键认知
- 配置 BPDU 只有根能产生,其他非根交换机只能转发。
- 因此 计时器只能在根上修改 才能让整个 STP 网络生效,非根上改不生效(会被根同步覆盖)。
Max-Age = 2 * 7 + 2 * 3 = 20 秒,默认 STP 拓扑最大 7 层(直径)。
6.1 修改计时器的两种方法
# 方法 1:直接在根上修改
stp timer hello 200
stp timer max-age 2000
stp timer forward-delay 1500
# 方法 2:修改 STP 直径(华为会按直径自动计算 timer)
stp bridge-diameter 7 # 取值 2-7,默认 77. 端口状态与切换时间
| 状态 | 行为 | 停留时间 |
|---|---|---|
| Disable | 没插线 | — |
| Blocking | 阻塞,收 BPDU | — |
| Listening | 选举端口角色,不转发数据 | 15 秒 |
| Learning | 学习 MAC 构建表 | 15 秒 |
| Forwarding | 转发 | — |
7.1 不同故障的切换时间
| 故障类型 | 切换时间 | 说明 |
|---|---|---|
| 物理接口 down-up | 30 秒 | 15 + 15 |
| 直连链路切换 | 30 秒 | 15 + 15 |
| 非直连链路切换(标准) | 50 秒 | 20(max-age) + 30 |
| 非直连链路切换(华为次级 BPDU 优化) | 30 秒 | 收到次级 BPDU 立即老化,不等 20 秒 |
💡 华为次级 BPDU 优化
标准 STP 非直连切换要等 Max-Age 20 秒。华为交换机收到 次级 BPDU(比自己存的更差的 BPDU)会立即老化,直接进入 Listening/Learning,30 秒转发。思科用 backbonefast 实现类似功能(发 RLQ 查询根是否还在)。
8. 拓扑变更机制(TCM)
8.1 为什么需要 TCM
STP 拓扑变更后,个别交换机 MAC 地址表未及时更新,会导致业务中断。TCM 通过 TCN 通告全网刷新 MAC 表重新学习。
8.2 STP TCM 流程
1. 下游接口变更(down-up / up-down) → 下游向 RP 发送 TCN
2. 上游 DP 收到 TCN → 继续向 RP 转发,直到 ROOT
3. 上游 DP 收到 TCN → 配置 BPDU 中 Flag 置 TCA=1,告知下游"已收到",下游停止发 TCN
4. ROOT 收到 TCN → 配置 BPDU 中 Flag 置 TCA=1、TC=1,通告全网
5. 非根交换机收到 TC=1 → 刷新 MAC 表,重新学习⚠️ TCN vs TC vs TCA
- TCN:一类 BPDU(Type=80),下游向上游通告"发生了变更"
- TCA:配置 BPDU Flag 中的确认位,"我收到你的 TCN 了"
- TC:配置 BPDU Flag 中的拓扑变更位,根向全网通告"刷新 MAC 表"
9. 路径调整(如何干预 STP 选路)
9.1 大调(修改根)
# 方法 1:改 BID 优先级
stp priority 0
# 方法 2:配主根和备份根(前提:其他 SW 都是默认值)
SW1: stp root primary # priority = 0
SW2: stp root secondary # priority = 40969.2 微调(不改变根)
| 调整对象 | 在哪改 | 生效条件 |
|---|---|---|
| Cost | 非 DP(根端口) | 入向累加,改非根生效 |
| Port Priority | DP(指定端口) | 改根/上游 DP 生效 |
💡 微调口诀
- DP 改 Port Priority
- 非 DP(RP)改 Cost
根上改 cost 不生效(根是源头没有入向 cost 概念),只能改 Port Priority 影响下游对端比较 PID;非根改 Port Priority 不生效(自己不产生配置 BPDU)。
10. 易混淆点与考前速记
| 对比项 | 结论 |
|---|---|
| STP 切换 | 30 秒(物理/直连)/ 50 秒(标准非直连)/ 30 秒(华为次级 BPDU 优化) |
| Max-Age 公式 | 2 * 直径 + 2 * 3 = 20,默认直径 7 |
| 计时器改哪里 | 只能在根上改,非根改不生效 |
| 选路 5 步 | RID → RPC → BID → PID → 本地 PID |
| TCM 作用 | 通告全网刷新 MAC 表重新学习 |
| DP vs 非DP 调整 | DP 改 Port Priority;非 DP 改 Cost |
考前速记 8 条:
BID = 优先级(2字节) + MAC(6字节),PVST/MSTP 拆 4bit 优先级 + 12bit 扩展 ID选根 → 选 RP → 选 DP → 阻塞选路 5 步:RID → RPC → BID → PID → 本地 PID初始化阶段靠 RID 比较;正常阶段靠 RPC 比较入向累加 cost,出向不累加配置 BPDU 只有根产生,其他交换机转发Max-Age = 2*直径 + 2*3 = 20 秒,默认直径 7DP 改 Port Priority;非 DP 改 Cost
