RSTP
STP太辣鸡了,所以就有STP的升级版,RSTP。 RSTP对原有的STP协议进行了更加细致的修改和补充。
STP算法是被动的算法,依赖定时器等待的方式判断拓扑变化,收敛速度慢。STP算法要求在稳定的拓扑中,根桥主动发出配置BPDU报文,而其他设备进行处理,传遍整个STP网络。这也是导致拓扑收敛慢的主要原因之一




RSTP对STP的改进

RSTP的端口角色共有4种:根端口、指定端口、Alternate端口和Backup端口。
根端口跟指定端口继续沿用STP的概念不改变。
从配置BPDU报文发送角度来看:
- Alternate端口就是由于学习到其它网桥发送的配置BPDU报文而阻塞的端口。
- Backup端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口。
从用户流量角度来看:
- Alternate端口提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口。
- Backup端口作为指定端口的备份,提供了另一条从根桥到相应网段的备份通路。

不得不佩服研发协议的人,端口角色真他妈有逻辑性。。。。。。。。。
端口状态的重新划分
RSTP的状态规范把原来的5种状态缩减为3种。根据端口是否转发用户流量和学习MAC地址来划分:
- 如果不转发用户流量也不学习MAC地址,那么端口状态就是Discarding状态。
- 如果不转发用户流量但是学习MAC地址,那么端口状态就是Learning状态。
- 如果既转发用户流量又学习MAC地址,那么端口状态就是Forwarding状态。
P/A的快速收敛

其目的是使一个指定端口尽快进入Forwarding状态。由于有来回确认机制和同步变量机制,就无需依靠计时器来保障无环。

阶段一:设备刚刚启动, RSTP协议刚刚启用,所有交换机都认为自己是根桥,向其他交换机发送P置位的BPDU ,并把发送P消息的端口变成DP口,同时接口处在Discarding状态。
阶段二:交换机SWA收到SWB和SWC的P消息会置之不理,因为他的桥优先级最高。交换机SWB和SWC收到SWA的P消息后,由于认同SWA是最优的根桥,会根据P/A协商流程回复A消息,并把发送端口变成RP端口,同时接口处在Forwarding状态。
阶段三: SWA与SWB , SWA与SWB的P/A协商已经完成,接下来是SWB和SWC的P/A协商。SWB和SWC都会发送根桥为SWA的P消息给对方。SWC收到SWB的P消息后,发现P消息里虽然根桥和自己认可的一样,但是发送者的桥优先级比自己高(SWB> SWC) ,所有马上停止发送P消息,但是由于已经有端口是RP口,也不会回A消息。SWB收到SWC的P消息后,发现P消息里虽然根桥和自己认可的一样,但是发送者的桥优先级比自己低(SWB> SWC) ,会不停的发送P消息。以上状态在等待2个Forward Delay时间后, SWB端口为DP端口,处在Forwarding状态,SWC端口为AP端口,处在Discarding状态。际上SWB与SWC之间的协商等同于退回到STP的模式,但是反正是Discarding状态,根本不影响其他业务转发。
“发起请求-回复同意”(P/A机制)这种确认机制,由于每个步骤有确认就不需要依赖计时器来保证网络拓扑无环才去转发,只需要考虑BPDU发送报文并计算无环拓扑的时间(一般都是秒级)。
配置BPDU的处理发生变化
- 拓扑稳定后,配置BPDU报文的发送方式 拓扑稳定后,根桥按照Hello Timer规定的时间间隔发送配置BPDU。其他非根桥设备在收到上游设备发送过来的配置BPDU后,才会触发发出配置BPDU,此方式使得STP协议计算复杂且缓慢。RSTP对此进行了改进,即在拓扑稳定后,无论非根桥设备是否接收到根桥传来的配置BPDU报文,非根桥设备仍然按照Hello Timer规定的时间间隔发送配置BPDU,该行为完全由每台设备自主进行。

- 更短的BPDU超时计时 如果一个端口在超时时间(超时时间=Hello Time × 3 × Timer Factor)内没有收到上游设备发送过来的配置BPDU,那么该设备认为与此邻居之间的协商失败。而不像STP那样需要先等待一个Max Age。(这个机制跟路由选择协议一样,hello超时是本地概念)
- 处理次等BPDU 当一个端口收到上游的指定桥发来的RST BPDU报文时,该端口会将自身存储的RST BPDU与收到的RST BPDU进行比较。 如果该端口存储的RST BPDU的优先级高于收到的RST BPDU,那么该端口会直接丢弃收到的RST BPDU,立即回应自身存储的RST BPDU。当上游设备收到下游设备回应的RST BPDU后,上游设备会根据收到的RST BPDU报文中相应的字段立即更新自己存储的RST BPDU。 由此,RSTP处理次等BPDU报文不再依赖于任何定时器通过超时解决拓扑收敛,从而加快了拓扑收敛。

快速收敛
- 根端口快速切换机制 如果网络中一个根端口失效,那么网络中最优的Alternate端口将成为根端口,进入Forwarding状态。因为通过这个Alternate端口连接的网段上必然有个指定端口可以通往根桥。 这种产生新的根端口的过程会引发拓扑变化

- 边缘端口的引入 在RSTP里面,如果某一个指定端口位于整个网络的边缘,即不再与其他交换设备连接,而是直接与终端设备直连,这种端口叫做边缘端口。 边缘端口不参与RSTP运算,可以由Disable直接转到Forwarding状态,且不经历时延,就像在端口上将STP禁用。但是一旦边缘端口收到配置BPDU,就丧失了边缘端口属性,成为普通STP端口,并重新进行生成树计算,从而引起网络震荡。

保护功能
- BPDU保护,在交换设备上,通常将直接与用户终端(如PC机)或文件服务器等非交换设备相连的端口配置为边缘端口。正常情况下,边缘端口不会收到RST BPDU。如果有人伪造RST BPDU恶意攻击交换设备,当边缘端口接收到RST BPDU时,交换设备会自动将边缘端口设置为非边缘端口,并重新进行生成树计算,从而引起网络震荡。 交换设备上启动了BPDU保护功能后,如果边缘端口收到RST BPDU,边缘端口将被error-down,但是边缘端口属性不变,同时通知网管系统。


- 根保护,由于维护人员的错误配置或网络中的恶意攻击,网络中合法根桥有可能会收到优先级更高的RST BPDU,使得合法根桥失去根地位,从而引起网络拓扑结构的错误变动。这种不合法的拓扑变化,会导致原来应该通过高速链路的流量被牵引到低速链路上,造成网络拥塞。 对于启用Root保护功能的指定端口,其端口角色只能保持为指定端口。一旦启用Root保护功能的指定端口收到优先级更高的RST BPDU时,端口状态将进入Discarding状态(不转发流量),不再转发报文。在经过一段时间(通常为两倍的Forward Delay),如果端口一直没有再收到优先级较高的RST BPDU,端口会自动恢复到正常的Forwarding状态。
- ( Root保护功能只能在指定端口上配置生效。 )


- 环路保护,在运行RSTP协议的网络中,根端口和其他阻塞端口状态是依靠不断接收来自上游交换设备的RST BPDU维持。当由于链路拥塞或者单向链路故障导致这些端口收不到来自上游交换设备的RST BPDU时,此时交换设备会重新选择根端口。原先的根端口会转变为指定端口,而原先的阻塞端口会迁移到转发状态,从而造成交换网络中可能产生环路。

在启动了环路保护功能后,如果根端口或Alternate端口长时间收不到来自上游设备的BPDU报文时,则向网管发出通知信息(此时根端口会进入Discarding状态,角色切换为指定端口),而Alternate端口则会一直保持在阻塞状态(角色也会切换为指定端口),不转发报文,从而不会在网络中形成环路。直到链路不再拥塞或单向链路故障恢复,端口重新收到BPDU报文进行协商,并恢复到链路拥塞或者单向链路故障前的角色和状态。( 环路保护功能只能在根端口或Alternate端口上配置生效。 )
防TC-BPDU攻击, 交换设备在接收到TC BPDU报文后,会执行MAC地址表项和ARP表项的删除操作。如果有人伪造TC BPDU报文恶意攻击交换设备时,交换设备短时间内会收到很多TC BPDU报文,频繁的删除操作会给设备造成很大的负担,给网络的稳定带来很大隐患。启用防TC-BPDU报文攻击功能后,在单位时间内,交换设备处理TC BPDU报文的次数可配置。如果在单位时间内,交换设备在收到TC BPDU报文数量大于配置的阈值,那么设备只会处理阈值指定的次数。对于其他超出阈值的TC BPDU报文,定时器到期后设备只对其统一处理一次。这样可以避免频繁的删除MAC地址表项和ARP表项,从而达到保护设备的目的。


RSTP收敛过程举例1
Proposal/Agreement机制,其目的是使一个指定端口尽快进入Forwarding状态,根桥S1和S2之间新添加了一条链路。在当前状态下,S2的另外几个端口p2是Alternate端口,p3是指定端口且处于Forwarding状态,p4是边缘端口。

新链路连接成功后,P/A机制协商过程如下:
- p0和p1两个端口马上都先成为指定端口,发送RST BPDU。
- S2的p1口收到更优的RST BPDU,马上意识到自己将成为根端口,而不是指定端口,停止发送RST BPDU。
- S1的p0进入Discarding状态,于是发送的RST BPDU中把proposal和Agreement置1。
- S2收到根桥发送来的携带proposal的RST BPDU,开始将自己的所有端口进入sync变量置位。
- p2已经阻塞,状态不变;p4是边缘端口,不参与运算;所以只需要阻塞非边缘指定端口p3。
- 各端口的synced变量置位后,p2、p3进入Discarding状态,p1进入Forwarding状态并向S1返回Agreement位置位的回应RST BPDU。
- 当S1判断出这是对刚刚发出的Proposal的回应,于是端口p0马上进入Forwarding状态。
事实上对于STP,指定端口的选择可以很快完成,主要的速度瓶颈在于:为了避免环路,必须等待足够长的时间,使全网的端口状态全部确定,也就是说必须要等待至少一个Forward Delay所有端口才能进行转发。而RSTP的主要目的就是消除这个瓶颈,通过阻塞自己的非根端口来保证不会出现环路。而使用P/A机制加快了上游端口转到Forwarding状态的速度。
RSTP拓扑变化处理
在RSTP中检测拓扑是否发生变化只有一个标准:一个非边缘端口迁移到Forwarding状态。
一旦检测到拓扑发生变化,将进行如下处理:
- 为本交换设备的所有非边缘指定端口和根端口启动一个TC While Timer,该计时器值是Hello Time的两倍。 在这个时间内,清空所有端口上学习到的MAC地址。 同时,由非边缘指定端口和根端口向外发送RST BPDU,其中TC置位。一旦TC While Timer超时,则停止发送RST BPDU。
- 其他交换设备接收到RST BPDU后,清空所有端口学习到MAC地址,除了收到RST BPDU的端口。然后也为自己所有的非边缘指定端口和根端口启动TC While Timer,重复上述过程。



RSTP收敛过程举例2

RSTP收敛遵循STP基本原理。网络初始化时,网络中所有的RSTP交换机都认为自己是“根桥”,并设置每个端口为指定端口。此时,端口为Discarding状态。

每个认为自己是“根桥”的交换机生成一个RST BPDU报文来协商指定网段的端口状态,此RST BPDU报文的Flags字段里面的Proposal位需要置位。当一个端口收到RST BPDU报文时,此端口会比较收到的RST BPDU报文和本地的RSTBPDU报文。如果本地的RST BPDU报文优于接收的RSTBPDU报文,则端口会丢弃接收的RSTBPDU报文,并发送Proposal置位的本地RSTBPDU报文来回复对端设备。

交换机使用同步机制来实现端口角色协商管理。当收到Proposa置位并且优先级高的BPDU报文时,接收交换机必须设置所有下游指定端口为Discarding状态。如果下游端口是Alternate端口或者边缘端口,则端口状态保持不变。上图说明了下游指定端口暂时迁移到Discarding状态的情形,因此,P/A进程中任何帧转发都将被阻止。

当确认下游指定端口迁移到Discarding状态后,设备发送RST BPDU报文回复上游交换机发送的Proposal消息。在此过程中,端口已经确认为根端口,因此RST BPDU报文Flags字段里面设置了Agreement标记位和根端口角色。

在P/A进程的最后阶段,上游交换机收到Agreement置位的RST BPDU报文后,指定端口立即从Discarding状态迁移为Forwarding状态。然后,下游网段开始使用同样的P/A进程协商端口角色。