首先简单比较802.1D和802.1W在PDU上的一些结构和区别。

生成树协议一共有两种BPDU:

一、Configuration BPDU:

l 在802.1D里,配置BPDU在生成树初始化时由各Bridge自己生成,当接收到更优(superior)BPDU后,改用更优的BPDU。当STP域收敛时,全网的配置BPDU都是Root Bridge的配置BPDU。当然,每台Bridge都有可能修改BPDU的内容,例如TCA标记;

l 在802.1W里,该BPDU改为全部由Bridge自己生成,只是在Root ID里填上已知Root Bridge的Bridge ID。配置BPDU由本机产生这点很重要,这直接使得RSTP在拓扑变更时无需等待Root Bridge的配置BPDU,即可刷新MAC表。

二、TCN BPDU

l 在802.1D中,TCN BPDU由获知网络拓扑发生变化的Bridge生成,并从根端口(以下简称R-Port)往Root Bridge方向发送。接收到TCN BPDU的Bridge有两个动作:1、继续从R-Port转发,并期待从R-Port接收到TCA置位的配置BPDU;另一方面,在下一次配置BPDU发送时,向该指定端口(以下简称D-Port)发送TCA置位的配置BPDU进行确认。Bridge将一直生成并发送TCN BPDU,直到收到TCA置位的配置BPDU为止。该行为一直延伸到Root Bridge接收到TCN BPDU为止。然后Root Bridge发送新的配置BPDU,使整个STP域的Bridge老化其MAC表,准备学习新的拓扑。由于STP域内所有Bridge的收敛行为均由Root Bridge的配置BPDU驱动,可称为同步收敛;

l 在802.1W中,不存在TCN BPDU,因为RSTP域内状态的同步无需由Root Bridge发起。Topology Change(TC)的通告发生在毗邻Bridge之间,当且仅当某D-Port状态从Discarding到Forwarding时需要使用TC置位的配置BPDU。该BPDU仅从该D-Port转发出去,且一个新增的位(Proposal Bit)将被置位。这将引发一系列同步操作,也就是RSTP新增的一个协商机制:P/A机制。通过P/A机制,STP域内收敛行为发生在相邻的Bridge之间,各自完成自己的同步过程,可称为异步收敛。

STP与RSTP对端口状态的描述:

STP Blocking Listening Learning Forwarding
RSTP Discarding Discarding Learning Forwarding

 

RSTP BPDU如下:

Protocol ID

Protocol Version ID

BPDU
Type

Flags

Root ID

Root Path Cost

Bridge ID

Port ID

Message Age

Max Age

Hello Time

Forward Delay

其中Flags一项与STP比较而言变化较大:

Topology Change(TC):1 Bit,由获知STP域拓扑发生改变的Bridge生成。在STP中,该Bridge将生成TC置位的TCN BPDU,并向Root Bridge方向泛洪。Root Bridge接收后,往其下游继续泛洪,直到STP域内所有Bridge都获知该信息。在RSTP中,BPDU仅在相邻Bridge间进行转发,因此TCN BPDU和TCA BPDU都仅在设备间生效。

Proposal:1 Bit。用于向对端协商成为转发状态。所有处于Discarding/Learning状态的端口,生成的BPDU都将Proposal比特置位。若接收到对端Agreement置位的BPDU,则立即进入Learning状态,并在随后进入Forwarding状态。

Port Role:2 Bit。用于标识发送本BPDU端口的角色。

Learning:1 Bit。处于Learning状态的端口,生成Learning比特置位的BPDU。

Forwarding:1 Bit。处于Forwarding状态的端口,生成Forwarding比特置位的BPDU。

Agreement:1 Bit。接收到Proposal比特置位的BPDU后,若Bridge的所有端口均处于Synced状态,则返回Agreement置位的BPDU。

Topology Change Acknowledgment(TCA):1Bit,由接收到TCN BPDU的Bridge生成,作为对端Bridge的回应。

Port Role:R-Port(10),非根交换机到根交换机的最优端口;D-Port(11):网段到根交换机的最优端口;A-Port(01):R-Port的替换端口;Backup Port(01):D-Port的替换端口;Unknown Port(00):未知角色端口;Edge Port:连接终端的端口,因Edge Port不发送BPDU,因此BPDU包里没有该定义。

wps_clip_p_w_picpath-19414

介绍完端口角色,接下来就是介绍RSTP如何实现快速收敛。

首先,RSTP将网络拓扑的变化定义为端口角色的变化,这个应该比较容易理解,因为网络拓扑的变化可以描述为某些网络端口在转发/阻塞态之间的转换,而RSTP将端口角色和端口状态进行了明确的定义(这是RSTP比STP优胜的地方)。

其次,RSTP端口角色的变化直接影响端口状态的变化。R-Port、D-Port、Edge Port处于Forwarding状态;Alternated Port(以下简称A-Port)和Backup Port处于Discarding状态。

一、Forwarding-〉Discarding

若某条链路失效,即链路两端的端口从转发态变为阻塞态。从生成树协议的目的来看,并不会使得网络形成环路。RSTP仅需要找到处于合适的阻塞态端口,并将其转为转发态,使拓扑重新连通起来。由于RSTP在计算时已经分配好R-Port的备份端口A-Port,因此若从转发态变为阻塞态的是R-Port,则把对应的A-Port改为转发态;同理,D-Port的则色也可置相应的Backup Port为转发来实现。而Edge Port并不影响生成树的计算,故忽略。这样,当某个(些)端口状态从转发到阻塞,对于RSTP而言,无需重新计算(是不是有点熟悉,好像哪儿见过不用计算直接使用备用路径的算法。聪明的你一定想到了:DUAL)。

二、Discarding-〉Forwarding

由于某条链路的连通有可能导致生成树域成环。在RSTP里,该行为定义为D-Port从阻塞态转化为转发态,相对的检查机制应的就是P/A机制,即从需要进入转发态的D-Port,建议对端进行同步,待收到确认后进入转发态。

对端Bridge在接收到“建议”消息后,一方面阻塞自身所有D-Port,并返回“同意”消息给“建议”消息发送方;另一方面,对自身端口进行同步。同步分两种类型:若端口为E-Port,或者原来就是非转发态,则为“已同步”;若端口原来为转发态,为重新进入转发态,将对对端进行“建议”并等待确认。

下面将结合图例,演示P/A机制的流程:

(一)B、E之间建立一条新链路,首先进行端口角色选择;

wps_clip_p_w_picpath-31993

(二)B、E通过该链路交换BPDU,由于B端口发送的BPDU较优(superior),因此B端口角色为D-Port;与此同时,E从B收到的BPDU比从C收到的较优,因此E把连接B的端口转换为Root Port,同时,连接C的端口转换为A-Port。要注意的是,RSTP相对STP进行了根端口转发的改进,一旦确定了旧的R-Port非转发态,且新的R-Port已确定,则新的R-Port立即进入转发态;

wps_clip_p_w_picpath-18890

(三)此刻B端口仍为Discarding状态,并期望进入Forwarding状态,因此它将从该D-Port发送“Proposal“置位的配置BPDU给E;E接收到该BPDU后,进入同步状态:即将所有转发态端口转为丢弃,并检查端口同步情况;

wps_clip_p_w_picpath-8277

(四)从同步原理可知,E中只有连接D的端口为转发态,因此E继续阻塞该端口,并向B返回”同意“置位的BPDU。自此,B-E链路进入已完成同步,立即进行流量转发;而由于D连接E的端口为A-Port,不转发BPDU,因此E发出的”Proposal“置位BPDU将不会被”Agreement“置位的BPDU回应。该端口将一直保持阻塞态。