STP(生成树协议)

以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路。

但是使用冗余链路会在交换网络上产生环路,引发广播风暴以及MAC地址表不稳定等故障现象,从而导致用户通信质量较差,甚至通信中断。

为解决交换网络中的环路问题,提出了生成树协议STP(Spanning Tree Protocol)。

运行STP协议的设备通过彼此交互信息发现网络中的环路,并有选择的对某个接口进行阻塞,最终将环形网络结构修剪成无环路的树形网络结构。

对于聚合的链路,其在实际作用中已经成为单条链路了,所以STP并不感知,也就不会阻塞管控。

STP是一个成熟的自动化协议,在交换设备上开启STP功能(stp enable)即可做到防止环路,无需再做任何配置。

甚至对于大部分可stp的设备来说,都默认开启了stp功能的。因此我们的目标是学习STP是如何实现防环的。

也还是有一些可配置的东西的,主要是用来修改什么链路被阻塞。不修改也没关系,只是链路不是最优的而已,并不影响通信。

STP的基础概念

在此之前,我们需要先理解几个概念。

请先全部看完,不要就某一点死磕,要合在一起才能理解透。

早期的交换机被称为“桥(Bridge)”,或者“网桥”,受限于当时的技术,早期交换机通常只有两个接口。

交换机仅能实现数据帧在这两个接口之间的交换,这也是“桥”这一称呼的由来。

生成树技术在网桥时代就已经被提出并且被应用,随着网络的发展,交换机能够支持的接口数量越来越多,因此上述称呼逐渐不再被使用,然而在生成树等技术领域中,“桥”或“网桥”的称呼却一直被沿用下来,直至今日我们在生成树中依然会用它们来称呼交换机。

BPDU(Bridge Protocol Data Unit)

STP协议中的数据单元,用于在网络中传递信息并计算最佳路径。(类似于vlan技术的vlan标签那种作用,不过BPDU是一个完整的数据包)

BPDU包含以下重要信息:

  1. 源MAC地址:BPDU的发送者的MAC地址。
  2. 目的MAC地址:BPDU的接收者的MAC地址。
  3. 源优先级(Priority):用于确定根桥(Root Bridge)的优先级。
  4. 源根标识(Root Identifier):用于标识根桥的MAC地址和优先级。
  5. 发送端口标识(Port Identifier):用于标识发送BPDU的端口。
  6. 路径开销(Path Cost):用于计算到达根桥的路径开销。
  7. BPDU类型:用于标识BPDU的类型,一共有两种:配置BPDU拓扑更改通知BPDU

STP通过在网络中传递BPDU来建立一个拓扑树,选择一个根桥,并禁用一些端口以防止环路。

设备通过配置BPDU比较优先级、根标识、路径开销等信息来确定最佳路径,并选择根桥。

当网络中发生拓扑变化时,如链路故障或端口状态改变,STP会生成并发送拓扑更改通知BPDU,通知其他设备进行拓扑重计算。

这样,网络中的所有设备都能保持一个无环的拓扑结构,确保数据包的正常传输。

BPDU是通过组播的方式进行转发的,其组播地址为 01:80:C2:00:00:00

根桥(Root Bridge)

树形的网络结构必须有树根,于是STP引入了根桥的概念。根桥是在使用STP协议的网络中,被选为拓扑树根节点的交换机。

对于一个STP网络,根桥在全网中只有一个,它是整个网络的逻辑中心,但不一定是物理中心。

根桥是网络中所有交换机的参考点,用于计算最佳路径和防止环路。

根桥会根据网络拓扑的变化而动态变化。根桥的选择是通过比较交换机的优先级(Priority)来确定的。

每个交换机都有一个默认的优先级值,通常是32768。优先级值越低,交换机被选为根桥的概率越大。

如果优先级相同,则比较交换机的MAC地址,MAC地址较小的交换机将成为根桥。

具体来说,是通过比较***BID (Bridge ID)**来确定根桥的,其值为优先级 + mac地址*。

一般都不会修改设备的mac地址,所以人为的修改根桥是通过修改优先级(默认32768的那个)来实现的。

根桥的作用是:

  1. 确定最佳路径:根桥作为拓扑树的根节点,它决定了数据包在网络中的传输路径。其他交换机通过比较路径开销(Path Cost)选择到达根桥的最佳路径。路径开销是通过每个链路的速度来计算的,速度越快,路径开销越低,被选为最佳路径的概率越大。

  2. 防止环路:根桥通过发送BPDU(Bridge Protocol Data Unit)来通知其他交换机网络的拓扑结构。交换机根据接收到的BPDU信息进行拓扑计算,并禁用一些端口以防止环路的发生。这样,根桥确保网络中没有冗余的链路,避免了数据包在网络中无限循环的问题。

根桥是STP协议中的一个重要概念,它的选择对网络的性能和稳定性有着重要影响。

在一个网络中,只有一个交换机能够成为根桥,其他交换机都将根据根桥的信息进行拓扑计算和路径选择。

路径开销(Path Cost)

STP中的路径开销(Path Cost)是用于计算到达根桥的路径代价的指标(类似于耗时、延迟)。

路径开销是基于链路的速度来计算的,速度越快,路径开销越低,被选为最佳路径的概率越大。

在STP中,每个链路都有一个默认的路径开销值,这个值根据链路的速度来确定。

以下是两种标准下链路速度和对应的默认路径开销值:

链路速度 IEEE 802.1D-1998 IEEE 802.1T
10 Mbps 100 200000
100 Mbps 19 20000
1 Gbps 4 2000
10 Gbps 2 200

不同厂商的设备默认使用的标准可能不同,但可进行切换。华为还有一个自己私有的计算方式,不过还好默认的是IEEE 802.1T。

路径开销的计算是通过将链路上的路径开销值相加来完成的。

当STP计算最佳路径时,会比较到达根桥的不同路径的路径开销。

路径开销较小的路径(也就是速度最快的路径)将被选为最佳路径,数据包将通过该路径传输

选择最佳路径,是为了确保数据包在网络中的传输效率和稳定性,这样可以避免数据包在网络中出现拥塞或延迟的问题。

路径开销是STP协议中的一个重要概念,它与拓扑计算密切相关,确保网络中的数据包能够以最佳路径传输,同时避免环路的发生。

根端口(Root Port)和指定端口(Designated Port)

在STP中,根端口和指定端口是两种不同类型的端口,用于建立拓扑树并选择最佳路径。

  1. 根端口(Root Port):根端口是指每个非根桥上与根桥相连的端口,根端口负责与根桥进行通信。每个非根桥都会选择一个且仅一个根端口,该端口提供了到达根桥的最佳路径。

  2. 指定端口(Designated Port):指定端口是指在每个链路上被选为传输BPDU的端口。指定端口是从每个交换机上与相邻交换机连接的端口中选择出的。

根端口和指定端口的选择是通过STP协议中的BPDU交换来完成的。交换机通过比较BPDU中的路径开销和优先级等信息,选择最佳的根端口和指定端口,以确保数据包在网络中的传输路径是无环且最优的。

根端口和指定端口是STP协议中的关键概念,它们的选择和配置对于网络的性能和稳定性非常重要。通过选择最佳的根端口和指定端口,STP协议能够建立一个无环的拓扑树,并提供最佳的数据包传输路径。

可以简单理解不是根端口的都为指定端口,而如果一条链路两端都是指定端口(环路),那么其中一个必须成为阻塞端口,根据优先级阻塞其中一个。

请记住,STP的核心是消除环路,其次才是确定最佳路径。

根端口是用来接收根桥发来的BPDU,指定端口是用来转发BPDU给其他交换机。

优先级不只是开销,因为存在开销一样的情况,后面会具体学习优先级的相关内容。

STP原理

启用到稳定阶段

先放一张最终图理解一下上面介绍的概念。

图1——STP接口

如图,交换1为根桥,链路都为同一速率,所以交换机2、交换机3与交换机1相连的接口都为根端口。

交换机4左侧的端口到达交换1的优先级最高选为根端口。

其他剩下的链路为指定端口,其中有两条链路,两侧都为指定端口,再判断哪个端口优先级高,将低的阻塞掉。

最后拓扑就被修剪为树状了,达到了避免环路的目的。

图2——修剪为树状拓扑

同时,被阻塞的链路在目前被选中的最佳路径链路断开时能够自动启用,成为新的最佳链路,完成链路冗余的目的。

达成这个过程,依靠的就是交换机之间发送的BPDU包,设备的接口从加入到稳定一共会经过以下5个阶段。

图3——STP接口状态

端口状态 目的 说明
Disabled 端口不仅不处理BPDU报文,也不转发用户流量。 端口状态为Down。
Listening 确定端口角色,将选举出根桥、根端口和指定端口。不转发用户流量。 过渡状态,持续15秒。
Learning 设备会根据收到的用户流量构建MAC地址表,但不转发用户流量。 过渡状态,持续15秒。增加Learning状态防止临时环路。
Forwarding 端口既转发用户流量也处理BPDU报文。 只有根端口或指定端口才能进入Forwarding状态。
Blocking 端口仅仅接收并处理BPDU,不转发用户流量。 阻塞端口的最终状态。

网络中所有的设备启动STP协议后,每一台设备都认为自己是根桥。

此时,每台设备仅仅收发配置BPDU,而不转发用户流量,所有的端口都处于Listening状态。

所有设备通过交换配置BPDU后,进行选举工作,选出根桥、根端口和指定端口。

这就是STP的启动到稳定过程,这个过程常被称为“收敛”。

该过程中用户流量无法传输,呈现为断网状态,一般收敛时间至少需要30秒(Listening状态与Learning状态的总耗时)。

在稳定的状态下,发送链路变化时,也需要端口经过状态的切换,因此也需要至少30秒的时间。

稳定后的维护阶段

一般STP稳定之后,根桥会周期性的发布BPDU以维护STP状态(默认2秒一次),其他设备只接收并转发该BPDU。

网络中发生拓扑变化时,例如链路中断或接口异常Down等情况,由于MAC地址的老化时间的存在(老化是指“过期”,时间默认为5分钟,超过该时间未更新就会删除交换mac地址表内的该mac信息)。

如果不及时通知上游设备,则可能会导致上游设备的报文在这段时间内一直向一个不可达的链路发送。

这样就可能导致流量的丢失,此时就需要拓扑变化机制来将拓扑的变更及时通知到整个STP网络。

使用ensp模拟器的话就可能会出现这个bug,链路变动后,交换机的mac地址表却未随着变动,导致通信失败。

TCN BPDU(Topology Change Notification Bridge Protocol Data Unit,拓扑更改通知BPDU)是一种特殊类型的BPDU报文,用于通知网络中的其他设备发生了拓扑变化。

当网络中的拓扑发生变化,比如链路故障或端口状态改变时,交换机会生成并发送TCN BPDU报文。TCN BPDU报文的目的是通知其他设备进行拓扑重计算,以便更新拓扑树并选择新的最佳路径,同时将MAC地址老化时间暂时改为15秒,适应拓扑变。

TCN BPDU报文的发送和接收是STP协议中的重要机制,它确保网络中的所有设备能够及时感知到拓扑变化,并相应地调整拓扑树和路径选择,以保持网络的稳定性和高可用性。

TCN BPDU报文的触发过程:

  1. 当交换设备的接口发生变更后,下游设备会不间断地向上游设备发送TCN BPDU报文。

  2. 上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文。其它端口也有可能收到TCN BPDU报文,但不会处理。(指定端口为最靠近根桥的端口)

  3. 上游设备会把配置BPDU报文中的Flags的TC位和TCA位同时置1,然后发送给下游设备,

    TC位置1是为了通知下游设备直接删除桥MAC地址表项,TCA位置1是为了通知下游设备停止发送TCN BPDU报文。

  4. 上游设备复制一份TCN BPDU报文,向根桥方向发送。

  5. 重复步骤1、2、3、4,直到根桥收到TCN BPDU报文

置位的TC标记的配置BPDU报文主要是上游设备用来告知下游设备拓扑发生变化,请下游设备直接删除桥MAC地址表项,从而达到快速收敛的目的。

选举优先级

根桥的选举

设备开启阶段,所有设备都会认为自己是根桥,在发送的配置BPDU中,将根桥项目填写为自己的mac。

交换机之间彼此收发配置BPDU,比较收到的包中根桥优先级与自己优先级的差距。

( 选举根桥的BID=优先级+mac地址;默认优先级为32768,越小越优先。)

自身BID低,就不再主动发布根桥为自己的配置BPDU包了。

转而开始转发其认可为根桥的BPDU包,同时也填入了其到根桥的开销。例如:

Root Identifier: 32768 / 0 / 4c:1f:cc:07:3f:df

Root Path Cost: 20000

Bridge Identifier: 32768 / 0 / 4c:1f:cc:16:72:7b

第三行为交换机自己的BID。

最终,当只剩下一台设备在自发性的产生并发布BPDU,其他设备只转发该BPDU,根桥的选举也就结束了。

根端口的选举

根桥确定后,就开始选举根端口,根端口是到达根桥的最佳路径所在的接口。

优先级为:开销》对端BID(包括mac)》对端PID》本端PID

一个一个讲,请注意,现在是在选举一台交换机上的哪个端口为根端口。

开销

收到的BPDU中,包含了Root Path Cost这一项表示到根桥的总开销,但这个BPDU是由上级交换机生成发送过来的,因此是上级交换机到根桥的开销。

所以要计算本端交换机端口到到根桥的开销,还得再加上与上级交换机所在链路的开销值。

开销越小的越优先。

对端BID

当端口到根桥的开销值一样时,就开始比较对端设备的BID。(也就是比较收到的两个BPDU中的BID值)

哪个端口的上级交换机的BID更优先,就采用哪个端口作为根端口。

对端PID

如果对端都是同一个交换机,就开始比较PID(PID=接口优先级+接口编号)。

接口优先级默认为128,而接口编号就是查看交换机接口信息时从上到下的顺序。(display interface brief )

PID也是BPDU包中的一个字段。

本端PID

如果遇到了对端为同一接口,就比较自己这边的PID。(两台交换机之间串联了一个集线器就会出现这个情况。)


因此,请不要简单的认为与根桥连在一起的交换机,其直连链路就是根端口所在的链路。

如果该直连链路速率低(比如百兆),那么其开销值可能大于从其他交换机绕行的链路(比如千兆)。

指定端口/阻塞端口的选举

对于一台交换机来说,确定完根端口后,其他接入在STP中的端口就都是指定端口了。

但当两台非根桥交换机连在一起,且链路所在端口都不是根端口时,就必须选举出最优的一个作为指定,另一个阻塞。

STP本质是防止环路的技术,当链路两侧都不是根端口,说明该链路是环路。

指定端口是用来转发根桥发来的BPDU的,因此要选出到根桥路径最佳的那一个。

所以第一个优先级就是比较端口到达根桥的开销。(其实就是交换机的根端口到根桥的开销,也就是BPDU包里的Root Path Cost)

当开销相同时,就比较设备的BID。(BID中包含了mac地址,因此不存在BID相同的情况)

说白了,选举的就是为了传递最好的BPDU

一是要求传递出的BPDU中的Root Path Cost(到根桥开销)为最小。

二是要求传递出的BPDU中BID与PID为优先级最高的。

STP中的几个时间

先贴一个抓到的BPDU包的报文内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Spanning Tree (0)
BPDU Type: Configuration (0x00)
BPDU flags: 0x00
0... .... = Topology Change Acknowledgment: No
.... ...0 = Topology Change: No
Root Identifier: 32768 / 0 / 4c:1f:cc:58:6c:b7
Root Path Cost: 0
Bridge Identifier: 32768 / 0 / 4c:1f:cc:58:6c:b7
Port identifier: 0x8001
Message Age: 0
Max Age: 20
Hello Time: 2
Forward Delay: 15
时间 说明
Message Age 该BPDU包年龄值(以秒为单位)。默认每经过一个交换机,年龄就加1s。
Max Age 最大年龄值,默认为20s。收到的包Message Age大于20就丢弃该BPDU包。二是当接口持续20秒未收到BPDU,则认为上游设备已经出现故障,本设备会重新进行生成树计算。
hello time 2s。根桥定期发布配置BPDU的时间。
Forward Delay 状态迁移的延迟时间,默认15s。接口进入监听与学习状态各需要等待15秒,总计30秒。
也就是说30秒是端口状态发生变化直到稳定的最短时间。
Max Age + Forward Delay 50s。最坏情况下,拓扑发生变化后,先等待20s才开始重选举,选举又需要30s的时间收敛,一共50s,就是网络恢复正常所消耗的最短时间。

注:华为交换机不再使用Max Age 来决定端口角色变化需等待的超时时间。

目前,华为交换机STP/RSTP 实现中,超时时间=Hello Time × 3 × Timer Factor。

(若未设置Timer Factor的值,则超过时间是Hello Time的9倍。)

STP的配置

STP由于收敛需要30秒,故障响应也要20秒;不是很迅速,所以目前都采用的改进后的RSTP或MSTP。

因此,如果要体验与配置STP,需要先将STP模式修改为原始的STP。

命令
stp enable 开启stp,默认就是开启状态。
stp disable 关闭stp。
stp mode stp 修改STP模式为STP
stp priority 修改设备的BID优先级,默认为32768。修改需要填写为4096的倍数。
stp root primary 配置当前设备为根桥设备。 等同于stp priority 0
stp root secondary 配置当前设备为备用根桥设备。 等同于stp priority 4096
stp pathcost-standard 修改设备的开销计算标准。参数为dot1d-1998dot1t
display stp 查看生成树的状态信息与统计信息。带brief则显示接口主要信息。
也可以指定查看某一接口的信息。如:dis stp interface GigabitEthernet 0/0/1
以下命令为接口视图下执行
stp cost 修改当前端口的路径开销值。(填数值)
stp port priority 修改端口的优先级,默认为128。

一般常用的也就设置主根桥与备用根桥。

配置就不演示了,推荐自己打开ensp自己随便搭几个交换机跟多条链路,然后自己推算一下根桥、根端口、指定端口、阻塞端口是谁。

再思考一下如果要修改的话,需要使用什么命令(修改谁的BID优先级,修改哪个接口的开销或PID优先级)。

RSTP

STP的不足之处

STP协议虽然能够解决环路问题,但是由于网络拓扑收敛慢,影响了用户通信质量。如果网络中的拓扑结构频繁变化,网络也会随之频繁失去连通性,从而导致用户通信频繁中断,这是用户无法忍受的。

STP的不足之处如下:

  • STP没有细致区分端口状态和端口角色,不利于初学者学习及部署。

    网络协议的优劣往往取决于协议是否对各种情况加以细致区分。

    • 从用户角度来讲,Listening、Learning和Blocking状态并没有区别,都同样不转发用户流量。
    • 从使用和配置角度来讲,端口之间最本质的区别并不在于端口状态,而是在于端口扮演的角色。
  • STP算法是被动的算法,依赖定时器等待的方式判断拓扑变化,收敛速度慢。

  • STP算法要求在稳定的拓扑中,根桥主动发出配置BPDU报文,而其他设备进行处理,传遍整个STP网络。这也是导致拓扑收敛慢的主要原因之一。

端口状态指Disabled、Listening、Learning、Forwarding、Blocking这五个。

端口角色指的是根端口、指定端口、阻塞端口这三个。

RSTP对STP的改进

根据STP的不足,RSTP新增加了2种端口角色,删除了3种端口状态,并且把端口属性充分的按照状态和角色解耦。

此外,RSTP还增加了相应的一些增强特性和保护措施,实现网络的稳定和快速收敛。

通过端口角色的增补,简化了生成树协议的理解及部署。

RSTP的端口角色共有4种:根端口、指定端口、Alternate端口(原STP中的阻塞端口)和Backup端口。

根端口和指定端口的作用同STP协议中定义,Alternate端口和Backup端口的描述如下:

  • 从配置BPDU报文发送角度来看:

    • Alternate端口就是由于学习到其它网桥发送的配置BPDU报文而阻塞的端口。
    • Backup端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口。
  • 从用户流量角度来看:

    • Alternate端口作为根端口的备份端口,提供了从指定桥到根的另一条可切换路径。
    • Backup端口作为指定端口的备份,提供了另一条从根桥到相应网络的备份通路。

    给一个RSTP域内所有端口分配角色的过程就是整个拓扑收敛的过程。

端口状态的重新划分

RSTP的状态规范把原来的5种状态缩减为3种。根据端口是否转发用户流量和学习MAC地址来划分:

  • 如果不转发用户流量也不学习MAC地址,那么端口状态就是Discarding状态。
  • 如果不转发用户流量但是学习MAC地址,那么端口状态就是Learning状态。
  • 如果既转发用户流量又学习MAC地址,那么端口状态就是Forwarding状态。

如表所示,新的端口状态与STP规定的端口状态比较。端口状态和端口角色是没有必然联系的,显示了各种端口角色能够具有的端口状态。

STP端口状态 RSTP端口状态 端口在拓扑中的角色
Blocking Discarding 包括Alternate端口、Backup端口
Disabled Discarding 包括Disable端口
Listening Discarding 包括根端口、指定端口
Learning Learning 包括根端口、指定端口
Forwarding Forwarding 包括根端口、指定端口

配置BPDU的处理发生变化

  • 拓扑稳定后,配置BPDU报文的发送方式

    在STP中,拓扑稳定后,根桥按照Hello Time规定的时间间隔发送配置BPDU。其他非根桥设备在收到上游设备发送过来的配置BPDU后,才会触发发出配置BPDU,此方式使得STP协议计算复杂且缓慢。

    RSTP对此进行了改进,即在拓扑稳定后,无论非根桥设备是否接收到根桥传来的配置BPDU报文,非根桥设备仍然按照Hello Timer规定的时间间隔发送配置BPDU,该行为完全由每台设备自主进行。

  • 更短的BPDU超时计时

    如果一个端口在超时时间(超时时间=Hello Time × 3 × Timer Factor)内没有收到上游设备发送过来的配置BPDU,那么该设备认为与此邻居之间的协商失败。而不像STP那样需要先等待一个Max Age。

  • 处理次等BPDU

    当一个端口收到上游的指定桥发来的BPDU报文时,该端口会将自身存储的BPDU与收到的BPDU进行比较。

    如果该端口存储的BPDU的优先级高于收到的BPDU,那么该端口会直接丢弃收到的BPDU,立即回应自身存储的BPDU。

    当上游设备收到下游设备回应的BPDU后,上游设备会根据收到的BPDU报文中相应的字段立即更新自己存储的BPDU。

    由此,RSTP处理次等BPDU报文不再依赖于任何定时器通过超时解决拓扑收敛,从而加快了拓扑收敛。

快速收敛

  • Proposal/Agreement机制

    当一个端口被选举成为指定端口之后,在STP中,该端口至少要等待一个Forward Delay(Learning)时间才会迁移到Forwarding状态。

    而在RSTP中,此端口会先进入Discarding状态,再通过Proposal/Agreement机制快速进入Forward状态。这种机制必须在点到点全双工链路上使用。

    Proposal/Agreement机制简称P/A机制,详细描述稍后介绍。

  • 端口快速切换机制

    如果RSTP网络中,一台交换机的根端口失效,那么该交换机最优的Alternate端口将成为根端口并直接进入Forwarding状态。

    因为通过这个Alternate端口连接的链路上必然有个指定端口可以通往根桥。

    阻塞端口也是周期性的接收到BPDU包才能保持的,因此必定是到根桥链路为通的状态。

  • STP模式时,阻塞端口切换成根端口后,要等待一个Forward Delay时间(缺省值为15秒)进入Learning状态,再继续等待一个Forward Delay时间才进入Forwarding状态。

    • RSTP模式时,阻塞端口切换成根端口后,直接进入Forwarding状态。

    相比较STP模式时接口需要等待2*Forward Delay时间才能进入Forwarding状态,RSTP模式时的根端口快速切换机制使接口直接切换成Forwarding状态,减少业务流量丢包。

    同样的,如果指定端口失效,该交换机最优的Backup端口将成为指定端口并直接进入Forwarding状态

此处指的都是同一台交换机存在阻塞端口的情况。

其他

RSTP作为一个独立于STP的新协议,其报文自然也会有所改动,马上就会开始介绍。

STP如果抛开时间问题,其已经是非常完美的防环协议了。但作为早期协议,并没有考虑到安全问题,恶意者可以利用BPDU的优先级选举机制来搞破坏,通过伪装BPDU报文,发送给交换设备,以引起通信的异常中断。

为此,RSTP就加入了许多安全保护机制。(也是稍后介绍)

RST BPDU

在配置BPDU报文的格式上,除了保证和STP格式基本一致之外,RSTP作了一些小变化:

  • Type字段,配置BPDU类型不再是0而是2,所以运行STP的设备收到RSTP的配置BPDU时会丢弃。
  • Flags字段,使用了原来保留的中间6位,这样改变的配置BPDU叫做RST BPDU。

下表为一个RSTP协议的BDPU报文中的内容。可以与前面摘抄的STP的BPDU比对。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Spanning Tree Protocol
Protocol Identifier: Spanning Tree Protocol (0x0000)
Protocol Version Identifier: Rapid Spanning Tree (2)
BPDU Type: Rapid/Multiple Spanning Tree (0x02)
BPDU flags: 0x7c, Agreement, Forwarding, Learning, Port Role: Designated
0... .... = Topology Change Acknowledgment: No
.1.. .... = Agreement: Yes
..1. .... = Forwarding: Yes
...1 .... = Learning: Yes
.... 11.. = Port Role: Designated (3)
.... ..0. = Proposal: No
.... ...0 = Topology Change: No
Root Identifier: 32768 / 0 / 4c:1f:cc:4b:6f:48
Root Path Cost: 0
Bridge Identifier: 32768 / 0 / 4c:1f:cc:4b:6f:48
Port identifier: 0x8001
Message Age: 0
Max Age: 20
Hello Time: 2
Forward Delay: 15
Version 1 Length: 0

其中,flags字段的信息如下:

  • Topology Change Acknowledgment: No - 该标志位表示没有收到拓扑变化的确认。
  • Agreement: Yes - 该标志位表示该端口与对应的邻居端口达成了一致,表示两个端口的状态相互匹配。
  • Forwarding: Yes - 该标志位表示该端口处于转发状态,可以接收和转发数据帧。
  • Learning: Yes - 该标志位表示该端口处于学习状态,可以接收数据帧并将源 MAC 地址添加到 MAC 地址表中。
  • Port Role: Designated (3) - 该标志位表示端口角色为 Designated,即指定端口。其他字节对应的端口如下:
    • 00 Unknown
    • 01 Alternate/Backup port
    • 10 Root port
    • 11 Designated port
  • Proposal: No - 该标志位表示没有发送 RSTP 配置 BPDU 的提议。
  • Topology Change: No - 该标志位表示没有网络拓扑变化。

这种BPDU称为RST BPDU,以区分普通STP的BPDU。 从现在开始,本文后续关于RSTP的BPDU包都会称为RST BPDU。

Proposal/Agreement机制

在STP中,端口需要等待Forward Delay时间才迁移到Forwarding状态,其目的是为了避免环路,等待一定的时间,以保证所有设备都确定好了端口角色。

在RSTP中,当一个端口被选为根端口和指定端口后,其进入转发状态的延时将大大缩短,从Discarding尽快进入Forwarding状态。

指定端口的端口状态快速迁移的条件是:

  • 如果指定端口是边缘端口,则指定端口可以直接进入转发状态。(边缘端口即该端口直接与用户终端相连,而没有连接到其他交换设备或共享网段上)
  • 如果指定端口连接着点对点链路,则设备可以通过与下游设备握手,得到响应后即刻进入转发状态。该握手机制为Proposal/Agreement机制

根端口的端口状态快速迁移的条件是:

  • 本设备上旧的根端口已经停止转发数据,而且上游指定端口已经开始转发数据。

Proposal与Agreement的数值位于RST BPDU包的flags字段内(请看上一节贴出的flags字段内容)

Proposal/Agreement机制过程原理

Proposal/Agreement机制,目前交换设备的端口支持以下两种方式:

  • 普通方式:当前端口在计算同步标志位时忽略根端口。
    1. 上游设备发送Proposal报文,请求进行快速迁移,下游设备接收到后,把与上游设备相连的端口设置为根端口,并阻塞所有非边缘端口,根端口转为Forwarding状态。
    2. 下游设备回应Agreement报文,上游设备接收到后,把与下游设备相连的端口设置为指定端口,指定端口进入Forwarding状态。
  • 增强方式:当前端口在计算同步标志位时计算根端口。
    1. 上游设备发送Proposal报文,请求进行快速迁移,下游设备接收到后,把与上游设备相连的端口设置为根端口,并阻塞所有非边缘端口。
    2. 上游设备继续发送Agreement报文,下游设备接收到后,根端口转为Forwarding状态。
    3. 下游设备回应Agreement报文,上游设备接收到后,把与下游设备相连的端口设置为指定端口,指定端口进入Forwarding状态。

在运行生成树的通信网络中,如果华为公司的数据通信设备与其他厂商设备混合组网,可能会因为与其他厂商设备的Proposal/Agreement机制不同导致互通失败。

需要根据其他厂商设备的Proposal/Agreement机制,选择端口使用增强的快速迁移机制还是普通的快速迁移机制。

举个例子:

图4——P/A机制

新链路连接成功后,P/A机制协商过程如下:

  1. p0和p1两个端口马上都先成为指定端口,发送RST BPDU。
  2. S2的p1口收到更优的RST BPDU,马上意识到自己将成为根端口,而不是指定端口,停止发送RST BPDU。
  3. S1的p0进入Discarding状态,于是发送的RST BPDU中把Proposal和Agreement置1。
  4. S2收到根桥发送来的携带Proposal的RST BPDU,开始将自己的所有端口进入sync变量置位——进入同步状态。
  5. p2已经阻塞,状态不变;p4是边缘端口,不参与运算;所以只需要阻塞非边缘指定端口p3。
  6. 各端口同步后,p2、p3进入Discarding状态,p1进入Forwarding状态并向S1返回Agreement位置位的回应RST BPDU。
  7. 当S1判断出这是对刚刚发出的Proposal的回应,于是端口p0马上进入Forwarding状态。

也就是在原来的基础上,进行了一次主动协商的过程,协商成功,就直接转入Forwarding状态,而不需要走原始的状态迁移。

这个协商过程中,为了防止其他的环路,会要求根端口以外的端口进入Discarding状态,让他们走原始的状态迁移;当然,如果有其他的设备与之进行P/A机制协商,也会参与快速迁移。

RSTP中的保护机制

所有保护功能默认都是未开启的。

一般来说,只会给根桥配置根保护,给边缘端口配置BPDU保护,其他的很少使用。

BPDU保护

交换机上通常将直接与用户终端(如PC机)或文件服务器等非交换设备相连的端口配置为边缘端口。

正常情况下,边缘端口不会收到RST BPDU。

但如果有人伪造RST BPDU恶意攻击交换机,当边缘端口接收到RST BPDU时,交换机会自动将边缘端口设置为非边缘端口,并重新进行生成树计算。

当攻击者发送的RST BPDU报文中的桥优先级高于现有网络中根桥优先级时会改变当前网络拓扑,可能会导致业务流量中断。

这是网络中一种简单的拒绝服务DoS(Denial of Service)攻击方式。

交换机上启动了BPDU保护功能后,如果边缘端口收到RST BPDU,边缘端口将被error-down,但是边缘端口属性不变,同时通知网管系统。交换机上会打印如下日志信息:

1
MSTP/4/BPDU_PROTECTION:This edged-port [port-name] that enabled BPDU-Protection will be shutdown, because it received BPDU packet!

操作步骤:

  1. 执行命令system-view,进入系统视图。

  2. 执行命令stp bpdu-protection,配置交换设备边缘端口的BPDU保护功能。

    默认情况下,交换设备的BPDU保护功能处于禁用状态。

后续处理

如果用户希望被error-down的边缘端口可自动恢复,可通过配置使能端口自动恢复功能,并设置延迟时间。

即在系统视图下执行命令error-down auto-recovery cause bpdu-protection interval interval-value

启用端口自动恢复为Up的功能,并设置端口自动恢复为Up的延时时间。使被关闭的端口经过延时时间后能够自动恢复。

配置时需要注意:

  • 默认不启用该功能,所以没有默认的延迟时间值。当用户配置该命令时,必须指定恢复延迟时间(interval-value)。
  • 取值越小表示端口的管理状态自动恢复为Up的延迟时间越短,端口Up/Down状态震荡频率越高。
  • 取值越大表示端口的管理状态自动恢复为Up的延迟时间越长,端口流量中断时间越长。
  • 自动恢复仅对配置error-down auto-recovery命令之后发生error-down的端口有效,对配置此命令之前已经error-down的端口不生效。

根保护

由于维护人员的错误配置或网络中的恶意攻击,网络中合法根桥有可能会收到优先级更高的RST BPDU,使得合法根桥失去根地位,从而引起网络拓扑结构的错误变动。

这种不合法的拓扑变化,会导致原来应该通过高速链路的流量被牵引到低速链路上,造成网络拥塞。

图5——RSTP根保护

如图所示,DeviceA和DeviceB处于网络核心层,两者间的链路带宽为1000M,其他链路带宽均为100M。DeviceA为网络中的根桥,DeviceC处于接入层。正常情况下,DeviceB和DeviceC之间的链路被阻塞。

当DeviceD新接入DeviceC时,如果DeviceD的桥优先级高于DeviceA,此时DeviceD会被选举为新的根桥,两个核心交换机DeviceA和DeviceB之间的千兆链路被阻塞,这会导致VLAN中的流量都通过两条100M链路传输,可能会引起网络拥塞及流量丢失。

此时可以在DeviceC连接DeviceD的端口上,配置根保护。对于启用Root保护功能的指定端口,其端口角色只能保持为指定端口。

一旦启用Root保护功能的指定端口收到优先级更高的RST BPDU时,端口状态将进入Discarding状态,不再转发报文。

在经过一段时间(通常为两倍的Forward Delay),如果端口一直没有再收到优先级较高的RST BPDU,端口会自动恢复到正常的Forwarding状态。

操作步骤:

  1. 执行命令system-view,进入系统视图。

  2. 执行命令interface interface-type interface-number,进入参与生成树协议计算的接口视图。

  3. 执行命令stp root-protection,配置交换设备的Root保护功能。

    默认情况下,端口的Root保护功能处于去使能状态。当端口的角色是指定端口时,配置的Root保护功能才生效。配置了根保护的端口,不可以配置环路保护。

环路保护

在运行RSTP协议的网络中,根端口和其他阻塞端口状态是依靠不断接收来自上游交换设备的RST BPDU维持。

当由于链路拥塞或者单向链路故障导致这些端口收不到来自上游交换设备的RST BPDU时,此时交换设备会重新选择根端口。

原先的根端口会转变为指定端口,而原先的阻塞端口会迁移到转发状态,从而造成交换网络中可能产生环路。

当链路发生拥塞时,由于根端口在超时时间内收不到来自上游设备的BPDU报文,Alternate端口放开转变成了根端口,根端口转变成指定端口,从而形成了环路。

在启动了环路保护功能后,如果根端口或Alternate端口长时间收不到来自上游设备的BPDU报文时,则向网管发出通知信息(此时根端口会进入Discarding状态,角色切换为指定端口),而Alternate端口则会一直保持在阻塞状态(角色也会切换为指定端口),不转发报文,从而不会在网络中形成环路。直到链路不再拥塞或单向链路故障恢复,端口重新收到BPDU报文进行协商,并恢复到链路拥塞或者单向链路故障前的角色和状态。

交换机上会打印如下日志信息:

1
MSTP/4/LOOP_GUARD:MSTP process [process-id] Instance[instance-id]'s LOOP-Protection port [port-name] did not receive message in prescriptive time!

环路保护功能只能在根端口或Alternate端口上配置生效。

操作步骤:

  1. 执行命令system-view,进入系统视图。

  2. 执行命令interface interface-type interface-number,进入参与生成树协议计算的接口视图。

  3. 执行命令stp loop-protection,配置交换设备根端口或Alternate端口的环路保护功能。

    默认情况下,端口的环路保护功能处于关闭状态。

防TC-BPDU攻击

交换设备在接收到TC BPDU报文后,会执行MAC地址表项和ARP表项的删除操作。

如果有人伪造TC BPDU报文恶意攻击交换设备时,交换设备短时间内会收到很多TC BPDU报文,频繁的删除操作会给设备造成很大的负担,给网络的稳定带来很大隐患。

启用防TC-BPDU报文攻击功能后,在单位时间内,交换设备处理TC BPDU报文的次数可配置。

如果在单位时间内,交换设备在收到TC BPDU报文数量大于配置的阈值,那么设备只会处理阈值指定的次数。

对于其他超出阈值的TC BPDU报文,定时器到期后设备只对其统一处理一次。

这样可以避免频繁的删除MAC地址表项和ARP表项,从而达到保护设备的目的。

操作步骤

  1. 执行命令system-view,进入系统视图。

  2. 执行命令stp tc-protection interval interval-value,配置设备处理阈值指定数量的拓扑变化报文所需的时间。

    默认情况下,设备处理最大数量的拓扑变化报文所需的时间是Hello Time。

  3. 执行命令stp tc-protection threshold threshold,配置交换设备在收到TC类型BPDU报文后,单位时间内,处理TC类型BPDU报文并立即刷新转发表项的阈值。

    默认情况下,设备在指定时间内处理拓扑变化报文的最大数量是1。

    配置后,在stp tc-protection interval指定的时间内,设备只会处理stp tc-protection threshold指定数量的拓扑变化报文,对于其他的报文会延迟处理,所以可能会影响生成树的收敛速度。例如,时间设定为10秒,阈值设定为5,则设备收到拓扑变化报文后,在10秒内只会处理最开始收到的5个拓扑变化报文,对于后面收到的报文则会等10秒超时后再统一处理。

RSTP配置

STP的配置命令在RSTP这边基本都能使用,所以不重复介绍。

注意,华为交换机默认为MSTP,需要使用命令stp mode rstp切换为RSTP,后续命令介绍都是在RSTP模式下的。

保护功能的配置在上节介绍了,也不重复了。

边缘端口

在RSTP里面,如果某一个指定端口位于整个网络的边缘,即不再与其他交换设备连接,而是直接与终端设备(PC)直连,这种端口叫做边缘端口。

我们可以手动将满足条件的端口配置为边缘端口,边缘端口不参与RSTP运算,可以由Disable直接转到Forwarding状态,且不经历时延,就像在端口上将STP禁用。

但是一旦边缘端口收到配置BPDU,就丧失了边缘端口属性,成为普通STP端口,并重新进行生成树计算,从而引起网络震荡。

因此可以启用边缘端口的BPDU报文过滤功能,使边缘端口不处理、不发送BPDU报文。

不过启用过滤后,端口将不处理、不发送BPDU报文。该端口将无法成功与对端设备直连端口协商STP协议状态。

除了启用过滤,也可以启用BPDU保护功能。

操作步骤:

在接口模式下配置边缘端口和BPDU报文过滤功能:

  1. 执行命令system-view,进入系统视图。

  2. 执行命令interface interface-type interface-number,进入参与生成树协议计算的以太接口视图。

  3. 执行命令stp edged-port enable,将端口配置成边缘端口。

    默认情况下,设备的所有端口为非边缘端口。

  4. 执行命令stp bpdu-filter enable,配置当前端口为BPDU filter端口,过滤所有BPDU报文。

    默认情况下,设备的所有端口为非BPDU filter端口。

补充说明

启用生成树协议后,默认启用边缘端口自动探测功能,当端口在(2 × Hello Timer + 1)秒的时间内收不到BPDU报文,会自动设置为边缘端口。

如果在接口视图下配置了stp edged-port enablestp edged-port disable或者在系统视图下配置了stp edged-port default,边缘端口自动探测功能就不生效了。

分别是配置为边缘端口,配置为非边缘端口,以及全局配置该设备上所有的接口为边缘端口

配置RSTP超时时间

在运行生成树算法的网络中,如果设备在配置的超时时间内没有收到上游设备发送的BPDU,就认为上游设备已经出现故障,本设备会重新进行生成树计算。

由于上游设备繁忙,有时设备在较长的时间内收不到上游设备发送的BPDU。在这种情况下一般不应该重新进行生成树计算,因此,在稳定的网络中,可以配置超时时间,以减少网络资源的浪费。

如果设备在超时时间(超时时间=Hello Time × 3 × Timer Factor)内没有收到上游设备发送的BPDU,则生成树会重新进行计算。

操作步骤:

  1. 执行命令system-view,进入系统视图。

  2. 执行命令stp timer-factor factor,配置未收到上游的BPDU就重新开始生成树计算的超时时间。

    默认情况下,设备未收到上游的BPDU就重新开始生成树计算的超时时间是Hello Timer的9倍。

配置P/A机制的迁移方式

迁移方式分普通与增强,并不兼容;华为设备默认使用增强方式,如果与其他采用普通方式的交换机连接在一起,该链路中P/A机制会失效。(但不会影响网络,只是失去了P/A机制带来的快速状态迁移,转而走原始的状态迁移。)

操作步骤:

  1. 执行命令system-view,进入系统视图。

  2. 执行命令interface interface-type interface-number,进入参与生成树协议计算的接口视图。

  3. 执行命令stp no-agreement-check,配置端口使用普通的快速迁移方式。

    默认情况下,端口使用增强的快速迁移机制。