RSTP(802.1w)的诞生原因:
STP(802.1d)有很多不足之处:
- STP没有细致区分端口状态和端口角色(监听,学习,阻塞这三种状态并没有实际的区别,都不转发用户数据),不利于初学者学习及部署。另外,从使用和配置角度来讲,端口之间最本质的区别并不在于端口状态,而在于端口扮演的角色,而在STP中,根端口和指定端口既可能都处于监听,有可能处于转发状态,每一个很好的体现。
- STP算法是被动的算法,依赖定时器等待的方式判断拓扑变化,收敛速度慢。
- STP的算法要求在稳定的拓扑中,根桥主动发出配置BPDU报文,而其他设备进行处理,传遍整个STP网络。
- STP协议不能对于不同的流量进行分流,导致所有流量走向相同,一些设备负载过重,另外一些设备又没有合理利用起来。
RSTP保留了大部分STP算法的机制,同时,加入了快速收敛的机制。RSTP不像STP协议那样完全依赖于时间,RSTP会主动协商链路状况,保证链路在1s内能转发数据(使用P/A机制)。
华为的STP与标准的STP有所不同,主要在如下几点:
- 使用新的端口角色和状态(和RSTP一样)。
- RP端口失效,AP端口可立即成为新的RP端口。
- 接收到次的BPDU,端口不需要等Max Age,立即开始计算端口角色。
- 若收不到BPDU,不再使用Max Age来判定上连链路失效,三个Hello间隔后再重新收敛,检查网络故障的世界变短。
但是仍然存在的问题就是,STP算法依旧是被动的算法,拓扑收敛时间最短30s,没有从根本上改进STP。
新增改变1:新增三种端口角色
将阻塞端口重新划分为Alternate端口和Backup端口:
从配置BPDU报文发送角度来看:
• Alternate端口就是由于学习到其它网桥发送的更优配置BPDU报文而阻塞的端口。
• Backup端口就是由于学习到自己发送的更优配置BPDU报文而阻塞的端口。
从用户流量角度来看:
• Alternate端口提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口。会进行代替端口BPDU的备份,当根端口失效时,Alternate端口马上成为根端口,减少了选举的时间。
• Backup端口作为指定端口的备份,提供了另一条从根桥到相应网段的备份通路,当指定端口失效时,Backup端口马上成为指定端口,减少了选举的时间。Backup端口只能是收到了自己更优的BPDU而阻塞的端口(例如有自环的情况)。
新增加边缘端口:
STP中没有定义连接的PC机端口行为,所以每当有大量终端设备连接入或者退出STP网络都会导致网络发生过量的TC通知,交换机的MAC地址表被反复清空,过量的数据泛洪影响网络性能。
RSTP中新增加的边缘端口有如下特性:
- 边缘端口状态变化不会触发拓扑变化通知。
- 边缘端口不参与STP计算,端口启动后可以直接进入转发状态,从而跳过丢弃(Discarding)和学习(Learning)状态。
- 边缘端口会向外周期通过BPDU,但若边缘端口接收到BPDU,该端口会立即丢失边缘端口特性,切换回普通生成树端口,并根据收到的BPDU重新计算端口角色。
- P/A协商过程中,同步(Sync)过程并不会阻塞边缘端口,同时TC通知BPDU也不清空边缘。
新增改变2:重新划分端口状态
RSTP的状态规范把原来的5种状态缩减为3种。根据端口是否转发用户流量和学习MAC地址来划分:
- 如果不转发用户流量也不学习MAC地址,那么端口状态就是Discarding状态。
- 如果不转发用户流量但是学习MAC地址,那么端口状态就是Learning状态。
- 如果既转发用户流量又学习MAC地址,那么端口状态就是Forwarding状态。
RSTP计算过程:
- 端口在Discarding状态下完成端口角色的确定。
- 当端口角色确定为根端口和指定端口后,经过forwarding delay后,端口进入Learning状态,处于Learning状态的端口其处理方式和STP相同,此期间端口开始学习MAC地址并在Forwarding delay后进入Forwarding状态,开始转发数据。实际上,RSTP会通过P/A加快这个过程。
- 当端口角色确定为Alternate端口或者Backup端口后,端口会维持在Discarding状态。
新增改变3:BPDU的改变
1.格式上的改变
配置BPDU格式的改变,充分利用了STP协议报文中的Flag字段,明确了端口角色。在配置BPDU报文的格式上,除了保证和STP格式基本一致之外,RSTP作了一些小变化:
-
Type字段,配置BPDU版本字段不再是0而是2;配置BPDU type为0x02而不是STP中的0x00,所以运行STP的设备收到RSTP的配置BPDU时会丢弃。
-
Flags字段,使用了原来保留的中间6位,这样改变的配置BPDU叫做RST BPDU。RSTP中BPDU的Flag字段解释:
第0位为TC标志位,和STP相同。
第1位为Proposal标志位,该位置位表示该BPDU为快速收敛机制中的Proposal报文。
第2位和第3位为端口角色标志位,00表示端口角色为未知;01表示端口角色为根端口;10表示端口角色为Alternate或Backup端口;11表示端口为指定端口。
第4位为Learning标志位,该位置位表示端口处于Learning状态。
第5位为Forwarding标志位,该位置位表示端口处于Forwarding状态。
第6位为Agreement标志位,该位置位表示该BPDU位快速收敛机制中的Agreement报文。
第7位为TCA标志位,和STP相同,但是在RSTP中不会使用TCA报文。
2.拓扑变化时BPDU的使用变化
在RSTP中检测拓扑是否发生变化只有一个标准:一个非边缘端口迁移到Forwarding状态;普通STP中多了一个必须有指定接口的条件。
一旦检测到拓扑发生变化,将进行如下处理:(没有使用TCA BPDU和TCN BPDU)
- 本设备上发生变化后,为本交换设备的所有非边缘指定端口启动一个TC While Timer,该计时器值是Hello Time的两倍。在这个时间内,清空状态发生变化的端口上学习到的MAC地址。同时,由这些端口向外发送RST BPDU,其中TC置位。一旦TC While Timer超时,则停止发送RST BPDU。
- 其他交换设备接收到RST BPDU后,清空所有端口学习到MAC地址,除了收到RST BPDU的端口。然后也为自己所有的非边缘指定端口和根端口启动TC While Timer,重复上述过程。如此,网络中就会产生RST BPDU的泛洪。
3.配置BPDU处理上的变化
拓扑稳定后,配置BPDU报文的发送方式不同:
• 在STP中拓扑稳定后,根桥按照Hello Timer规定的时间间隔发送配置BPDU。其他非根桥设备在收到上游设备发送过来的配置BPDU后,才会触发发出配置BPDU,此方式使得STP协议计算复杂且缓慢。RSTP对此进行了改进,即在拓扑稳定后,无论非根桥设备是否接收到根桥传来的配置BPDU报文,非根桥设备仍然按照Hello Timer规定的时间间隔发送配置BPDU,该行为完全由每台设备自主进行。
BPDU超时计时:
• 如果一个端口连续3个Hello Time时间内没有收到上游设备发送过来的配置BPDU,那么该设备认为与此邻居之间的协商失败。而不像STP那样需要先等待一个Max Age(一般为20s)。
• 华为超时时间设置公式:超时时间=Hello Time x 3 x Timer Factor;Timer Factor默认为3,可以修改;所以超时时间默认为18s。
• 注意:华为STP中的超时时间并没有使用20s,而是和RSTP一样的18s。
次优BPDU的处理:
• RSTP中,当一台下游交换机从上游交换机接收到次的BPDU后(可以理解为Alternate端口、Backup端口和根接口收到次优BPDU),并不是等待端口缓存的BPDU的Max Age超时,而是立刻接收,并重新计算端口角色,这可加快收敛速度。并且这里重新收敛的时候可以使用P/A机制,加快速度。
• STP中,阻塞接口或根接口收到了次优BPDU,只有等待老化变为指定接口才进行处理。
说明:当任何一台交换机的根端口消失,同时没有AP端口,此时交换机会置其他所有端口为DP端口角色,并产生自己的BPDU。
新增改变4:P/A机制(RSTP的核心机制)
P/A机制的前提: 链路为P2P全双工,而如果不是P2P类型,例如共享链路,则使用类似于STP的依靠timer的收敛机制。只有在P2P全双工的情况下,DP/discarding才能在发送的BPDU中置A位,否则对方RP端口不会回复Agreement BPDU。一旦P/A协商不成功,指定端口的选择就需要等待两个Forward Delay,协商过程与STP一样。
目的: 使一个指定端口尽快进入Forwarding状态。
涉及报文:
Proposal(提议请求):当一个指定端口处于Discarding或Learning状态时,proposal变量置位,并向下游桥设备传递Flags字段Proposal标志位置1的PST BPDU,请求快速切换到Forwarding状态。
Proposed(提议采纳):当对端的根端口收到以上Proposal标志为1的RST BPDU时,proposed变量置位。该变量指示本网段网的指定端口希望尽快进入Forwarding状态。
Sync(同步请求):当根端口的proposed变量置位后会依次为本桥上的其他端口使sync变量置位,使所有非边缘端口都进入Discarding状态,准备重新同步。
Synced(同步完成):当所有非边缘端口进入到Discarding状态后会将自己的synced变量置位,包括本桥上的其他所有Alternate端口、Backup端口和边缘端口,实施同步操作。此时,根端口最后也会将自己的synced变量置位,转换为forwarding状态,表示本桥上已正式完成同步操作,向上游设备传回Agreement标志1的RST BPDU。
Agreed(提议确认):当原来想要进入转发状态的上游设备指定端口接收到对端根端口发来的一个Agreement RST BPDU时,则此指定端口的agreed变量被置位。Agreed变量一旦被置位,则该指定端口马上转入Forwarding状态。
新链路连接成功后,P/A机制协商过程如下:
- p0和p1两个端口马上都先成为指定端口,发送Proposal置位的RST BPDU。
- S2的p1口收到更优的RST BPDU,马上意识到自己将成为根端口,而不是指定端口,停止发送RST BPDU。(如果自己更优先,则仍然为指定接口,对方为根端口,进行同样进行P/A协商)
- S1的p0进入Discarding状态(这是所有接口的初始的状态),于是发送的RST BPDU中把proposal置1。
- S2收到根桥发送来的携带proposal的RST BPDU,开始将自己的所有端口进入sync变量置位。
- p2已经阻塞,状态不变;p4是边缘端口,不参与运算;所以只需要阻塞非边缘指定端口p3。(阻塞的目的是保证RP进入Forwarding时没有环路存在)
- p2、p3、p4都进入Discarding状态之后,各端口的synced变量置位,根端口p1的synced也置位,并转移到Forwarding状态,于是便向S1返回Agreement位置位的回应RST BPDU。该RST BPDU携带和刚才根桥发过来的BPDU一样的信息,Agreement位置置位1(Proposal位清零)。
- 当S1判断出这是对刚刚发出的Proposal的回应,于是端口p0马上进入Forwarding状态。(指定端口几乎瞬间变为转发状态,但是不能帮助根端口迅速进入转发状态)
- 下行被阻塞的指定接口继续通过P/A机制向下传递,可以看出来P/A机制是渐进式的,逐段从根桥向网络边缘扩散。如下图所示:
增强方式:
增强方式适用于不同厂商设备之间的P/A协商,与普通P/A算的不同主要在于,当提议报文到达下游非同一厂商设备时,下游设备的根端口不能马上进入转发状态,必须上游设备先发送一个Agreement报文后根端口才能被强制转换为转发状态。
注意点1: PA机制使用与根端口与指定接口之间,往往到了最后一步收敛的接口为阻塞和指定接口,通过计时器进行收敛,经历两个Forward Delay。如下图所示:
当SW2、SW3与SW1完成P/A机制后,SW2和SW3之间的便不会进行PA机制了。因为SW3与SW2的接口不是根端口,而都是指定端口,不能算作SW2的下游设备,不需要与SW2之间通过P/A机制进行收敛。
注意点2: P/A机制仅发生在P2P全双工链路上,如果是半双工链路,DP端口发送的BPDU由于没有Proposal置位导致下游RP端口无法触发同步,所以下游RP端口和上游DP端口都经历2的Forwad Delay而进入Forwarding状态。
注意点3: P/A机制使用时,交换机之间一定要是P2P链路(不能2个以上交换机连HUB),否则会出现短暂环路。如下图:
Port B 一直是discarding,SW1,SW2,SW3,SW4间是forwarding。SW5刚接入网络,认为自己是根桥,发送以自己为根桥的配置BPDU,SW4的PortB先收到,发现没有自己的优,先与SW5的PortC进行了P/A,转为了forwarding状态。这时候产生了环路。只有等待SW1的PortA发送的更优的BPDU到达SW4后,PortB才重新变为discarding状态。
RSTP和STP的兼容性:
正常情况下运行STP的设备会忽略RSTP报文,而RSTP设备收到了STP报文后,可以在2个hello Time时间后,把自己切换为STP工作模式,实现兼容,但是也就是失去的快速收敛的功能。
RSTP保护功能(内容中涉及了一点关于MSTP的知识):
图片来自:https://zhuanlan.zhihu.com/p/143587852
1. BPDU保护功能
对于接入层设备,接入端口一般直接与用户终端(如PC机)或文件服务器相连,此时接入端口被设置为边缘端口以实现这些端口的快速迁移;当这些端口接收到配置消息(BPDU报文)时系统会自动将这些端口设置为非边缘端口,重新计算生成树,引起网络拓扑的震荡。这些端口正常情况下应该不会收到生成树协议的配置消息。如果有人伪造配置消息恶意攻击交换机,就会引起网络震荡。BPDU保护功能可以防止这种网络攻击。
当端口被配置为边缘端口或非边缘端口时,该端口在所有生成树实例上都被设置为边缘端口或非边缘端口。如果交换机使能了BPDU 保护,当被设置为边缘端口收到来自用户的BPDU 报文,则该边缘端口会被关闭(error-down,可以设置自动恢复,会在接口上自动形成一个shutdown的命令),或者网络管理员能将它重新打开。缺省情况下,交换机所有以太网端口均被配置为非边缘端口。
2. Root保护功能
生成树的根桥及备份交换机应该处于同一个域内,特别是对于CIST的根桥和备份交换机,由于网络设计时一般会把CIST的根桥和备份交换机放在一个高带宽的核心域内。但是由于维护人员的错误配置或网络中的恶意攻击,网络中的合法根桥有可能会收到优先级更高的配置消息,这样当前根桥会失去根桥的地位,引起网络拓扑结构的错误变动。这种不合法的变动,会导致原来应该通过高速链路的流量被牵引到低速链路上,导致网络拥塞。Root保护功能可以防止这种情况的发生。(不会将接口down掉,只会让他变为discarding状态)
需要注意的是,根保护只能在DP端口配置有效,RP和AP端口不配置根保护。
3. 环路保护功能
依靠不断接收上游交换机发送的BPDU,交换机可以维持根端口和其他阻塞端口的状态。但是由于链路拥塞或者单向链路故障,这些端口会收不到上游交换机的BPDU。此时下游交换机会重新选择端口角色,收不到BPDU的下游桥端口会转变为指定端口,而阻塞端口会迁移到转发状态,从而交换网络中会产生环路。环路保护功能会抑制这种环路的产生。
对于配置了环路保护的端口,当接收不到上游交换机发送的BPDU,环路保护生效时,如果该端口参与了STP计算,则不论其角色如何,该端口上的所有实例将一直被设置为Discarding状态,并不灵活。
4. 防止TC-BPDU报文攻击的保护功能
交换机在接收到TC-BPDU报文后,会执行MAC地址表项和ARP表项的删除操作。在有人伪造TC-BPDU报文恶意攻击交换机时,交换机短时间内会收到很多的TC-BPDU报文,频繁的删除操作给交换机带来很大负担,给网络的稳定带来很大隐患。
防止TC-BPDU报文攻击的保护功能使能后,交换机在收到TC-BPDU报文后的一定时间内,只进行规定次数的删除操作,同时监控该时间段内是否收到TC-BPDU报文。如果在该时间段内收到了TC-BPDU报文,则交换机在该时间超时后再进行一次删除操作。这样可以避免频繁的删除MAC地址表项和ARP表项。
5.BPDU过滤
对于运行生成树协议的园区网络,边缘端口不再参与生成树技术,但端口仍然为发送BPDU报文,这可能导致BPDU报文发送到其他网络,引起其他网络震荡。BPDU-filter特性可使端口不收不发,过滤BPDU报文。
BDDU过滤不推荐过多使用,因为无法解决自环的问题,交换机的接口一直处于转发状态,如下图:
参考资料:华为HCIE培训资料,有错误的地方请指正。