一、从角色模糊到分工明确:RSTP 端口角色的革命

在上一篇文章中,我们提到 STP 只有两种端口角色:根端口(Root Port)指定端口(Designated Port)。这种二分法在面对复杂拓扑时显得力不从心——一个端口如果既不是根端口也不是指定端口,就只是一个"被阻塞的端口",交换机不知道这个阻塞端口在拓扑变化时能起到什么作用。

RSTP 将端口角色扩展为四种:

1
2
3
4
5
RSTP 端口角色
├── Root Port(根端口) — 非根桥上离根最近的端口
├── Designated Port(指定端口) — 每条链路上离根最近的端口
├── Alternate Port(替代端口) — 根端口的"备胎"
└── Backup Port(备份端口) — 指定端口的"备胎"

1.1 Alternate 端口:根端口的快速后备

Alternate 端口是 RSTP 最重要的新增角色。它的定义是:收到了来自其他交换机的更优 BPDU,但不如当前根端口优的端口。

用一个通俗的类比:

根端口是你的"正门"——通向根桥的最短路径。Alternate 端口是你的"后门"——如果你发现正门被堵了(根端口故障),你能立刻从后门出去,而不需要重新翻墙找路。

1
2
3
4
5
6
7
    [根桥]
/ \
/ \
[SW-A] [SW-B]
| |
+------+
阻塞(Alt)

在上图中,SW-A 通过直连根桥的链路作为根端口,而连接到 SW-B 的端口就成为了 Alternate 端口——它提供了一条备用的到根桥的路径。

Alternate 端口处于 Discarding(丢弃)状态,不转发用户数据,但持续监听 BPDU。一旦根端口失效,Alternate 端口可以立即切换为新的根端口并进入 Forwarding 状态——无须经历 Listening 和 Learning 的等待过程。

1.2 Backup 端口:指定端口的本地候补

Backup 端口的概念更精细:它指的是同一台交换机上的到同一网段的冗余端口。它收到了来自自己的更优 BPDU。

这在自环拓扑中很常见,例如一台交换机的两个端口通过 Hub 连接到同一个网段:

1
2
3
4
 [Switch]
/ \
/ \
[Hub 网段]

或者两台交换机之间有多条并行链路时(虽然实际部署中推荐使用链路聚合,但从协议角度 RSTP 需要处理这种情况)。

Backup 端口同样处于 Discarding 状态,当对应的指定端口失效时,Backup 端口可以立即接替。

1.3 四种角色的决策树

交换机如何决定端口的角色?以下决策流程清晰地展示了整个过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
收到 BPDU 后,比较优先级


┌─────────────┐
│ 我是根桥? │
└──────┬──────┘
是 / \ 否
/ \
▼ ▼
所有端口都是 哪个端口到根最近?
Designated │
┌───┴───┐
│ │
这个端口 其他端口
│ │
▼ ▼
Root Port 收到的 BPDU 来自谁?

┌───────┴───────┐
│ │
自己(本机) 其他交换机
│ │
▼ ▼
Backup Port Alternate Port
(若更优是 Designated)

二、端口状态的"减法"哲学:从五到三

2.1 为什么要精简

STP 的五个端口状态中,Disabled、Blocking、Listening 对用户数据的行为完全一致——都不转发、都不学习 MAC。从用户流量的角度看,区分它们没有意义。

RSTP 做了一个大胆的简化:将这些"不转发"的状态合并为一个 Discarding 状态。

1
2
3
4
5
6
7
8
9
STP 五态                  RSTP 三态
─────── ────────
Disabled ─┐
Blocking ─┤
Listening ─┼──→ Discarding(丢弃)

Learning ──┼──→ Learning (学习)

Forwarding ┘──→ Forwarding(转发)

2.2 三种状态的精确定义

状态 转发数据帧 学习 MAC 处理 BPDU 行为说明
Discarding 端口被阻塞,不参与数据转发
Learning 学习 MAC 但不转发,为转发做准备
Forwarding 正常转发数据和学习 MAC

关键洞察:Learning 状态在 RSTP 中很少被使用。在 Proposal/Agreement 机制下,端口大多数时候直接从 Discarding 跳到 Forwarding。Learning 状态仅在特定场景(如端口被配置为共享链路而非 P2P 链路)下作为安全过渡。

2.3 端口角色与状态的映射

端口角色和端口状态是两个正交的概念。角色决定了一个端口在生成树拓扑中的位置,状态决定了这个端口当前的行为

端口角色 通常状态 可否转发
Root Port Forwarding
Designated Port Forwarding
Alternate Port Discarding
Backup Port Discarding

根端口和指定端口处于 Forwarding,构成了数据转发的活跃拓扑。Alternate 和 Backup 处于 Discarding,构成了随时待命的备用拓扑

三、Proposal/Agreement:快速收敛的核心引擎

3.1 STP 的"下水道"问题

理解 STP 收敛慢的根源,我们需要回顾一个重要的细节。在 STP 中,一台交换机无法确定它下游的交换机是否已经完成了生成树计算。所以它只能"等够"计时器——Max Age + 2×Forward Delay = 50 秒——确保全网都稳定了再转发。

这好比一个管道系统:你打开了上游的水龙头,但你不知道下游的管道是否已经连接好,所以你得等足够长的时间"确保"水不会漏出来。

3.2 RSTP 的"握手确认"方案

RSTP 用一个巧妙的逐跳握手机制替代了盲目等待。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[SW1] Designated Port           [SW2] Root Port
| |
| ① Proposal(我准备好了,请求转发) |
|──────────────────────────────────>|
| |
| ② SW2 将所有非边缘端口同步阻塞 |
| (Sync 操作) |
| |
| ③ Agreement(下游已就绪,同意转发) |
|<──────────────────────────────────|
| |
| ④ SW1 将该 DP 置为 Forwarding |
|===================================> 开始转发
| |
| ⑤ SW2 继续向下游发起 Proposal |
| (递归握手,逐跳推进) |

3.3 Sync 操作:防止临时环路的关键

当 SW2 收到 Proposal 后,它执行的 Sync 操作是整个机制中最精妙的部分:

Sync 操作 = 将所有非边缘的指定端口强制进入 Discarding 状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SW2 收到 Proposal 之前:
[SW1]
| (DP, Forwarding)
[SW2]
/ \ ← 两个 DP 都在 Forwarding
/ \
[SW3] [SW4]

SW2 收到 Proposal 并执行 Sync 后:
[SW1]
| (DP, Forwarding)
[SW2]
/ \ ← 两个 DP 被 Sync,进入 Discarding
✗ ✗
[SW3] [SW4]

SW2 回复 Agreement,SW1 端口进入 Forwarding
然后 SW2 再分别向 SW3、SW4 发起 Proposal...

这种先阻塞再逐跳打开的策略,从根本上杜绝了临时环路的产生。整个过程由上游向下游逐级推进,像拉链一样稳稳当当地展开。

3.4 收敛时间分析

在最佳场景(所有链路都是 P2P 全双工链路,所有非边缘端口一次握手成功)下,RSTP 的收敛时间可以压缩到秒级:

1
2
收敛时间 ≈ 握手次数 × 单次握手延迟
≈ (拓扑直径) × (2 × 链路延迟 + BPDU 处理时间)

对于一个三层交换机组成的典型园区网(拓扑直径约为 35 跳),在 RSTP 下完成收敛通常不需要超过 **12 秒**,与 STP 的 30~50 秒相比是天壤之别。

四、边缘端口与链路类型:两把加速利器

4.1 边缘端口(Edge Port)

边缘端口连接的是终端设备(PC、服务器、打印机等),这些端口绝对不会形成环路。RSTP 为这类端口提供了特权:

  • UP 后立即进入 Forwarding 状态,无须经历任何等待
  • 端口 UP/DOWN 不触发拓扑变更(不产生 TC 消息)
  • 如果边缘端口收到了 BPDU(说明有人误接了交换机),自动丧失边缘端口身份,变回普通生成树端口

配置边缘端口是一个简单的动作,但在大规模园区网中能显著减少拓扑变更抖动:

设想一个有 2000 个终端用户的网络,如果每天有 200 台 PC 重启或开关机,在没有边缘端口的情况下,STP/RSTP 会产生 200 次拓扑变更。每次都引发全网 MAC 表刷新——这就是"风暴中的风暴"。

4.2 链路类型:P2P vs Shared

RSTP 区分两种链路类型:

链路类型 特点 Proposal/Agreement 收敛速度
P2P(点对点) 全双工链路,两端各一台交换机 ✓ 启用 (秒级)
Shared(共享) 半双工或连接 Hub,可能有多台设备 ✗ 回退到计时器 慢(与 STP 相同)

在现代网络中,几乎所有交换机之间的链路都是全双工的,RSTP 会自动识别为 P2P 链路并启用快速握手。只有在非常老旧的半双工 Hub 环境中,才会降级为传统计时器模式。

4.3 RSTP 快速收敛的四个前提条件

总结起来,RSTP 实现秒级收敛需要满足以下条件:

  1. 链路必须是 P2P 全双工 — 半双工链路回退到 STP 计时器模式
  2. 非边缘指定端口成功完成 Sync 操作 — 确保下游没有环路
  3. 对端也运行 RSTP — 与 STP 交换机对接时降级为 STP 模式
  4. 拓扑直径不宜过大 — 直径每增加一跳,握手次数就增加一次

五、拓扑变更机制的优化

5.1 STP 的"逐级上报"模式(回顾)

1
2
3
4
5
6
7
8
9
链路故障 → SW3 检测到

SW3 → SW2:发送 TCN(拓扑变更通知)

SW2 → SW1(根桥):转发 TCN

SW1 → 全网泛洪 TC

所有交换机:MAC 表老化时间 300s → 15s

5.2 RSTP 的"直接泛洪"模式

RSTP 彻底改造了这个机制:

1
2
3
4
5
6
7
8
链路故障 → SW3 检测到

SW3 → 从所有非边缘 DP 泛洪 TC 消息

所有收到 TC 的交换机:

① 刷新除收到 TC 的端口外的所有 MAC 表项
② 继续向自己的非边缘 DP 泛洪 TC

核心改进在于:

  1. 无需向根桥报告,检测到变化的交换机直接向全网泛洪 TC
  2. 泛洪范围更精确,不通过边缘端口发送(边缘端口下游是终端设备,不需要刷新)
  3. 刷新策略更激进,收到 TC 后立即清除相关 MAC 表项,而不是等待老化

这种"去中心化"的拓扑变更通知机制,使得 RSTP 在拓扑变化时能以极快的速度清除过期的 MAC 表项,减少数据帧的"走错路"时间。

六、端口状态机速览(非完整)

RSTP 的端口状态机远比 STP 复杂——802.1D-2004 标准定义了十余个子状态机协同工作。在这里我们仅梳理最核心的状态迁移关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   端口启用


Discarding ◄──────────────────┐
│ │
│ Proposal/Agreement 成功 │ 故障/阻断
│ (P2P + Sync 完成) │
▼ │
Learning ────────────────────┘

│ 短暂停留后

Forwarding

│ 收到更优 BPDU(成为 Alt/Backup)

Discarding

对于边缘端口,路径更短:

1
2
3
4
  端口启用


Forwarding(秒级!)