生成树协议
生成树协议(Spanning Tree Protocol)在保证交换网络冗余性的前提下消除二层环路,是构建可靠企业网络的基础技术。
一、为什么需要生成树协议
在交换网络中,为了提供冗余、提高可靠性,通常会设计冗余链路。但二层网络中的冗余链路会引发三个严重问题:
- 广播风暴:广播帧在二层环路中形成顺时针和逆时针两个方向的无限循环,最终导致设备宕机、网络瘫痪
- MAC 地址表翻摆(漂移):同一个数据帧从不同接口反复到达,导致 MAC 地址表内容持续被覆盖
- 多帧复制:目的设备收到多份相同的帧
STP 的核心目标:在保留物理冗余的前提下,逻辑上阻塞某些端口,将网络计算为一棵无环的树。
二、STP(802.1D)基础概念
2.1 桥 ID(Bridge ID)
桥 ID 用来在同一个二层网络中唯一标识一台交换机,共 8 字节:
| 桥优先级(2 字节)| 桥 MAC 地址(6 字节)|
- 桥优先级:默认为 32768,修改时必须为 4096 的倍数,取值范围 0-61440
- 桥 MAC 地址:使用交换机背板 MAC
- 根网桥选举:拥有最小桥 ID 的交换机成为根网桥
桥优先级的前 4 个 bit 是真正的优先级,后 12 个 bit 在 MSTP 中用作扩展系统 ID 携带 Instance ID。
2.2 路径开销(Cost)
每个激活 STP 的接口都维护一个 Cost 值,主要用于计算 RPC(根路径开销):
RPC = 从根网桥到达目标节点所经过的所有接口的 Cost 数值之和
华为设备默认使用 802.1t 标准计算开销:
| 链路速率 | Cost 值 |
|---|---|
| 10 Mbps | 2000000 |
| 100 Mbps | 200000 |
| 1 Gbps | 20000 |
| 10 Gbps | 2000 |
2.3 接口 ID(Port ID)
接口 ID 共 16 bit:
| 接口优先级(4 bit)| 接口编号(12 bit)|
- 接口优先级默认 128,必须是 16 的倍数,取值范围 0-240
三、STP 工作机制
STP 整个工作流程分为四个步骤:
3.1 选举根网桥
- 选举范围:整个交换网络,有且仅有一个根网桥
- 选举规则:桥 ID 最小的设备成为根网桥
- 根网桥角色可抢占:如果新加入的设备拥有更小的桥 ID,将重新触发选举
根网桥的位置至关重要,STP 的一切工作都基于根网桥位置而定。在实际组网中,一般将汇聚层设备或网关设备定为根网桥(三点合一原则)。
3.2 选举根端口(Root Port)
在每一个非根网桥上,选举出一个最优接口成为根端口。根端口是设备上离根网桥最近的接口,负责接收 BPDU 报文。
最优 BPDU 比较原则(依次比较):
| 顺序 | 比较项 | 原则 |
|---|---|---|
| 1 | 根网桥 ID | 越小越优 |
| 2 | RPC 数值 | 越小越优 |
| 3 | 对端 BID | 越小越优 |
| 4 | 对端 PID | 越小越优 |
| 5 | 本地 PID | 越小越优 |
3.3 选举指定端口(Designated Port)
- 选举范围:每个网段中选举一个
- 规则:该网段上到达根网桥最优的接口(即发出的 BPDU 报文最优)
- 特点:根网桥上所有接口都是指定端口,指定端口负责向该网段转发 BPDU
3.4 阻塞非指定端口
除了根端口和指定端口以外的接口,在逻辑上被阻塞。被阻塞的接口:
- 不接收也不转发业务数据
- 不能发送 BPDU 报文
- 可以接收周期性 BPDU 报文(用于感知拓扑变化)
四、BPDU 报文
STP 使用 BPDU(网桥协议数据单元) 进行通信,目标组播 MAC 地址为 0180-C200-0000。
配置 BPDU
用于协商参数和保活:
| 关键字段 | 说明 |
|---|---|
| 根网桥 ID | 当前根网桥的 BID |
| RPC | 到达根网桥的开销 |
| 发送者 BID | 发送此 BPDU 的交换机 |
| 发送者 PID | 发送接口的 ID |
| 消息寿命(Message Age) | 类似 TTL,初始为 0,每经过一台交换机 +1,最大 20 |
| 最大寿命(Max Age) | 默认 20 秒,超时后认为网络故障 |
| 转发延迟(Forward Delay) | 默认 15 秒 |
TCN BPDU
拓扑变更通知 BPDU,用于在网络拓扑变化时向根网桥通告变更。
五、STP 端口状态机
STP 定义了五种端口状态:
| 状态 | 收发 BPDU | 学习 MAC | 转发数据 | 说明 |
|---|---|---|---|---|
| 阻塞(Blocking) | 可接收(不发送) | 否 | 否 | 激活 STP 后的第一个状态 |
| 侦听(Listening) | 是 | 否 | 否 | 完成所有角色选举 |
| 学习(Learning) | 是 | 是 | 否 | 构建 MAC 地址表 |
| 转发(Forwarding) | 是 | 是 | 是 | 正常转发数据 |
| 禁用(Disabled) | 否 | 否 | 否 | 管理性关闭 |
收敛时间
| 场景 | 时间 | 说明 |
|---|---|---|
| 首次收敛 | 50s | 20s MaxAge + 15s Listening + 15s Learning |
| 根网桥故障 | 50s | 同上 |
| 直连链路故障 | 30s | 交换机立即感知,直接进入 Listening(15s + 15s) |
| 非直连链路故障 | 50s | 需等待 MaxAge 超时 |
六、RSTP(802.1w)快速生成树
RSTP 解决了 STP 的三大缺陷:收敛速度慢、链路利用率低、端口角色单一。
6.1 端口角色改进
| STP 端口角色 | RSTP 端口角色 | 说明 |
|---|---|---|
| 根端口(RP) | 根端口(RP) | 保持不变 |
| 指定端口(DP) | 指定端口(DP) | 保持不变 |
| 非指定端口 | 替代端口(AP) | 根端口的备份,收到其他设备 BPDU 而被阻塞 |
| - | 备份端口(BP) | 指定端口的备份,收到自己 BPDU 而被阻塞 |
一台非根网桥只有一个根端口,替代端口可以有多个。当根端口故障,最优的替代端口立即成为新的根端口。
6.2 端口状态精简
STP 五种状态缩减为三种:
STP 状态:Blocking → Listening → Learning → Forwarding
RSTP 状态:Discarding → Learning → Forwarding
Blocking、Disabled、Listening 统一合并为 Discarding(丢弃) 状态。
6.3 P/A 机制(提议/同意)
P/A 机制是 RSTP 快速收敛的核心:
- 设备发送 P 标记位置位的 BPDU(提议),请求将接口切换为转发状态
- 对端收到后,将本地除接收接口以外的所有接口切换为丢弃状态(同步过程),确保本地无环
- 同步完成后,对端回复 A 标记位置位的 BPDU(同意),并将该接口切换为转发状态
- 上游设备收到 A 标记后,将接口切换为转发状态
逐跳执行 P/A 机制,实现秒级收敛。
6.4 边缘端口(Edge Port)
连接终端设备(PC、服务器)的端口:
- 激活后立即切换为转发状态,无需等待
- 端口 up/down 不触发拓扑变更
- 收到 BPDU 后丧失边缘端口特性,重新参与 STP 计算
6.5 STP 保护功能
| 保护类型 | 作用 | 配置命令 |
|---|---|---|
| BPDU 保护 | 边缘端口收到 BPDU 则立即关闭接口 | stp bpdu-protection |
| 根保护 | 根网桥收到更优 BPDU 时忽略,保护根桥角色 | stp root-protection |
| 环路保护 | 单向链路故障时维持阻塞状态,防止环路 | stp loop-protection |
| TC 保护 | 限制单位时间内处理 TC 报文的次数 | stp tc-protection |
七、MSTP(802.1s)多生成树协议
7.1 为什么需要 MSTP
STP/RSTP 所有 VLAN 共享一棵生成树,无法在不同 VLAN 间实现流量负载均衡,导致链路带宽利用率低。
MSTP 的核心思路:将一组 VLAN 映射到一个实例(Instance),每个实例独立计算一棵生成树,不同实例的根桥可以不同,从而实现负载均衡。
7.2 核心概念
| 概念 | 说明 |
|---|---|
| Instance ID | 12 bit,范围 0-4094;实例 0 默认存在,所有 VLAN 默认属于实例 0 |
| MSTI | 基于 Instance 的生成树实例 |
| MST 域 | 拥有相同域名、VLAN-实例映射关系、修订等级的 MSTP 交换机集合 |
| 扩展系统 ID | BID 中后 12 bit 专门用来携带 Instance ID |
7.3 MSTP 域规则
同一 MST 域的设备必须满足:
- 都启动了 MSTP 协议
- 具有相同的域名
- 具有相同的 VLAN 到实例映射关系
- 具有相同的修订等级
7.4 负载均衡设计
通过在域内不同实例中设置不同的根桥,实现 VLAN 流量分流:
实例 1(VLAN 1-10):SW1 为主根,SW2 为备根
实例 2(VLAN 11-20):SW2 为主根,SW1 为备根
VLAN 1-10 流量走 SW1,VLAN 11-20 流量走 SW2
八、配置命令实战
8.1 STP 基础配置
# 启用 STP(华为设备默认启用)
[SW] stp enable
# 设置 STP 模式
[SW] stp mode stp # STP (802.1D)
[SW] stp mode rstp # RSTP (802.1w)
[SW] stp mode mstp # MSTP (802.1s) — 华为默认
# 查看 STP 状态
display stp
display stp brief
# 查看桥 MAC 地址
display bridge mac-address
8.2 根桥控制
# 设置主根桥(优先级自动设为 0)
[SW] stp root primary
# 设置备用根桥(优先级自动设为 4096)
[SW] stp root secondary
# 手动设置优先级(步长 4096)
[SW] stp priority 8192
8.3 接口级配置
# 修改接口 Cost
[SW-GigabitEthernet0/0/1] stp cost 10000
# 修改接口优先级(步长 16)
[SW-GigabitEthernet0/0/1] stp port priority 32
# 启用边缘端口
[SW-GigabitEthernet0/0/1] stp edged-port enable
# BPDU 过滤(常与边缘端口配合使用)
[SW-GigabitEthernet0/0/1] stp bpdu-filter enable
# 修改开销算法
[SW] stp pathcost-standard dot1t
8.4 RSTP 保护功能配置
# 全局启用 BPDU 保护
[SW] stp bpdu-protection
# 接口启用根保护(指定端口上配置)
[SW-GigabitEthernet0/0/1] stp root-protection
# 接口启用环路保护
[SW-GigabitEthernet0/0/1] stp loop-protection
# TC 保护(限制 TC 报文处理次数)
[SW] stp tc-protection
[SW] stp tc-protection threshold 10
8.5 MSTP 完整配置示例
实验拓扑:
[SW1] ═══════════ [SW2] ═══════════ [SW3]
│ │
└────────────────────────────────────┘
实例 1(VLAN 1-10):SW1 为主根
实例 2(VLAN 11-20):SW2 为主根
配置步骤:
# ============ 所有交换机:创建 VLAN ============
[sw1] vlan batch 1 to 20
[sw2] vlan batch 1 to 20
[sw3] vlan batch 1 to 20
# ============ 所有交换机:配置 Trunk ============
# SW1
[sw1] interface GigabitEthernet 0/0/1
[sw1-GigabitEthernet0/0/1] port link-type trunk
[sw1-GigabitEthernet0/0/1] port trunk allow-pass vlan 1 to 20
[sw1-GigabitEthernet0/0/1] quit
[sw1] interface GigabitEthernet 0/0/2
[sw1-GigabitEthernet0/0/2] port link-type trunk
[sw1-GigabitEthernet0/0/2] port trunk allow-pass vlan 1 to 20
[sw1-GigabitEthernet0/0/2] quit
# SW2 和 SW3 类似,配置所有互联端口为 Trunk
# ============ 所有交换机:配置 MSTP ============
[sw1] stp mode mstp
[sw1] stp enable
[sw1] stp region-configuration
[sw1-mst-region] region-name HCIP
[sw1-mst-region] instance 1 vlan 1 to 10
[sw1-mst-region] instance 2 vlan 11 to 20
[sw1-mst-region] revision-level 0
[sw1-mst-region] active region-configuration
[sw1-mst-region] quit
# SW2、SW3 必须配置相同的 MST 域信息
# (region-name、instance 映射、revision-level 必须一致)
# ============ 设置各实例的根桥 ============
# SW1 作为实例 1 的根桥
[sw1] stp instance 1 root primary
[sw1] stp instance 2 root secondary
# SW2 作为实例 2 的根桥
[sw2] stp instance 2 root primary
[sw2] stp instance 1 root secondary
# ============ 验证配置 ============
display stp region-configuration
display stp instance 1 brief
display stp instance 2 brief
查看 MST 域配置:
[sw1] display stp region-configuration
Oper configuration
Format selector : 0
Region name : HCIP
Revision level : 0
Instance VLANs Mapped
0 21 to 4094
1 1 to 10
2 11 to 20
九、协议对比总结
| 特性 | STP (802.1D) | RSTP (802.1w) | MSTP (802.1s) |
|---|---|---|---|
| 收敛速度 | 慢(30-50s) | 快(秒级) | 快(秒级) |
| 端口角色 | RP / DP / Blocking | RP / DP / AP / BP | RP / DP / AP / BP |
| 端口状态 | 5 种 | 3 种 | 3 种 |
| 收敛机制 | 计时器 | P/A + 快速切换 | P/A + 快速切换 |
| 负载均衡 | 不支持 | 不支持 | 支持(多实例) |
| VLAN 感知 | 无 | 无 | 基于 Instance 管理 VLAN |
| BPDU 发送 | 仅根桥 | 所有设备 | 所有设备 |
十、STP 设计最佳实践
- 根桥位置:将汇聚层或核心层设备设为根桥,遵循”三点合一”(根桥 = 网关 = 核心设备)
- 边缘端口:所有连接终端设备的端口均应配置
stp edged-port enable - BPDU 保护:全局启用
stp bpdu-protection,防止非法交换机接入导致网络震荡 - 环路保护:在关键链路开启
stp loop-protection,防止单向链路故障引发环路 - MSTP 实例规划:合理规划 VLAN 到 Instance 的映射,实现流量的负载均衡
- 修订等级一致性:MST 域内所有设备的修订等级必须相同