STP 生成树协议原理与华为交换机配置实操
一、为什么需要 STP:二层环路问题
STP(Spanning Tree Protocol,生成树协议) 用于在存在冗余链路的二层网络中,通过阻塞部分端口,把物理有环的拓扑修剪成逻辑无环的树,同时保留备份链路——故障时自动切换,实现链路冗余。
二层环路的三大危害:
- 广播风暴:以太网帧没有 TTL 字段,广播帧在环路中被交换机不断复制转发,呈指数级增长,瞬间耗尽带宽与 CPU;
- MAC 地址表震荡:同一主机的 MAC 在交换机的不同端口间反复"漂移",MAC 表不断刷新,无法正常查表转发;
- 重复帧接收:同一单播帧经多条路径到达目的地,接收方收到多份副本,上层协议状态可能错乱。
三层 IP 报文有 TTL 逐跳递减防环;而二层帧没有类似机制,环路必须靠 STP 在逻辑上"剪枝"解决。BPDU 中还携带 TC/TCN 报文用于通告拓扑变化:STP 收到后把 MAC 表老化时间缩短为 Forward Delay,RSTP/MSTP 则快速刷新 MAC 表。
二、STP(802.1D)核心概念
2.1 桥 ID 与 BPDU
| 概念 | 说明 |
|---|---|
| 桥 ID(Bridge ID) | 桥优先级(默认 32768)+ 设备 MAC 地址,全网标识一台交换机 |
| BPDU | 桥协议数据单元,目的组播地址 01-80-C2-00-00-00,每 2 秒发送一次 |
| 根桥 | 生成树的"树根",全网唯一 |
| 根端口(RP) | 非根桥上"离根最近"的端口,每台非根桥有且只有一个 |
| 指定端口(DP) | 每条链路上负责向该链路转发数据的端口,根桥所有端口都是指定端口 |
| 非指定端口 | 既非根端口也非指定端口,被逻辑阻塞(Discarding),不转发数据 |
BPDU 关键字段:根桥 ID、根路径开销、发送者桥 ID、发送端口 ID、Hello Time / Max Age / Forward Delay。
2.2 路径开销(RPC,Root Path Cost)
端口到根桥沿途开销的累加。华为交换机支持三种开销标准(stp pathcost-standard 指定,默认 dot1t):
| 端口速率 | 802.1D-1998 | 华为私有 legacy | 802.1T(默认) |
|---|---|---|---|
| 10 Mbps | 100 | 2000 | 2000000 |
| 100 Mbps | 19 | 200 | 200000 |
| 1 Gbps | 4 | 20 | 20000 |
| 10 Gbps | 2 | 2 | 2000 |
2.3 三个定时器
| 定时器 | 默认值 | 作用 |
|---|---|---|
| Hello Time | 2s | 根桥周期性发送 BPDU 的间隔 |
| Max Age | 20s | BPDU 的存活时间,超时判定上游/链路故障 |
| Forward Delay | 15s | 端口经过 Listening、Learning 状态的停留时间 |
收敛时间:端口从阻塞到转发需 Listening(15s) + Learning(15s) = 30 秒;链路故障需先等待 Max Age 感知,最坏情况 30~50 秒。
2.4 端口状态机
| 状态 | 收发 BPDU | 学习 MAC | 转发数据 |
|---|---|---|---|
| Disabled | × | × | × |
| Blocking | 只收 | × | × |
| Listening | 收发 | × | × |
| Learning | 收发 | √ | × |
| Forwarding | 收发 | √ | √ |
三、生成树选举:四步走
- 选根桥:全网比较桥 ID——优先级越小越优;优先级相同比 MAC,越小越优;
- 每台非根桥选一个根端口,依次比较:
- 根路径开销最小;
- 对端(上游)桥 ID 最小;
- 对端端口 ID 最小;
- 本端端口 ID 最小;
- 每条链路选一个指定端口:根桥端口必为指定端口;非根桥之间依次比较根路径开销 → 桥 ID → 端口 ID,最优者胜出;
- 剩余端口阻塞:既非根端口也非指定端口的端口进入 Discarding,破除环路。
判断顺序口诀:先比开销,再比桥 ID,最后比端口 ID(前一项相同才比下一项)。
四、RSTP(802.1w)快速生成树
STP 收敛太慢(30~50 秒),RSTP 通过以下机制把收敛缩短到秒级:
| 改进点 | 说明 |
|---|---|
| 端口状态简化 | 5 种 → 3 种:Discarding、Learning、Forwarding |
| 新增端口角色 | Alternate(根端口的备份)、Backup(指定端口的备份) |
| P/A 快速协商 | 握手式 Proposal/Agreement,指定端口可跳过定时器直接进入 Forwarding |
| 边缘端口 | 接终端的端口不参与计算,立即进入转发 |
| 故障快速切换 | 根端口故障时 Alternate 立即顶替,无需等待 Max Age |
RSTP 向下兼容 STP:端口收到传统 STP BPDU 后按 STP 方式慢速收敛,混用时快速特性失效,工程上应全网统一。
五、MSTP(802.1s)多生成树
RSTP 仍是"单树"——所有 VLAN 共用一棵树,备份链路完全闲置。MSTP 的核心价值:多个 VLAN 映射到多个实例,每个实例独立计算一棵树,实现负载分担。
- MST 域(Region):由三要素唯一确定——域名、修订级别、VLAN 与实例映射表;三要素完全相同才属于同一域;
- 实例(Instance):多个 VLAN 的集合;实例 0 即 CIST(公共与内部生成树),负责连通所有域;
- 华为交换机默认工作在 MSTP 模式。
六、华为交换机 STP 基础配置
6.1 全局配置
<HTSw> system-view
[SW1] stp mode mstp # 生成树模式:stp / rstp / mstp(默认 mstp)
[SW1] stp enable # 全局开启 STP(默认已开启)
# 指定根桥(推荐方式)
[SW1] stp root primary # 主根:优先级自动置 0
[SW2] stp root secondary # 备份根:优先级自动置 4096
# 或手动调整优先级(取值 0 或 4096 的倍数,范围 0~61440)
[SW1] stp priority 4096
# 网络直径联动调整三个定时器(推荐,代替手工改定时器)
[SW1] stp bridge-diameter 4 # 任意两台设备间的最大跳数手工调整定时器(单位为厘秒,一般不建议直接修改):
[SW1] stp timer hello 200 # Hello Time 2 秒
[SW1] stp timer max-age 2000 # Max Age 20 秒
[SW1] stp timer forward-delay 1500 # Forward Delay 15 秒6.2 端口级配置
[SW1] interface GigabitEthernet 0/0/1
[SW1-GigabitEthernet0/0/1] stp cost 20000 # 手工指定端口开销(干预选路)
[SW1-GigabitEthernet0/0/1] stp edged-port enable # 边缘端口(只接终端,不接交换机)
[SW1-GigabitEthernet0/0/1] quit6.3 STP 安全保护
# 边缘端口 + BPDU 保护:防私接交换机形成环路
[SW1] stp bpdu-protection # 全局开启
# 效果:边缘端口收到 BPDU 后立即 shutdown,需 undo shutdown 手工恢复
# 根保护:防止下游设备发送更优 BPDU 抢占根桥
[SW1] interface GigabitEthernet 0/0/24
[SW1-GigabitEthernet0/0/24] stp root-protection # 收到更优 BPDU 时该口进入 Discarding
[SW1-GigabitEthernet0/0/24] quit
# TC 保护:限制 TC 报文的处理频率,防拓扑变化攻击
[SW1] stp tc-protection七、MSTP 负载分担完整实验
7.1 实验拓扑
SW1(汇聚层)
/ \
GE0/0/24 ↔ GE0/0/24 GE0/0/23 ↔ GE0/0/24
/ \
SW2 ══ GE0/0/23 ↔ GE0/0/23 ══ SW3
链路 1:SW1 GE0/0/24 ↔ SW2 GE0/0/24
链路 2:SW1 GE0/0/23 ↔ SW3 GE0/0/24
链路 3:SW2 GE0/0/23 ↔ SW3 GE0/0/23
PC1(VLAN10,192.168.10.11/24)接 SW3 GE0/0/1
PC2(VLAN10,192.168.10.12/24)接 SW1 GE0/0/1
目标:
- 实例 1(VLAN10):SW1 为根,VLAN10 流量走 SW3→SW1 直连链路
- 实例 2(VLAN20):SW2 为根,VLAN20 流量走 SW3→SW2 直连链路
- 两条上联链路同时利用,实现负载分担;任一链路故障自动切换7.2 SW1 完整配置
<HTSw> system-view
[HTSw] sysname SW1
[SW1] stp mode mstp
[SW1] vlan batch 10 20
# MST 域配置(三台必须完全一致)
[SW1] stp region-configuration
[SW1-mst-region] region-name RG1
[SW1-mst-region] revision-level 1
[SW1-mst-region] instance 1 vlan 10
[SW1-mst-region] instance 2 vlan 20
[SW1-mst-region] active region-configuration # 激活域配置(必须执行)
[SW1-mst-region] quit
# 根桥角色
[SW1] stp instance 1 root primary # 实例 1 主根
[SW1] stp instance 2 root secondary # 实例 2 备根
# 互联 Trunk
[SW1] interface GigabitEthernet 0/0/24
[SW1-GigabitEthernet0/0/24] port link-type trunk
[SW1-GigabitEthernet0/0/24] port trunk allow-pass vlan 10 20
[SW1-GigabitEthernet0/0/24] quit
[SW1] interface GigabitEthernet 0/0/23
[SW1-GigabitEthernet0/0/23] port link-type trunk
[SW1-GigabitEthernet0/0/23] port trunk allow-pass vlan 10 20
[SW1-GigabitEthernet0/0/23] quit
# 终端接入(边缘端口)
[SW1] interface GigabitEthernet 0/0/1
[SW1-GigabitEthernet0/0/1] port link-type access
[SW1-GigabitEthernet0/0/1] port default vlan 10
[SW1-GigabitEthernet0/0/1] stp edged-port enable
[SW1-GigabitEthernet0/0/1] quit
[SW1] stp bpdu-protection7.3 SW2 完整配置
<HTSw> system-view
[HTSw] sysname SW2
[SW2] stp mode mstp
[SW2] vlan batch 10 20
[SW2] stp region-configuration
[SW2-mst-region] region-name RG1
[SW2-mst-region] revision-level 1
[SW2-mst-region] instance 1 vlan 10
[SW2-mst-region] instance 2 vlan 20
[SW2-mst-region] active region-configuration
[SW2-mst-region] quit
[SW2] stp instance 2 root primary # 实例 2 主根
[SW2] stp instance 1 root secondary # 实例 1 备根
[SW2] interface GigabitEthernet 0/0/24
[SW2-GigabitEthernet0/0/24] port link-type trunk
[SW2-GigabitEthernet0/0/24] port trunk allow-pass vlan 10 20
[SW2-GigabitEthernet0/0/24] quit
[SW2] interface GigabitEthernet 0/0/23
[SW2-GigabitEthernet0/0/23] port link-type trunk
[SW2-GigabitEthernet0/0/23] port trunk allow-pass vlan 10 20
[SW2-GigabitEthernet0/0/23] quit7.4 SW3 完整配置
<HTSw> system-view
[HTSw] sysname SW3
[SW3] stp mode mstp
[SW3] vlan batch 10 20
[SW3] stp region-configuration
[SW3-mst-region] region-name RG1
[SW3-mst-region] revision-level 1
[SW3-mst-region] instance 1 vlan 10
[SW3-mst-region] instance 2 vlan 20
[SW3-mst-region] active region-configuration
[SW3-mst-region] quit
# 接入层设备不指定根桥(保持默认优先级 32768)
[SW3] interface GigabitEthernet 0/0/24
[SW3-GigabitEthernet0/0/24] port link-type trunk
[SW3-GigabitEthernet0/0/24] port trunk allow-pass vlan 10 20
[SW3-GigabitEthernet0/0/24] quit
[SW3] interface GigabitEthernet 0/0/23
[SW3-GigabitEthernet0/0/23] port link-type trunk
[SW3-GigabitEthernet0/0/23] port trunk allow-pass vlan 10 20
[SW3-GigabitEthernet0/0/23] quit
[SW3] interface GigabitEthernet 0/0/1
[SW3-GigabitEthernet0/0/1] port link-type access
[SW3-GigabitEthernet0/0/1] port default vlan 10
[SW3-GigabitEthernet0/0/1] stp edged-port enable
[SW3-GigabitEthernet0/0/1] quit
[SW3] stp bpdu-protection7.5 验证
[SW1] display stp brief # 查看 CIST 各端口角色与状态
[SW3] display stp instance 1 brief # 查看实例 1 的端口角色
[SW3] display stp instance 2 brief # 查看实例 2 的端口角色
[SW1] display stp root # 查看根桥信息
[SW1] display stp region-configuration # 查看 MST 域配置
[SW1] display stp statistics # 查看 BPDU 收发统计预期结果(各链路速率相同、开销为默认值时):
- 实例 1:SW3 的根端口为 GE0/0/24(经 SW1,上游桥 ID 更优);GE0/0/23 显示 ALTE / DISCARDING(阻塞);
- 实例 2:SW3 的根端口为 GE0/0/23(经 SW2);GE0/0/24 显示 ALTE / DISCARDING(阻塞);
- PC1 ping PC2 正常通,VLAN10 流量走 SW3→SW1 直连链路。
业务连通性验证:
PC1> ping 192.168.10.12 # 通:VLAN10 经生成树转发故障切换验证:
# 断开 SW1 与 SW3 之间的链路(关闭 SW3 的 GE0/0/24 模拟)
[SW3] interface GigabitEthernet 0/0/24
[SW3-GigabitEthernet0/0/24] shutdown
[SW3-GigabitEthernet0/0/24] quit
[SW3] display stp instance 1 brief
# 预期:实例 1 的 GE0/0/23 由 ALTE/DISCARDING 切换为 ROOT/FORWARDING
# 实例 1 收敛期间 PC1 短暂丢包后恢复 ping 192.168.10.12
# 恢复链路后自动回切
[SW3] interface GigabitEthernet 0/0/24
[SW3-GigabitEthernet0/0/24] undo shutdown若要强制某链路优先使用,可手工调开销:
stp cost,开销小者优先。
八、常用查看与排错命令
| 命令 | 作用 |
|---|---|
display stp brief | 查看端口角色与状态速览(含端口角色缩写 DESI/ROOT/ALTE/BACKUP) |
display stp instance 1 brief | 查看指定实例的端口角色与状态 |
display stp root | 查看根桥信息(根桥 ID、优先级、MAC) |
display stp | 查看端口详细生成树信息(BPDU、定时器、开销) |
display stp region-configuration | 查看 MST 域配置 |
display stp statistics | 查看 BPDU 收发统计 |
排错思路:先 display stp brief 看根桥与端口角色是否符合规划 → display stp root 确认根桥位置 → 不符时检查优先级、域三要素一致性、端口开销 → 最后检查链路物理状态(display interface brief)。
九、常见问题与注意事项
- 边缘端口必须配 BPDU 保护:边缘端口不收发 BPDU 且直接转发,若用户私接交换机极易形成环路,开启
stp bpdu-protection后收到 BPDU 即 shutdown; - MST 域三要素不一致:域名、修订级别、VLAN 映射表任一不同,设备会被视为不同域并按域边界处理,无法实现预期的负载分担;
- 忘记执行 active region-configuration:域配置停留在草稿状态不生效;
- 根桥位置规划:根桥应设在汇聚/核心层高速稳定设备,避免接入层低速设备当选根桥导致流量绕路;
- 优先级取值限制:
stp priority只能配 0 或 4096 的倍数(0~61440),默认 32768; - 模式混用:与仅支持 STP 的设备对接会协商降级,失去快速收敛与多实例能力,工程上全网统一 MSTP;
- 定时器调整:一般不手工改 Hello/Max Age/Forward Delay,推荐用
stp bridge-diameter联动调整; - 配置保存:STP 配置同样需要
save持久化,否则重启丢失。
十、面试问答
- STP 的作用? 在有冗余链路的二层网络中通过阻塞部分端口构建无环树,防止广播风暴与 MAC 表震荡;链路故障时自动启用备份链路,兼顾可靠性与无环。
- 根桥如何选举? 比较桥 ID(优先级 + MAC):优先级越小越优,相同则 MAC 越小越优;华为默认优先级 32768,建议直接用
stp root primary置 0。 - 根端口与指定端口如何选举? 根端口依次比较:根路径开销 → 对端桥 ID → 对端端口 ID → 本端端口 ID;指定端口在每条链路上比较:根路径开销 → 桥 ID → 端口 ID。
- STP 与 RSTP 的区别? 收敛速度(30~50 秒 vs 秒级);端口状态(5 种 vs 3 种);RSTP 新增 Alternate/Backup 端口角色、P/A 快速协商与边缘端口机制。
- MSTP 相比 RSTP 的优势? 多个 VLAN 映射到多个实例独立计算生成树,实现 VLAN 级负载分担,备份链路不再闲置;域内独立计算、域间通过 CST 互联。
- 为什么二层需要 STP 而三层不需要? IP 报文有 TTL 逐跳递减防环;以太网帧无 TTL 字段,广播帧会在环路中无限复制,必须靠协议逻辑破环。
- 边缘端口为什么有风险?如何防护? 边缘端口不参与 STP、直接进入转发,若接了交换机可形成环路;配合全局
stp bpdu-protection,边缘口一旦收到 BPDU 立即被 shutdown 并告警。
十一、记忆技巧
- 选举四步:先选根桥 → 非根桥选根口 → 每链路选指定口 → 剩余端口全部堵;
- 比较三要素:开销 → 桥 ID → 端口 ID(依次往下比,小的胜出);
- 收敛时间:2×Forward Delay = 30 秒;故障感知再加 Max Age,最坏 50 秒;
- RSTP 三态:丢、学、转(Discarding / Learning / Forwarding);
- MST 域三要素:名字、版本、映射表(region-name / revision-level / instance-vlan 映射);
- 华为根桥两条命令:
stp root primary(优先级 0)、stp root secondary(优先级 4096); - 安全三件套:边缘端口 + BPDU 保护、根保护、TC 保护。