第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 加速接入端口收敛

思考

  1. 如果全网所有交换机的优先级都是默认值 32768,根桥是如何确定的?有什么风险?
  2. 根桥的所有端口都是指定端口吗?为什么?
  3. 如果两条到达根桥的路径开销相同,交换机如何选择根端口?请按优先级列出比较因素。

下篇预告:第17篇:STP 端口状态迁移:从 Disable 到 Forwarding