STP/RSTP/MSTP总结
STP/RSTP/MSTP总结
YangSTP
以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路,引发广播风暴以及MAC地址表不稳定等故障现象,从而导致用户通信质量较差,甚至通信中断。为解决交换网络中的环路问题,提出了生成树协议STP(Spanning Tree Protocol)。
与众多协议的发展过程一样,生成树协议也是随着网络的发展而不断更新的,从最初的IEEE 802.1D中定义的STP到IEEE 802.1W中定义的快速生成树协议RSTP(Rapid Spanning Tree Protocol),再到最新的IEEE 802.1S中定义的多生成树协议MSTP(Multiple Spanning Tree Protocol)。
生成树协议中,MSTP兼容RSTP、STP,RSTP兼容STP。
生成树协议 | 特点 | 应用场景 |
---|---|---|
STP | 形成一棵无环路的树,解决广播风暴并实现冗余备份。收敛速度较慢。 | 无需区分用户或业务流量,所有VLAN共享一棵生成树。 |
RSTP | 形成一棵无环路的树,解决广播风暴并实现冗余备份。收敛速度快。 | |
MSTP | 形成多棵无环路的树,解决广播风暴并实现冗余备份。收敛速度快。多棵生成树在VLAN间实现负载均衡,不同VLAN的流量按照不同的路径转发。 | 需要区分用户或业务流量,并实现负载分担。不同的VLAN通过不同的生成树转发流量,每棵生成树之间相互独立。 |
产生背景
1.广播风暴
根据交换机的转发原则,如果交换机从一个端口上接收到的是一个广播帧,或者是一个目的MAC地址未知的单播帧,则会将这个帧向除源端口之外的所有其他端口转发(泛洪)。如果交换网络中有环路,则这个帧会被无限转发,此时便会形成广播风暴,网络中也会充斥着重复的数据帧。
SWB,SWA和SWC也会将此帧转发到除了接收此帧的其他所有端口,结果此帧又会被再次转发给SWB,这种循环会一直持续,于是便产生了广播风暴。交换机性能会因此急速下降,并会导致业务中断。
2.MAC地址表震荡
交换机是根据所接收到的数据帧的源地址和接收端口生成MAC地址表项的。
(1)主机A向外发送一个单播帧,假设此单播帧的目的MAC地址在网络中所有交换机的MAC地址表中都暂时不存在。SWB收到此数据帧之后,在MAC地址表中生成一个MAC地址表项:
SWB的MAC地址表 | |
---|---|
MAC地址 | 端口 |
00-05-06-07-08-AA | GE0/0/3 |
将其从G0/0/1和G0/0/2端口转发。此例仅以SWB从G0/0/1端口转发此帧为例进行说明。
(2)SWA接收到此帧后,由于MAC地址表中没有对应此帧目的MAC地址的表项,所以SWA会将此帧从G0/0/2转发出去。
(3)SWC接收到此帧后,由于MAC地址表中也没有对应此帧目的MAC地址的表项,所以SWC会将此帧从G0/0/2端口发送回SWB,也会发给主机B。
(4)SWB从G0/0/2接口接收到此数据帧之后,会在MAC地址表中删除原有的相关表项,生成一个新的表项:
SWB的MAC地址表 | |
---|---|
MAC地址 | 端口 |
00-05-06-07-08-AA | GE0/0/3 |
00-05-06-07-08-AA | GE0/0/2 |
此过程会不断重复,从而导致MAC地址表震荡。
STP基本概念
根桥
树形的网络结构必须有树根,于是STP引入了根桥(Root Bridge)概念。
对于一个STP网络,根桥在全网中只有一个,它是整个网络的逻辑中心,但不一定是物理中心。根桥会根据网络拓扑的变化而动态变化。
网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他设备收到该配置BPDU后,如果优先级比自己的配置BPDU高,则非根桥设备会根据收到的配置BPDU中携带的信息更新自己STP端口存储的配置BPDU信息,否则会丢弃该配置BPDU。
BID:桥ID
IEEE 802.1D标准中规定BID是由16位的桥优先级(Bridge Priority)与桥MAC地址构成。BID桥优先级占据高16位,其余的低48位是MAC地址。
在STP网络中,桥ID最小的设备会被选举为根桥。
PID:端口ID
PID由两部分构成的,高4位是端口优先级,低12位是端口号。
PID只在某些情况下对选择指定端口有作用。
桥优先级:0-65535,默认32768,必须是4095倍数
端口优先级:0-240,默认128,步长16,必须是16的倍数
选举过程
1.选举根桥(BID=优先级+MAC,优先级越小越优,如果优先级相等,MAC小的成为根桥)
在一个交换网络中选举一个根桥
2.选举根端口(RPC小的优+上行交换机的BID+上行交换机的PID+本地PID)
在每个非根交换机选举一个根端口
3.选举指定端口(RPC小的优+本端口的BID+本端口的PID)
每个网段选举一个指定端口
4.阻塞非指定端口
阻塞交换机上的所有非根,非指定端口
端口状态 | 目的 | 说明 |
---|---|---|
Forwarding | 端口既转发用户流量也处理BPDU报文。 | 只有根端口或指定端口才能进入Forwarding状态。 |
Learning | 设备会根据收到的用户流量构建MAC地址表,但不转发用户流量。 | 过渡状态,增加Learning状态防止临时环路。 |
Listening | 确定端口角色,将选举出根桥、根端口和指定端口。 | 过渡状态。 |
Blocking | 端口仅仅接收并处理BPDU,不转发用户流量。 | 阻塞端口的最终状态。 |
Disabled | 端口不仅不处理BPDU报文,也不转发用户流量。 | 端口状态为Down。 |
对于STP,影响端口状态和端口收敛有以下3个参数。
Hello Time(2s)
运行STP协议的设备发送配置消息BPDU的时间间隔,用于设备检测链路是否存在故障。设备每隔Hello Time时间会向周围的设备发送hello报文,以确认链路是否存在故障。
当网络拓扑稳定之后,该计时器的修改只有在根桥修改后才有效。新的根桥会在发出的BPDU报文中填充适当的字段以向其他非根桥传递该计时器修改的信息。但当拓扑变化之后,TCN BPDU的发送不受这个计时器的管理。
Forward Delay(15s)
设备状态迁移的延迟时间。链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新配置消息无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成临时环路。为此,STP采用了一种状态迁移机制,新选出的根端口和指定端口要经过2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息传遍整个网络,从而防止了临时环路的产生。30s
Forward Delay Timer指一个端口处于Listening和Learning状态的各自持续时间,默认是15秒。即Listening状态持续15秒,随后Learning状态再持续15秒。这两个状态下的端口不转发用户流量,这正是STP用于避免临时环路的关键。
Max Age(20s)
端口的BPDU报文老化时间,可在根桥上通过命令人为改动老化时间。
Max Age通过配置BPDU报文的传输,可保证Max Age在整网中一致。运行STP协议的网络中非根桥设备收到配置BPDU报文后,报文中的Message Age和Max Age会进行比较:
- 如果Message Age小于等于Max Age,则该非根桥设备继续转发配置BPDU报文。
- 如果Message Age大于Max Age,则该配置BPDU报文将被老化。该非根桥设备直接丢弃该配置BPDU,可认为网络直径过大,导致根桥连接失败。
如果配置BPDU是根桥发出的,则Message Age为0。否则,Message Age是从根桥发送到当前桥接收到BPDU的总时间,包括传输延时等。实际实现中,配置BPDU报文经过一个桥,Message Age增加1。
STP报文格式
- 配置BPDU是一种心跳报文,只要端口使能STP,则配置BPDU就会按照Hello Time定时器规定的时间间隔从指定端口发出。
- TCN BPDU是在设备检测到网络拓扑发生变化时才发出。
通常所说的BPDU报文多数指配置BPDU。
在初始化过程中,每个桥都主动发送配置BPDU。在网络拓扑稳定以后,每台设备的指定端口都会周期性的发送配置BPDU。配置BPDU的长度至少要35个字节,包含了桥ID、路径开销和端口ID等参数。只有当发送者的BID或端口的PID两个字段中至少有一个和本桥接收端口不同,BPDU报文才会被处理,否则丢弃。这样避免了处理和本端口信息一致的BPDU报文。
配置BPDU在以下3种情况下会产生:
- 只要端口使能STP,则配置BPDU就会按照Hello Time定时器规定的时间间隔从指定端口发出。
- 当根端口收到配置BPDU时,如果优先级比自己的配置BPDU高,则会根据收到的配置BPDU中携带的信息更新自己STP端口存储的配置BPDU信息并从指定接口向下游发送,否则会丢弃该配置BPDU。
- 当指定端口收到比自己差的配置BPDU时,会立刻向下游设备发送自己的BPDU。
STP拓扑变更
- 在网络拓扑发生变化后,下游设备会不间断地向上游设备发送TCN BPDU报文。
- 上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文。其它端口也有可能收到TCN BPDU报文,但不会处理。
- 上游设备会把配置BPDU报文中的Flags的TCA位设置1,然后发送给下游设备,告知下游设备停止发送TCN BPDU报文。
- 上游设备复制一份TCN BPDU报文,向根桥方向发送。
- 重复步骤1、2、3、4,直到根桥收到TCN BPDU报文。
- 根桥把配置BPDU报文中的Flags的TC位置1后发送,通知下游设备直接删除桥MAC地址表项。
详情请看STP拓扑变更机制 | 沃德发 (yangzhiyu.top)
STP故障收敛时间
sw1的fa0/1的接口down了,但是它还是可以从block端口中接收到sw0的bpdu,那么它与root的联系就没有断开,它此时做的操作是根据根桥发送的bpdu重新计算根端口,然后经历30s的收敛,将fa0/2变为根端口。
sw2的fa0/2断开down了,我们知道block端口时不会对bpdu进行发送的,于是fa0/1就相当于与root断开了,一段时间后,他就会从fa0/1发送自己是根桥的bpdu,但是sw1是不会理睬的,因为它知道sw0的bpdu才是最好的,因为sw0的bpdu中的根桥ID的优先级是最高的, 经过20s后,sw1的fa0/2因为没有从swfa0/1上接收到bpdu,所以它会将端口转换为指定端口将bpdu信息进行转发,这个过程大概50s。
RSTP
IEEE于2001年发布的802.1w标准定义了快速生成树协议RSTP(Rapid Spanning Tree Protocol),该协议基于STP协议,对原有的STP协议进行了更加细致的修改和补充。
STP协议虽然能够解决环路问题,但是由于网络拓扑收敛慢,影响了用户通信质量。如果网络中的拓扑结构频繁变化,网络也会随之频繁失去连通性,从而导致用户通信频繁中断,这是用户无法忍受的。
STP的不足之处如下:
STP没有细致区分端口状态和端口角色,不利于初学者学习及部署。
网络协议的优劣往往取决于协议是否对各种情况加以细致区分。
从用户角度来讲,Listening、Learning和Blocking状态并没有区别,都同样不转发用户流量。
从使用和配置角度来讲,端口之间最本质的区别并不在于端口状态,而是在于端口扮演的角色。
根端口和指定端口可以都处于Listening状态,也可能都处于Forwarding状态。
STP算法是被动的算法,依赖定时器等待的方式判断拓扑变化,收敛速度慢。
STP算法要求在稳定的拓扑中,根桥主动发出配置BPDU报文,而其他设备进行处理,传遍整个STP网络。
这也是导致拓扑收敛慢的主要原因之一。
端口改进
根据STP的不足,RSTP删除了3种端口状态,新增加了2种端口角色
RSTP的端口角色共有5种:根端口、指定端口、Alternate端口、Backup端口和Disable端口。
从配置BPDU报文发送角度来看:
- Alternate端口就是由于学习到其它网桥发送的配置BPDU报文而阻塞的端口。
- Backup端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口。
从用户流量角度来看:
- Alternate端口提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口。
- Backup端口作为指定端口的备份,提供了另一条从根桥到相应网段的备份通路。
给一个RSTP域内所有端口分配角色的过程就是整个拓扑收敛的过程。
RSTP的状态规范把原来的5种状态缩减为3种。根据端口是否转发用户流量和学习MAC地址来划分:
- 如果不转发用户流量也不学习MAC地址,那么端口状态就是Discarding状态。
- 如果不转发用户流量但是学习MAC地址,那么端口状态就是Learning状态。
- 如果既转发用户流量又学习MAC地址,那么端口状态就是Forwarding状态。
STP端口状态 | RSTP端口状态 | 端口在拓扑中的角色 |
---|---|---|
Forwarding | Forwarding | 包括根端口、指定端口 |
Learning | Learning | 包括根端口、指定端口 |
Listening | Discarding | 包括根端口、指定端口 |
Blocking | Discarding | 包括Alternate端口、Backup端口 |
Disabled | Discarding | 包括Disable端口 |
配置BPDU的处理发生变化
拓扑稳定后,配置BPDU报文的发送方式
拓扑稳定后,根桥按照Hello Timer规定的时间间隔发送配置BPDU。其他非根桥设备在收到上游设备发送过来的配置BPDU后,才会触发发出配置BPDU,此方式使得STP协议计算复杂且缓慢。RSTP对此进行了改进,即在拓扑稳定后,无论非根桥设备是否接收到根桥传来的配置BPDU报文,非根桥设备仍然按照Hello Timer规定的时间间隔发送配置BPDU,该行为完全由每台设备自主进行。
更短的BPDU超时计时
如果一个端口在超时时间(超时时间=Hello Time × 3 × Timer Factor)内没有收到上游设备发送过来的配置BPDU,那么该设备认为与此邻居之间的协商失败。而不像STP那样需要先等待一个Max Age。(6s)
处理次等BPDU
当一个端口收到上游的指定桥发来的RST BPDU报文时,该端口会将自身存储的RST BPDU与收到的RST BPDU进行比较。
如果该端口存储的RST BPDU的优先级高于收到的RST BPDU,那么该端口会直接丢弃收到的RST BPDU,立即回应自身存储的RST BPDU。当上游设备收到下游设备回应的RST BPDU后,上游设备会根据收到的RST BPDU报文中相应的字段立即更新自己存储的RST BPDU。
由此,RSTP处理次等BPDU报文不再依赖于任何定时器通过超时解决拓扑收敛,从而加快了拓扑收敛。
快速收敛(P/A机制)
当一个端口被选举成为指定端口之后,在STP中,该端口至少要等待一个Forward Delay(Learning)时间才会迁移到Forwarding状态。而在RSTP中,此端口会先进入Discarding状态,再通过Proposal/Agreement机制快速进入Forward状态。这种机制必须在点到点全双工链路上使用。Proposal/Agreement机制简称P/A机制
Proposal/Agreement机制,其目的是使一个指定端口尽快进入Forwarding状态。如图1所示,根桥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置1。
- S2收到根桥发送来的携带proposal的RST BPDU,开始将自己的所有端口进入sync变量置位。
- p2已经阻塞,状态不变;p4是边缘端口,不参与运算;所以只需要阻塞非边缘指定端口p3。
- 各端口的synced变量置位后,p2、p3进入Discarding状态,p1进入Forwarding状态并向S1返回Agreement位置位的回应RST BPDU。
- 当S1判断出这是对刚刚发出的Proposal的回应,于是端口p0马上进入Forwarding状态。
下游设备继续执行P/A协商过程。
事实上对于STP,指定端口的选择可以很快完成,主要的速度瓶颈在于:为了避免环路,必须等待足够长的时间,使全网的端口状态全部确定,也就是说必须要等待至少一个Forward Delay所有端口才能进行转发。而RSTP的主要目的就是消除这个瓶颈,通过阻塞自己的非根端口来保证不会出现环路。而使用P/A机制加快了上游端口转到Forwarding状态的速度。
保护功能
保护功能 | 场景 | 原理 |
---|---|---|
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端口长时间收不到来自上游的RST BPDU时,则向网管发出通知信息(如果是根端口则进入Discarding状态)。而阻塞端口则会一直保持在阻塞状态,不转发报文,从而不会在网络中形成环路。直到根端口或Alternate端口收到RST BPDU,端口状态才恢复正常到Forwarding状态。说明:环路保护功能只能在根端口或Alternate端口上配置生效。 |
防TC-BPDU攻击 | 交换设备在接收到TC BPDU报文后,会执行MAC地址表项和ARP表项的删除操作。如果有人伪造TC BPDU报文恶意攻击交换设备时,交换设备短时间内会收到很多TC BPDU报文,频繁的删除操作会给设备造成很大的负担,给网络的稳定带来很大隐患。 | 启用防TC-BPDU报文攻击功能后,在单位时间内,交换设备处理TC BPDU报文的次数可配置。如果在单位时间内,交换设备在收到TC BPDU报文数量大于配置的阈值,那么设备只会处理阈值指定的次数。对于其他超出阈值的TC BPDU报文,定时器到期后设备只对其统一处理一次。这样可以避免频繁的删除MAC地址表项和ARP表项,从而达到保护设备的目的。 |
RSTP拓扑变更
判断拓扑变化唯一标准:一个非边缘端口迁移到Forwarding状态
为本交换设备的所有非边缘指定端口启动一个TC While Timer,该计时器值是Hello Time的两倍。在这个时间内,清空状态发生变化的端口上学习到的MAC地址。同时,由这些端口向外发送RST BPDU,其中TC置位。一旦TC While Timer超时,则停止发送RST BPDU。
其他交换设备接收到RST BPDU后,清空所有端口学习到MAC地址,除了收到RST BPDU的端口。然后也为自己所有的非边缘指定端口和根端口启动TC While Timer,重复上述过程。 如此,网络中就会产生RST BPDU的泛洪。