Skip to content

0. 课件来源

本节在 HCIA STP 基础上,深入讲解 STP 的 选路原则完整推导、BPDU 结构、计时器、拓扑变更机制(TCN),为理解 RSTP / MSTP 快速切换原理打基础。


1. STP 协议全景

协议标准优点缺点
STP802.1D(CST)无环、冗余、最优路径不能负载、切换 30''~50''
PVST(思科私有)Per-VLAN STP无环、冗余、最优路径、负载、部分快速切换vlan 过多时资源消耗大
RSTP802.1W无环、冗余、快速切换 0''、最优路径不能负载
MSTP802.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,人工不可改
text
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 + MAC32768 + vlan20 + MAC 才不同。


3. STP 端口角色

角色数据BPDU说明
DP(Designated,指定端口)收发每段链路最优端口
RP(Root,根端口)收发非根上到根最优端口
阻塞端口不收发既非 RP 又非 DP

4. STP 选举完整流程

4.1 三步法

  1. 选根(ROOT):整个交换网络 BID 最小的交换机
  2. 选 RP:非根交换机上到根最优(BPDU 最小)的端口
  3. 选 DP:每段链路上最优端口;既非 RP 又非 DP 的端口被阻塞

4.2 初始化阶段(存 → 比 → 发)

步骤一:存 — 保存最优 BPDU 每段链路互发 BPDU,按选路原则比较,每个接口保存"最优 BPDU"(最小):

  • 若交换机所有接口保存的都是自己的 BPDU → 我是 ROOT
  • 若部分接口保存的是对方的 BPDU → 我是 nonROOT

步骤二:比 — 计算累加(选举 RP) 非根交换机选举 RP:去往根最优(BPDU 最小)的端口。入向累加 Cost,出向不累加

text
以 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 选路原则(必背)

顺序字段作用阶段
1RID选举根
2RPC(Root Path Cost)正常阶段选举 RP
3BID(发送方桥 ID)默认随机选举一个
4PID(发送方端口 ID)前面选不出来时随机
5本地 PID前面选不出来时随机

5. BPDU 结构

STP BPDU 封装在 802.3 以太帧中:

  • DMAC = 0180-C200-0000(所有交换机侦听的组播 MAC),收后不转发
  • LLC Type = 0x4242,标识是 STP BPDU,提交给 STP 进程
text
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

  • STPBPDU Type = 00(Configuration),80(TCN)
  • RSTP / MSTPVersion = 02,使用统一的 RSTP/MSTP BPDU,Type = 02

6. STP 计时器

计时器默认值说明
Hello2 秒(200 厘秒)根发送配置 BPDU 周期
Max-Age20 秒(2000 厘秒)BPDU 老化时间
Forward-Delay15 秒(1500 厘秒)Listening→Learning、Learning→Forwarding 延时

⚠️ 关键认知

  • 配置 BPDU 只有根能产生,其他非根交换机只能转发。
  • 因此 计时器只能在根上修改 才能让整个 STP 网络生效,非根上改不生效(会被根同步覆盖)。
  • Max-Age = 2 * 7 + 2 * 3 = 20 秒,默认 STP 拓扑最大 7 层(直径)。

6.1 修改计时器的两种方法

text
# 方法 1:直接在根上修改
stp timer hello 200
stp timer max-age 2000
stp timer forward-delay 1500

# 方法 2:修改 STP 直径(华为会按直径自动计算 timer)
stp bridge-diameter 7   # 取值 2-7,默认 7

7. 端口状态与切换时间

状态行为停留时间
Disable没插线
Blocking阻塞,收 BPDU
Listening选举端口角色,不转发数据15 秒
Learning学习 MAC 构建表15 秒
Forwarding转发

7.1 不同故障的切换时间

故障类型切换时间说明
物理接口 down-up30 秒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 流程

text
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 大调(修改根)

text
# 方法 1:改 BID 优先级
stp priority 0

# 方法 2:配主根和备份根(前提:其他 SW 都是默认值)
SW1: stp root primary        # priority = 0
SW2: stp root secondary      # priority = 4096

9.2 微调(不改变根)

调整对象在哪改生效条件
Cost非 DP(根端口)入向累加,改非根生效
Port PriorityDP(指定端口)改根/上游 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 条

  1. BID = 优先级(2字节) + MAC(6字节),PVST/MSTP 拆 4bit 优先级 + 12bit 扩展 ID
  2. 选根 → 选 RP → 选 DP → 阻塞
  3. 选路 5 步:RID → RPC → BID → PID → 本地 PID
  4. 初始化阶段靠 RID 比较;正常阶段靠 RPC 比较
  5. 入向累加 cost,出向不累加
  6. 配置 BPDU 只有根产生,其他交换机转发
  7. Max-Age = 2*直径 + 2*3 = 20 秒,默认直径 7
  8. DP 改 Port Priority;非 DP 改 Cost
真人撰写written by human