RSTP 的机制
什么是 RSTP 协议
2001 年,IEEE 引入了快速生成树协议(RSTP)作为IEEE 802.1w。RSTP 随后被纳入 IEEE 802.1D-2004,使原来的生成树协议(STP)标准过时。RSTP 协议被设计为向后兼容的 STP 协议。
相比 STP 协议,RSTP 协议提供了更快的收敛速度,通过引入新的收敛行为和端口角色来实现这一点。STP 协议可能需要 30 到 50 秒才能响应拓扑更改,但 RSTP 通常能够在 3 × hello 时间(默认值:3 × 2 秒)或物理链路故障后的几毫秒内响应更改。
新的端口状态
RSTP 中只剩下三个端口状态。STP 中 Disable/Blocking/Listening 状态合并为唯一的 Discarding 状态。
STP 协议 | RSTP 协议 | 端口是否包含在活跃拓扑中 | 端口是否学习 MAC 地址 |
---|---|---|---|
Disabled | Discarding | no | no |
Blocking | Discarding | no | no |
Listening | Discarding | yes | no |
Learning | Learning | yes | yes |
Forwarding | Forwarding | yes | yes |
新的端口角色
在 RSTP 中,根端口(Root Port)和指定端口(Designated port)的角色保持不变,而阻塞端口(Blocking port)的角色被拆分为替换端口(Alternate port)和备份端口 (Backup port)角色。
替换端口与备份端口
这两个端口角色对应于 STP 的 Blocking 状态。端口需要接收 BPDU 才能保持阻塞状态。为此,RSTP 引入了这两个角色。
简单地说,替换端口是根端口的备份;备份端口是指定端口的备份。
新的 BPDU 处理方式
BPDU 每 Hello 时间发送一次
BPDU 每隔一段时间就会发送一次,而不再是简单地中继。使用 STP 时,非根网桥仅在根端口上接收到 BPDU 时才生成 BPDU。网桥转发 BPDU 的次数多于实际生成的 BPDU。RSTP 并非如此。网桥每
更快的信息老化速度
在指定端口上,如果连续三次未收到 hello,则协议信息可能会立即过期(或者 max_age 过期)。由于前面提到的协议修改,BPDU 现在被用作网桥之间的保持活动机制。如果网桥连续丢失三个 BPDU,则认为它将失去与其直接邻居根或指定网桥的连接。如果网桥无法从邻居那里接收 BPDU,那么可以确定它与邻居的连接已经丢失。这与 STP 相反,在 STP 中,问题可能位于根路径上的任何位置。
接受劣质 BPDU
这个概念构成了 BackboneFast 引擎的核心。IEEE 802.1w 委员会将类似的机制纳入了 RSTP。当网桥从其指定网桥或根网桥接收到劣质信息时,它会立即接受它并替换之前存储的信息。
因为网桥 C 仍然知道根是活的,所以它会立即向网桥 B 发送一个 BPDU,其中包含有关根网桥的信息。因此,网桥 B 不会再发送自己的 BPDU,而是接受通向网桥 C 的端口作为新的根端口。
快速过渡到 Forwarding 状态
快速转换是 RSTP 引入的最重要功能。传统 STP 被动地等待网络收敛,然后再将端口转换为 Forwarding 状态。为了实现更快的收敛只能对保守的默认参数(forward delay 和 max_age 定时器)做更改,并且经常使网络的稳定性受到威胁。新的 RSTP 能够主动确认端口可以安全地过渡到 Forwarding 状态,而无需依赖任何计时器配置。为了在端口上实现快速收敛,RSTP 协议依赖于两个新变量:边缘端口(edge port)和链路类型(link type)。
边缘端口
网桥中所有直连终端的端口都无法在网络中创造环路。因此,边缘端口可以直接过渡到 Forwarding 状态,跳过 Listening 和 Learning 阶段。当链路切换时,边缘端口不会导致拓扑更改。
接收 BPDU 的边缘端口会立即失去边缘端口状态,并成为正常的 STP 端口。
链路类型
RSTP 只能在边缘端口和点对点链路上快速过渡到 Forwarding 状态。假定在全双工中运行的端口是点对点的,而默认情况下,半双工端口被视为共享端口。在当今的交换网络中,大多数链路都以全双工模式运行,并被 RSTP 视为点对点链路。这使它们成为快速过渡到转发状态的候选者。
Proposal/Agreement 机制(提议/同意机制,或简称P/A机制)
在 STP 中,网桥选择某个端口作为指定端口时,仍会等待两次 forward delay 时间(默认情况下为2 x 15),然后才能将其转换为 Forwarding 状态。
在 RSTP 中,此情况与具有指定角色但处于阻塞状态的端口相对应。下图说明了如何逐步实现快速转换。假设在根网桥和交换机 A 之间创建了一条新链路。此链路上的两个端口都置于指定的阻塞状态,直到它们从对等的端口收到 BPDU 为止。
当指定端口处于 Discarding 或 Learning 状态时(并且只有在这种情况下),它才会在其发送的 BPDU 中设置 Proposal 位。这是根网桥的端口 p0 所发生的情况,如上图的步骤 1 所示。由于交换机 A 收到高级信息,它会立即识别出 p1 是新的根端口。然后,交换机 A 开始同步(sync),以确保其所有端口均与此新信息同步。如果端口满足以下标准之一,则端口是同步的:
-
端口处于阻塞状态,意味着稳定拓扑中的 Discarding 状态。
-
端口是边缘端口。
为了说明同步机制对不同类型端口的影响,假设交换机 A 上存在替换端口 p2,指定转发端口 p3 和边缘端口 p4。请注意 p2 和 p4 已经满足其中一个条件。为了保持同步(参见上图的步骤2),交换机 A 只需阻塞端口 p3,并为其分配 Discarding 状态。既然其所有的端口都保持同步,交换机 A 就可以取消阻塞其新选择的根端口 p1 并发送 Proposal 信息以回复根网桥。(请参阅步骤 3。)此消息是 Proposal BPDU 的副本,其中设置了 Agreement 位而非 Proposal 位。这可确保端口 p0 确切地知道它接收的 Proposal 与哪个 Agreement 对应。
p0 收到该协议后,它可立即转换到 Forwarding 状态。这是上图的步骤4。请注意,同步之后,端口 p3 将继续保持指定的 Discarding 状态。在步骤 4 中,该端口所处的情况与步骤 1 中端口 p0 所处的情况完全相同。然后,它会开始向其相邻端口发出 Proposal,并且尝试快速转换到 Forwarding 状态。
由于 P/A 机制不依赖任何计时器,因此其速度非常快。此握手浪潮会快速传播到网络边缘,并在拓扑发生变化后快速恢复连接。
如果指定的 Discarding 端口在发送 Proposal 之后未收到 Agreement,它将缓慢转换到 Forwarding 状态,并退回到传统的 STP Listening/Learning 顺序。如果远端网桥不能理解 RSTP BPDU,或者如果远端网桥的端口处于阻塞状态,可能会发生这种情况。
新的拓扑更改机制
当 STP 网桥检测到拓扑更改时,它会使用可靠的机制首先通知根网桥。如下图所示:
一旦根网桥知道网络拓扑发生了变化,它就会在其发出的 BPDU 上设置 TC 标志,然后发送到网络中的所有网桥。当网桥收到设置了 TC 标志位的 BPDU 时,它会将其 MAC 地址表的老化时间缩短到 Forward delay 参数的秒数。这可以确保相对快速地刷新过期信息。此拓扑更改机制在 RSTP 中进行了很深层次的再造。
拓扑更改检测
在 RSTP 中,只有进入 Forwarding 状态的非边缘端口会导致拓扑更改。这意味着连接断开将不再视为拓扑更改,这与 STP 正好相反。当 RSTP 网桥检测到拓扑更改时,会发生以下操作:
-
如有必要,它将为其所有非边缘指定端口和根端口启动 TC While 计时器,计时器的值为 hello-time 值的两倍。只要 TC While 计时器在端口上运行,从该端口发送的 BPDU 就会设置 TC 位。当计时器处于启动状态时,会向根端口上发送 BPDU。
-
它将刷新与所有这些端口关联的 MAC 地址。
拓扑更改传播
当网桥从相邻网桥收到设置了 TC 位的 BPDU 时,会发生以下操作:
-
它将清除其所有端口(接收 TC 的端口除外)上识别的 MAC 地址。
-
它启动 TC While 计时器,并发送在所有指定端口和根端口上设置 TC 位的 BPDU(RSTP 不再使用特定的 TCN BPDU,除非传统网桥需要通知)。
这样,TCN 会快速传播到整个网络。TC 传播现在是一个单步过程。事实上,TC 的发起方会将此信息泛洪到整个网络,而 STP 则只有根网桥会泛洪此信息。此机制比 STP 的机制更快,无需等待通知根网桥,然后针对整个网络保持拓扑更改状态长达 <max age + forward delay> 秒钟。
仅在几秒钟或者几倍 hello-time 后,整个网络的 MAC 地址表中的大部分条目都将刷新。
兼容性
RSTP 可以与传统 STP 协议交互操作。但是务必注意,与传统网桥交互时,RSTP 固有的快速收敛优点将会丧失。
总结
无论在 STP 还是 RSTP 中,都不按照 VLAN 来定义端口,默认是全局定义。但是,在存在多个 VLAN 的以太网交换环境中,通常需要创建多个生成树,以便不同 VLAN 上的流量使用不同的链路。
于是,多生成树协议 (MSTP) 在 IEEE 802.1s-2002 中定义,后来合并到 IEEE 802.1Q-2005 中,它定义了对 RSTP 的扩展,以进一步开发 VLAN 的实用性。在 MSTP 下,可以为单个 VLAN 或 VLAN 组定义生成树,且 MSTP 与 RSTP 网桥完全兼容。
参考
[1] [Rapid Spanning Tree Protocol]: https://en.wikipedia.org/wiki/Spanning_Tree_Protocol#Rapid_Spanning_Tree_Protocol
[2] [Understand Rapid Spanning Tree Protocol (802.1w)]: https://www.cisco.com/c/en/us/support/docs/lan-switching/spanning-tree-protocol/24062-146.html