STP(Spanning Tree Protocol)是生成树协议,主要作用是防止交换网络中的冗余链路形成环路工作。
STP协议虽然能够解决环路问题,但是由于网络拓扑收敛较慢,影响了用户通信质量,而且如果网络中的拓扑结构频繁变化,网络也会随之频繁失去连通性,从而导致用户通信频繁中断,这也是用户无法忍受的。由于STP的不足,IEEE于2001年发布的802.1w标准定义了RSTP。RSTP在STP基础上进行了诸多改进优化,使得协议更加清晰、规范,同时也实现了二层网络拓扑的快速收敛。
STP存在的问题:
1.STP从初始状态到完全收敛至少需经过30s:初始状态下,交换机都认为自己是根桥,所以每个端口都会往外发送BPDU报文,这个BPDU报文里面携带了报文的优先级,开销值等一些参数,同时每一个交换机也会从对端的接口里接收到对方的BPDU,接收之后,进行一个比较,计算,确定谁是根桥,确定各个端口的端口角色,在这个过程中, 交换机会从listening到learning需要等待一个forward delay(每个15s),STP为避免临时环路,必须等待足够长的时间(即确保BPDU能同步发送至全网各节点)确保全网的端口状态全部确定,才能进入转发。确定全网状态之后,在STP进入转发前还需根据收到的用户流量构建MAC地址表,仍需等待计时器超时(forward delay:15s)才能进入转发,交换机的端口状态会从learning到forwarding状态(岗前培训),初始状态下,收敛速度需要至少30秒;
2.交换机有BP端口,RP端口down掉场景下,其BP端口切换成RP端口并进入转发状态至少需要经过30s:如下图所示,交换机C上的根端口坏掉了,对于交换机C来说,它是可以直接感知到的,那么就会将自身的BP转化成RP,为确保拓扑变化信息已经扩散到全网,且所有设备都已完成拓扑更新,故新的根端口还需等待计时器超时后才能进入转发,原来的阻塞端口(BP)变成新的根端口,且处于blocking状态,并经过2个Forward Delay时间(30s)才进入转发状态,
3.交换机无BP端口,RP端口down掉场景,
如下图所示:交换机B上只有DP和RP,但是现在SWB上的根端口(RP)down了,那么对于SWB来说,它和根桥的联系就断了,所以交换机B会向外发送一个BPDU,它会认为自己是根桥,发送给SWC之后,但是对于交换机C来说,它会认为SWA是根桥,但是对于SWC来说又不能告诉SWB,SWA才是根桥,等到,交换机C上端口缓存的更优的BPDU老化超时(20s),在STP中,交换机除指定端口外的其他端口收到次优BPDU都不会做处理 ,端口缓存的BPDU超时后,会重新进入收敛,等待2个Forward Delay (30S)时间后进入转发状态,这个过程一共需要50秒。
4.运行STP的交换机连接用户终端的场景
在STP里面,不管是什么端口,想要进入转发状态就必须等待两次延时,(每次15秒,共30秒)防止端口直接进入转发状态,会发生环路,那么对于交换机连接终端的链路进入转发需要经过30s,事实上,只要保证该端口下连接的是终端设备就不会出现环路,即没有必要进行STP计算和等待计时器超时,对于交换机来说,只要意识到某个端口连接的是主机终端设备的话,那么这个端口就不会发生环路,直接进入转发状态就行了,但是在APT里面没有这个机制。
5.STP的拓扑变更机制
在STP里面,如果拓扑发生变化,先由变更点朝根桥方向发送TCN消息,收到该消息的上游交换机就会回复TCA消息进行确认;最后TCN消息到达根桥后,再由根桥发送TC消息通知设备删除桥MAC地址表项,只有根桥才能发送TA消息,其他交换机在收到根桥的消息之后,才会清空mac地址表项,机制复杂,效率低下。
6.端口角色
在STP里面有根端口,指定端口,和备份端口,只有三种端口角色,当交换机上的的RP端口down掉后,还需要从其他三个端口中重新选举且需等待计时器超时后才能进入转发。
7.端口状态
对于STP来说有五种状态,在这五种状态里面针对数据流量来说,Disabled、Blocking和Listening这三种状态是既不转发用户流量也不学习mac地址,对应的行为都是一样的,所以,可以把这三种状态合并为一个状态,在RSTP里面就是这样做的。
STP端口状态 | 端口状态对应的行为 |
Disabled | 不转发用户流量也不学习MAC地址 |
Blocking | |
Listening | |
Learning | 不转发用户流量但是学习MAC地址 |
Forwarding | 既转发用户流量又学习MAC地址 |
RSTP对STP的改进
RSTP定义了两种新的端口角色:备份端口(Backup Port)和预备端口(Alternate Port),如下图所示:
对于预备端口和备份端口来说,这两种端口都是处于阻塞状态的,都是不能转发流量的,那么预备端口是根端口的替代端口,备份端口是指定端口的备份端口,如果这个端口的最优BPDU是从对方那里收到的,那么这个端口就是预备端口,那么如果收到的最优BPDU是来自于本身交换机的另外一个接口,那么这个端口就是备份端口,如上图所示,交换机C的根端口从根桥那里收到了一个最优的BPDU,做了一个更新之后,从E0/1接口发了出去,但是由于下端连的设备是HUB,那么这个BPDU又会从E0/2的接口发送回去,那么对于SWC来说,他从E0/2这个端口收到的BPDU就是它本身的BPDU,那么E0/2这个端口就是备份端口。
端口状态的重新划分
RSTP的状态规范把原来的5种状态缩减为3种:
STP端口状态 | RSTP端口状态 | 端口状态对应的行为 |
Disabled | Discarding | 如果不转发用户流量也不学习MAC地址,那么端口状态就是Discarding状态。 |
Blocking | ||
Listening | ||
Learning | Learning | 如果不转发用户流量但是学习MAC地址,那么端口状态就是Learning状态。 |
Forwarding | Forwarding | 如果既转发用户流量又学习MAC地址,那么端口状态就是Forwarding状态。 |
从用户角度来讲,Listening、Learning和Blocking状态并没有区别,都同样不转发用户流量。
RSTP里面把这个Disabled,Blocking,listening三种状态合并成了一种状态Discarding状态,这个状态下是不处理用户流量的,但是会转发和发送BPDU,在STP里面,listening状态对于BPDU是可收可发的,Blocking状态下只能收,不能往外发,那么在RSTP里面,因为合并了这三种状态,所以是可收可发的。
P/A机制
P/A机制主要是为了解决初始状态下,交换网络收敛慢的问题。
P:proposal 请求
A:agreement 同意
Proposal/Agreement机制,其目的是使一个指定端口尽快进入Forwarding状态。
这个P位和A位在BPDU报文里面的flag字段里面,把之前在STP里面没有用上的位利用上了。
P/A机制的工作原理,如下图所示:
在交换网络的初始状态下,对于图中的SWA和SWB都会认为主机是这个交换网络里的老大(根桥),都会往外去发送P置位的BPDU报文,表示我可以让我的这个端口进入转发状态吗?那么往外发送BPDU的这个端口,就是指定端口了,当二者在收到对方的BPDU报文之后,会进行一个比较,比较桥优先级,在这里,桥优先级值越小越优先,对于上图中的SWA来说,它的桥优先级值是0,而SWB的优先级值是4096,那么对于这两个交换机来说,SWB就知道SWA要比它本身更优,SWA是根桥,那么对于SWA来说,就会忽略SWB的BPDU报文,那么对于SWB来说,原来的指定端口就会变成一个根端口,并且阻塞除了边缘端口外的其他端口,防止出现环路,并且会给SWA回复一个A置位的BPDU,表示,你可以让你的这个端口进入转发状态了。当SWA的这个端口收到这个A置位的BPDU之后,就会立马进入转发状态。
事实上对于STP,指定端口的选择可以很快完成,主要的速度瓶颈在于:为了避免环路,必须等待足够长的时间,使全网的端口状态全部确定,也就是说必须要等待至少两个Forward Delay,所有端口才能进行转发。由于有来回确认机制和同步变量机制,就无需依靠计时器来保障无环。(BPDU两秒发送一次)
那么在实际的应用中,P/A机制是怎么应用的呢?
如下图所示,
实际上SWB与SWC之间的协商等同于退回到STP的模式,但是反正是Discarding状态,根本不影响其他业务转发。
RSTP选举原理和STP本质上相同:选举根交换机-选举非根交换机上的根端口-选举指定端口-选举预备端口和备份端口。但是RSTP在选举的过程中加入了“发起请求-回复同意”(P/A机制)这种确认机制,由于每个步骤有确认就不需要依赖计时器来保证网络拓扑无环才去转发,只需要考虑BPDU发送报文并计算无环拓扑的时间(一般都是秒级)。
P/A机制要求两台交换设备之间链路必须是点对点的全双工模式。一旦P/A协商不成功,指定端口的选择就需要等待两个Forward Delay,协商过程与STP一样。可以通过在接口视图下配置:stp point-to-point force-true 来修改
根端口快速切换机制
如下图所示,0SWC与SWA的直连链路down掉,其AP端口切换成RP端口并进入转发状态可在秒级时间内完成收敛:
次等BPDU处理机制
如下图所示:SWB与SWA的直连链路down掉,SWC的AP端口切换成DP端口并进入转发状态可在秒级时间内完成:
假设作为根桥的SWA,和SWB之间的链路Down掉了,那么对于SWB来说,就会往外武器发送一个Proposal位置1的BPDU,那么对于SWC来说,AP端口虽然处于Discarding状态,但是它是可以接收和发送BPDU的,它在收到 次优BPDU后会马上发送本地最优的BPDU给对端,同时端口角色从AP变更为DP,这个BPDU里面的P位也是置1的,SWB收到更优的BPDU,会立即重新定义端口角色,将原DP端口改为RP端口,然后发送Agreement置位的BPDU,SWC收到Agreement报文后会立即进入转发。
边缘端口的引入
在RSTP中,交换机连接终端的链路可立即进入转发状态:如果交换机的对端设备连接的是终端设备的话,那么终端设备是不会造成环路的,所以我们可以把终端设备和交换机之间的端口定义为新的概念,叫做边缘端口,对于这个边缘端口一上线,就会进入转发状态,没有延时,如果边缘端口收到了BPDU的报文,那么对于这个边缘端口来说,就不能立马进入转发状态,因为有可能会造成环路,就会成为普通的STP端口,并且重新进行生成树的计算。
边缘端口的角色不是交换机和交换机之间协商出来的,而是通过人为设置出来的,所以, 只能通过给端口通过命令敲进去告诉交换机这个端口是边缘端口。
拓扑变更机制的优化
判断拓扑变化唯一标准:一个非边缘端口迁移到Forwarding状态。
如下图所示,SWE在向外发送TC置位的RST的BPDU的时候,对于SWB来说,在收到了SWE的TC置位的RST的BPDU之后,会对除了收到SWE报文的接口以外的接口还有边缘端口的mac地址表都清零,SWB也会往外去扩散这个TC置位的RST BPDU,把该清空的mac地址表都清空掉,
网络发生拓扑变化时,变更点交换机直接向全网发送TC置位的BPDU报文,而不是先通知到根桥,然后由根桥向全网发送TC报文,这样在一定程度上节省了收敛时间 。
拓扑变化引发的问题
如下图所示,每个设备上的mac地址表都已经学习好了,那么现在网络中的PCB想要去访问PCA,根据mac地址表项,SWC会把数据交给SWA,SWA会把数据交给SWB,但是由于SWB上的RP端口Down掉了,所以流量会被丢弃,那么针对这个拓扑变化,PCB的流量就不能正常去访问PCA。
那么对于这种问题,该如何解决?如下图所示,
如下图所示, SWC在收到TC置位的BPDU之后,会清空除了收到报文外的其他所有非边缘端口学到的mac地址,
同样的SWA在收到TC置位的BPDU报文之后,也会有相同的动作,如下图所示。
注意:边缘端口down掉不会触发拓扑变更,而且故障恢复后,同样也不会触发拓扑变更。
BPDU保护
应用场景:防止有人伪造RST BPDU恶意攻击交换设备,当边缘端口接收到该报文时,会自动设置为非边缘端口,并重新进行生成树计算,引起网络震荡,如下图所示:黑客在边缘端口接入一台运行生成树的交换机,新接入的交换机发送BPDU报文会引起其他交换机进行生成树计算,并引起网络震荡,边缘端口收到BPDU会自动将其设置为非边缘端口,并重新进行生成树计算,对于其他的设备来说,收到了新的BPDU报文之后,会重新进行生成树计算,那么在这个过程中,会有短暂的时间,网络的动荡的。
实现原理:配置BPDU保护功能后,如果边缘端口收到BPDU报文,边缘端口将会被立即关闭,立刻被关闭就意味着不会参与生成树的计算,不参与生成树的计算就不会让交换网络发生动荡,如下图所示,
如果这个接进来的交换机是攻击者的交换机,那么这个BPDU保护是非常有效的,但是如果是一个真正的,有用处的交换机,那么这个交换机就被拒绝了参与生成树的计算, 所以要预先做好规划,如果这个端口后期需要接入交换机,那你就不要在这个接口上配置BPDU保护。
根保护
应用场景:由于维护人员的错误配置或网络中的恶意攻击,网络中合法根桥有可能会收到优先级更高的RST BPDU,使得合法根桥失去根地位,从而引起网络拓扑结构的错误变动,如下图所示,SWA是根桥,然后这边新接入了一个优先级更优的交换机,由于交换机在选举的时候,是抢占机制,对于其他的交换机来说,收到了更优的RST BPDU,重新进行生成树计算,这样的话,会引起网络拓扑结构的错误变动,
那么针对以上的情景,我们可以通过在指定端口上配置根保护,来解决以上问题。
实现原理:一旦启用Root保护功能的指定端口收到优先级更高的RST BPDU时,端口状态将进入Discarding状态,不再转发报文。在经过一段时间,通常为两倍的Forward Delay,如果端口一直没有再收到优先级较高的RST BPDU,端口会自动恢复到正常的Forwarding状态,如下图所示,
TC-BPDU泛洪保护
如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/b887032ffe5877c96cbd678cef320663.png)
RSTP配置如下:
LSW1上的配置如下:
stp enable
开启生成树协议,对于华为的新款交换机来说,这个生成树协议是缺省开启的,但是对于一些老的设备,需要手动开启
stp mode rstp 将生成树的协议模式改为快速生成树
stp root primary 将这台交换机设备强制性的设置为根桥
stp tc-protection 使能交换设备对TC类型BPDU报文的保护功能。缺省情况下,交换设备的TC保护功能处于去使能状态。
LSW2上的配置如下:
stp enable
stp mode rstp
stp bpdu-protection 在全局开启BPDU防护,配合边缘端口一起使用
interface GigabitEthernet 0/0/1
stp edged-port enable 配置端口为边缘端口
interface GigabitEthernet0/0/3
stp root-protection 在指定端口下,配置根保护
LSW3上的配置:
stp enable
stp mode rstp
stp bpdu-protection
interface GigabitEthernet 0/0/3
stp edged-port enable
结果验证:
在LSW1上查看生成树信息,如下图所示:
在LSW2和LSW3上查看接口信息,如下图所示,会看到BPDU和根保护的配置。