第16篇:STP 生成树协议原理——根桥、根端口、指定端口选举

一、写在前面

上一篇文章我们看到了环路有多可怕——广播风暴让全网瘫痪。那怎么既保留冗余链路(万一一条断了还有备胎),又避免环路呢?

STP(Spanning Tree Protocol,生成树协议) 就是干这个的:

STP 通过逻辑阻塞某些端口,把环形拓扑"剪"成一个无环的树形拓扑,同时保留冗余链路作为备份。


二、STP 的核心思想

2.1 树 vs 环

      环                         树
  ┌───A───┐                  A(根桥)
  │       │                  │
  B───C───D                  B    C
        │                     │    │
        E                      D───E
                          (C↔D 某条链路被阻塞)

STP 的核心就是在网络中选出一棵"树",多余的链路逻辑上阻塞,只留一条最优路径。

2.2 三个选举步骤

STP 通过三步选举计算出树:

步骤 选举什么 谁能当选
1 根桥(Root Bridge) 桥 ID 最小的交换机
2 根端口(Root Port) 每台非根桥上到根桥最近的端口
3 指定端口(Designated Port) 每条链路上离根桥更近的端口

最终的端口角色:Root Port + Designated Port 转发(Forwarding),其他端口阻塞(Blocking)。


三、关键参数

3.1 桥 ID(Bridge ID)

桥 ID 是交换机在 STP 中的"身份证":

桥 ID = 桥优先级(2 字节) + MAC 地址(6 字节)
  • 优先级范围:0~65535(默认 32768
  • 优先级步长:4096(华为只能配置 4096 的倍数)
  • 桥优先级越高(数值越小),越可能成为根桥

3.2 路径开销(Path Cost)

路径开销衡量到达根桥的距离:

链路速率 STP 开销(802.1D) RSTP 开销(802.1t)
10 Mbps 100 2,000,000
100 Mbps 19 200,000
1 Gbps 4 20,000
10 Gbps 2 2,000

端口开销 = 端口所在链路的标准开销值。 路径开销 = 从本设备到根桥沿途端口开销之和。

3.3 端口 ID(Port ID)

当桥优先级和路径开销都相同时比较:

端口 ID = 端口优先级(1 字节) + 端口号(1 字节)
  • 端口优先级默认 128(范围 0~240,步长 16)
  • 端口号是物理端口编号

四、STP 选举过程详解

用下面的拓扑来说明:

          [SW-A] Priority=8192, MAC=AAAA
         G0/0/1        G0/0/2
           │ 100M        │ 100M
           │              │
        G0/0/1          G0/0/1
          [SW-B]         [SW-C]
       Priority=32768  Priority=32768
       MAC=BBBB        MAC=CCCC
         G0/0/2
           │ 1G
           │
         G0/0/2
          [SW-D]
       Priority=32768
       MAC=DDDD

第 1 步:选举根桥

所有交换机通过交换 BPDU 报文,比较桥 ID:

交换机 优先级 MAC 桥 ID(越小越优)
SW-A 8192 AAAA 8192.AAAA ← 最小!
SW-B 32768 BBBB 32768.BBBB
SW-C 32768 CCCC 32768.CCCC
SW-D 32768 DDDD 32768.DDDD

结果:SW-A 成为根桥(Root Bridge)。

第 2 步:选举根端口(每台非根桥)

根端口是每台非根桥上到达根桥路径开销最小的端口。

计算路径开销:

设备 端口 到根桥路径 路径开销 结论
SW-B G0/0/1 SW-B→SW-A 19(100M) 最小 → 根端口
SW-B G0/0/2 SW-B→SW-D→SW-C→SW-A 19+4+19=42 更大
SW-C G0/0/1 SW-C→SW-A 19(100M) 最小 → 根端口
SW-D G0/0/2 SW-D→SW-B→SW-A 4+19=23 最小 → 根端口
SW-D 间接 SW-D→SW-C→SW-A 19+4=23 相等(比较端口 ID)→ G0/0/2 更小

注意:SW-D 两个路径开销都是 23(D→B→A 和 D→C→A),此时比较: - 对端桥 ID(B vs C):32768.BBBB < 32768.CCCC → B 更优 - 所以走 B 路径的 G0/0/2 成为根端口

第 3 步:选举指定端口(每条链路)

每条链路上,离根桥更近的端口成为指定端口。

链路 候选 A 候选 B 谁更近 指定端口
SW-A↔SW-B SW-A(A 自己就是根桥) SW-B(非根桥) SW-A G0/0/1 on SW-A
SW-A↔SW-C SW-A(根桥) SW-C(非根桥) SW-A G0/0/2 on SW-A
SW-B↔SW-D SW-B(根桥距离=0+19) SW-D(根桥距离=4+19=23) SW-B G0/0/2 on SW-B
SW-C↔SW-D SW-C(根桥距离=0+19) SW-D(根桥距离=4+19=23) SW-C G0/0/1 on SW-C

最终端口角色

交换机 端口 角色 状态
SW-A(根桥) G0/0/1 Designated Forwarding
SW-A(根桥) G0/0/2 Designated Forwarding
SW-B G0/0/1 Root Forwarding
SW-B G0/0/2 Designated Forwarding
SW-C G0/0/1 Root Forwarding
SW-C G0/0/2 阻塞(Alternate) Blocking ← 冗余链路被阻塞
SW-D G0/0/2 Root Forwarding
SW-D G0/0/1 阻塞(Alternate) Blocking

结果:SW-C↔SW-D 的链路被阻塞,环被打破,形成树形拓扑。


五、STP 定时器

定时器 默认值 作用
Hello 时间 2 秒 根桥发送 BPDU 的间隔
Max Age 20 秒 设备等待 BPDU 超时(10 个 Hello)
Forward Delay 15 秒 端口状态迁移的等待时间

六、BPDU 报文

STP 通过 BPDU(Bridge Protocol Data Unit) 报文通信:

Protocol ID (2B) = 0x0000 Version (1B) = 0x00 Message Type (1B) = 0x00 Flags (1B) Root Bridge ID (8B) Root Path Cost (4B) Bridge ID (8B) Port ID (2B) ...

根桥每 2 秒发送一次 BPDU,非根桥收到后计算并转发 BPDU。


七、思考

  1. 根桥是怎么选出来的?桥 ID 由哪两部分组成?
  2. 一台交换机优先级设为 4096,另一台是默认值 32768,谁的桥 ID 更小?谁会成为根桥?
  3. 根端口和指定端口的选举前提各是什么?
  4. 在一条链路上,如果两端交换机的路径开销相同,怎么决定指定端口?
  5. 逻辑阻塞的端口在链路故障时会发生什么变化?
  6. STP 的 Forward Delay 为什么需要 15 秒?为什么不能直接切换到转发状态?

下篇预告:第17篇《STP端口状态迁移_从Disable到Forwarding》——理解STP端口状态从Disable到Forwarding的完整迁移过程。