MSTP技术白皮书
关键词:STP,RSTP,MSTP,快速迁移,多实例,冗余环路,链路备份,负载分担
摘 要:本文主要介绍MSTP的基本概念、MSTP算法的实现、Comware MSTP实现的特色技术以及典型组网方案。
缩略语:
缩略语 | 英文全名 | 中文解释 |
STP | Spanning Tree Protocol | 生成树协议 |
RSTP | Rapid Spanning Tree Protocol | 快速生成树协议 |
MSTP | Multiple Spanning Tree Protocol | 多实例生成树协议 |
CST | Common Spanning Tree | 公共生成树 |
IST | Internal Spanning Tree | 内部生成树 |
CIST | Common and Internal Spanning Tree | 公共和内部生成树 |
MSTI | Multiple Spanning Tree Instance | 多生成树实例 |
在二层交换网络中,一旦存在环路就会造成报文在环路内不断循环和增生,产生广播风暴,从而占用所有的有效带宽,使网络变得不可用。
在这种环境下STP协议应运而生,STP是一种二层管理协议,它通过有选择性地阻塞网络冗余链路来达到消除网络二层环路的目的,同时具备链路的备份功能。
STP协议和其他协议一样,是随着网络的不断发展而不断更新换代的。最初被广泛应用的是IEEE 802.1D STP,随后以它为基础产生了IEEE 802.1w RSTP、IEEE 802.1s MSTP。
STP协议的基本思想十分简单。自然界中生长的树是不会出现环路的,如果网络也能够像一棵树一样生长就不会出现环路。于是,STP协议中定义了根桥(Root Bridge)、根端口(Root Port)、指定端口(Designated Port)、路径开销(Path Cost)等概念,目的就在于通过构造一棵树的方法达到裁剪冗余环路的目的,同时实现链路备份和路径最优化。用于构造这棵树的算法称为生成树算法(Spanning Tree Algorithm)。
要实现这些功能,网桥之间必须要进行一些信息的交互,这些信息交互单元就称为配置消息BPDU(Bridge Protocol Data Unit)。STP BPDU是一种二层报文,目的MAC是多播地址01-80-C2-00-00-00,所有支持STP协议的网桥都会接收并处理收到的BPDU报文。该报文的数据区里携带了用于生成树计算的所有有用信息。
STP的工作过程是:首先进行根桥的选举。选举的依据是网桥优先级和网桥MAC地址组合成的桥ID,桥ID最小的网桥将成为网络中的根桥,它的所有端口都连接到下游桥,所以端口角色都成为指定端口。接下来,连接根桥的下游网桥将各自选择一条 “最粗壮”的树枝作为到根桥的路径,相应端口的角色就成为根端口。循环这个过程到网络的边缘,指定端口和根端口确定之后一棵树就生成了。生成树经过一段时间(默认值是30秒左右)稳定之后,指定端口和根端口进入转发状态,其他端口进入阻塞状态。STP BPDU会定时从各个网桥的指定端口发出,以维护链路的状态。如果网络拓扑发生变化,生成树就会重新计算,端口状态也会随之改变。这就是生成树的基本原理。
随着应用的深入和网络技术的发展,STP的缺点在应用中也被暴露了出来。STP协议的缺陷主要表现在收敛速度上。
当拓扑发生变化,新的配置消息要经过一定的时延才能传播到整个网络,这个时延称为Forward Delay,协议默认值是15秒。在所有网桥收到这个变化的消息之前,若旧拓扑结构中处于转发的端口还没有发现自己应该在新的拓扑中停止转发,则可能存在临时环路。为了解决临时环路的问题,STP使用了一种定时器策略,即在端口从阻塞状态到转发状态中间加上一个只学习MAC地址但不参与转发的中间状态,两次状态切换的时间长度都是Forward Delay,这样就可以保证在拓扑变化的时候不会产生临时环路。但是,这个看似良好的解决方案实际上带来的却是至少两倍Forward Delay的收敛时间!这在某些实时业务(如语音视频)中是不能接受的。
为了解决STP协议的收敛速度缺陷,2001年IEEE定义了基于IEEE 802.1w标准的快速生成树协议RSTP。RSTP协议在STP协议基础上做了三点重要改进,加快了收敛速度(最快可在1秒以内):
(1) 为根端口和指定端口设置了快速切换用的替换端口(Alternate Port)和备份端口(Backup Port)两种角色。当根端口失效的情况下,替换端口就会快速转换为新的根端口并无时延地进入转发状态;当指定端口失效的情况下,备份端口就会快速转换为新的指定端口并无时延地进入转发状态。
(2) 在只连接了两个交换端口的点对点链路中,指定端口只需与下游网桥进行一次握手就可以无时延地进入转发状态。如果是连接了三个以上网桥的共享链路,下游网桥是不会响应上游指定端口发出的握手请求的,只能等待两倍Forward Delay时间进入转发状态。
(3) 直接与终端相连而不与其他网桥相连的端口定义为边缘端口(Edge Port)。边缘端口可以直接进入转发状态,不需要任何延时。由于网桥无法知道端口是否是直接与终端相连,所以需要人工配置。
RSTP协议相对于STP协议的确有很多改进,并且向下兼容STP协议,可以混合组网。但是,RSTP和STP一样同属于单生成树SST(Single Spanning Tree),有它自身的诸多缺陷,主要表现在三个方面:
(1) 由于整个交换网络只有一棵生成树,在网络规模比较大的时候会导致较长的收敛时间。
(2) 因为RSTP是单生成树协议,所有VLAN共享一棵生成树,为了保证VLAN内部可以正常通信,网络内每个VLAN都必须沿着生成树的路径方向连续分布,否则将会出现有的VLAN由于内部链路被阻塞而被分隔开,从而导致VLAN内部无法通信的问题。
(3) 当某条链路被阻塞后将不承载任何流量,无法实现负载均衡,造成了带宽的极大浪费。
这些缺陷都是单生成树无法克服的,于是支持VLAN的多生成树协议MSTP出现了。
多生成树协议MSTP是IEEE 802.1s中定义的一种新型生成树协议,相对于STP和RSTP,优势非常明显。MSTP的特点如下:
l MSTP引入“域”的概念,把一个交换网络划分成多个域。每个域内形成多棵生成树,生成树之间彼此独立;在域间,MSTP利用CIST保证全网络拓扑结构的无环路存在。
l MSTP引入“实例(Instance)”的概念,将多个VLAN映射到一个实例中,以节省通信开销和资源占用率。MSTP各个实例拓扑的计算是独立的(每个实例对应一棵单独的生成树),在这些实例上就可以实现VLAN数据的负载分担。
l MSTP可以实现类似RSTP的端口状态快速迁移机制。
l MSTP兼容STP和RSTP。
在图1中的每台设备都运行MSTP。下面将结合图形解释MSTP的一些基本概念。

图1 MSTP基本概念示意图
(1) MST域
MST域是由交换网络中的多台设备以及它们之间的网段所构成。这些设备具有下列特点:都启动了MSTP;具有相同的域名;具有相同的VLAN到生成树实例映射配置;具有相同的MSTP修订级别配置;这些设备之间在物理上有链路连通。例如,图1中的区域A0就是一个MST域。
(2) VLAN映射表
VLAN映射表是MST域的一个属性,用来描述VLAN和生成树实例的映射关系。例如,图1中MST域A0的VLAN映射表就是:VLAN 1映射到生成树实例1,VLAN 2映射到生成树实例2,其余VLAN映射到CIST。
(3) IST
IST是域内实例0上的生成树。IST和CST共同构成整个交换网络的CIST。IST是CIST在MST域内的片段。图1中,CIST在每个MST域内都有一个片段,这个片段就是各个域内的IST。
(4) CST
CST是连接交换网络内所有MST域的单生成树。如果把每个MST域看作是一个“设备”,CST就是这些“设备”通过STP协议、RSTP协议计算生成的一棵生成树。图1中红色线条描绘的就是CST。
(5) CIST
CIST是连接一个交换网络内所有设备的单生成树,由IST和CST共同构成。图1中,每个MST域内的IST加上MST域间的CST就构成整个网络的CIST。
(6) MSTI
一个MST域内可以通过MSTP生成多棵生成树,各棵生成树之间彼此独立。每棵生成树都称为一个MSTI。例如图1中,每个域内可以存在多棵生成树,每棵生成树和相应的VLAN对应。这些生成树就被称为MSTI。
(7) 域边界端口
域边界端口是指位于MST域的边缘,用于连接不同MST域、MST域和运行STP的区域、MST域和运行RSTP的区域的端口。
(8) 桥ID
由桥的优先级和MAC地址组成。
(9) 总根
总根是指CIST实例中桥ID最优的桥。
外部根路径开销指的是端口到总根的最短路径开销。
(11) 域根
MST域内的IST和每个MSTI的根桥都是一个域根。MST域内各棵生成树的拓扑不同,域根也可能不同。
(12) 内部根路径开销
到域根的最短路径开销。
由指定桥的优先级和MAC地址组成。
由指定端口的优先级和端口号组成。
(15) 端口角色
在MSTP的计算过程中,端口角色有根端口、指定端口、Master端口、Alternate端口和Backup端口。端口在不同的生成树实例中可以担任不同的角色。端口角色示意如图2所示。

l 根端口:负责向根桥方向转发数据的端口。
l 指定端口:负责向下游网段或设备转发数据的端口。
l Master端口:连接MST域到总根的端口,位于整个域到总根的最短路径上。
l Alternate端口:根端口和Master端口的备份端口。当根端口或Master端口被阻塞后,Alternate端口将成为新的根端口或Master端口。
l Backup端口:当开启了MSTP的同一台设备的两个端口互相连接时就存在一个环路,此时设备会阻塞端口ID较小的端口,此阻塞端口称为Backup端口,而另外一个端口则处于转发状态,成为指定端口。Backup端口是指定端口的备份端口,当指定端口被阻塞且无法发送协议报文后,Backup端口的报文超时后就会快速转换为新的指定端口,并无时延的转发数据。
(16) 端口状态
MSTP中,根据端口是否学习MAC地址和是否转发用户流量,可将端口状态划分为以下三种:
l Forwarding状态:学习MAC地址,转发用户流量;
l Learning状态:学习MAC地址,不转发用户流量;
l Discarding状态:不学习MAC地址,不转发用户流量。
各台设备的各个端口在初始时会生成以自己为根桥的配置消息,总根和域根都是本桥ID,外部根路径开销和内部根路径开销全为0,指定桥ID为本桥ID,指定端口为本端口,接收BPDU报文的端口为0。
端口角色的选择原则如表1所示。
端口角色 | 选择原则 |
根端口 | 端口的端口优先级向量优于其指定优先级向量,且设备的根优先级向量取自该端口的根路径优先级向量 |
指定端口 | 端口的指定优先级向量优于其端口优先级向量 |
Master端口 | 域边界根端口在MSTI实例上的角色就是Master端口 |
Alternate端口 | 端口的端口优先级向量优于其指定优先级向量,但设备的根优先级向量不是取自该端口的根路径优先级向量 |
Backup端口 | 端口的端口优先级向量优于其指定优先级向量,但端口优先级向量中的指定桥ID为本设备的桥ID |
& 说明:
l 端口角色的选择原则中涉及到多种优先级向量,这些优先级向量的含义以及计算方法的介绍,请参考“2.2.3 优先级向量计算”。
l 只要端口收到的消息优先级向量优于其端口优先级向量,就会引起所有优先级向量的重新计算,并且也会重新计算每个端口的角色。
所有网桥的MSTP角色都是通过报文中携带的信息计算出来的,其中报文中携带的最重要的信息就是生成树的优先级向量。下面将分别介绍一下CIST优先级向量和MSTI优先级向量的计算方法。
在CIST中优先级向量由总根、外部根路径开销、域根、内部根路径开销、指定桥ID、指定端口ID和接收BPDU报文的端口ID组成。
为了方便后续描述,现做如下假设:
l 初始情况下,网桥B的端口PB对外发送报文中携带的信息如下:总根为RB,外部根路径开销为ERCB,域根为RRB,内部根路径开销为IRCB,指定桥ID为B,指定端口ID为PB,接收BPDU报文的端口ID为PB;
l 网桥B的端口PB收到网桥D的端口PD发送过来的报文中携带的信息如下:总根为RD,外部根路径开销为ERCD,域根为RRD,内部根路径开销为IRCD,指定桥ID为D,指定端口ID为PD,接收BPDU报文的端口ID为PB;
l 网桥B的端口PB收到的网桥D的端口PD发送过来的报文的优先级较高。
根据上述假设,下面将逐一介绍各优先级向量的计算方法。
(1) 消息优先级向量
消息优先级向量是MSTP协议报文中所携带的优先级向量。根据假设,网桥B的端口PB收到的消息优先级向量即为:{RD : ERCD : RRD : IRCD : D : PD : PB}。如果网桥B和网桥D不在同一个域,那么内部根路径开销对网桥B而言是毫无意义的,它会被赋值为0。
(2) 端口优先级向量
在初始情况下,端口优先级向量的信息是以自己为根。端口PB的端口优先级向量为:{RB : ERCB : RRB : IRCB : B : PB : PB}。
端口优先级向量是随端口收到的消息优先级向量更新的:如果端口收到的消息优先级向量优于端口优先级向量,则将端口优先级向量更新为消息优先级向量;否则,端口优先级向量保持不变。由于端口PB收到的消息优先级向量优于端口优先级向量,所以端口优先级向量更新为:{RD : ERCD : RRD : IRCD : D : PD : PB}。
(3) 根路径优先级向量
根路径优先级向量由端口优先级向量计算所得:
l 如果端口的优先级向量来自不同域的网桥,根路径优先级向量的外部根路径开销为端口的路径开销和端口优先级向量的外部根路径开销之和,根路径优先级向量的域根为本桥的域根,内部根路径开销为0。假设网桥B的端口PB的路径开销为PCPB,则端口PB的根路径优先级向量为:{RD : ERCD+ PCPB : B : 0 : D : PD : PB};
l 如果端口优先级向量来自同一域的网桥,根路径优先级向量的内部路径开销为端口优先级向量的内部根路径开销和端口路径开销之和,计算后端口PB的根路径优先级向量为:{RD : ERCD: RRD : IRCD + PCPB : D : PD : PB}。
(4) 桥优先级向量
桥优先级向量中总根ID、域根ID以及指定桥ID都是本桥ID,外部根路径开销和内部根路径开销为0,指定端口ID和接收端口ID也全为0。网桥B的桥优先级向量为:{B : 0 : B : 0 : B : 0 : 0}。
(5) 根优先级向量
根优先级向量是桥优先级向量和所有指定桥ID和本桥ID值不相同的根路径优先级向量的最优值,如果本桥优先级向量比较优,那么本桥就为CIST总根。假设网桥B的桥优先级向量最优,则网桥B的根优先级向量为:{B : 0 : B : 0 : B : 0 : 0}。
(6) 指定优先级向量
端口的指定优先级向量由根优先级向量计算所得,将根优先级向量的指定桥ID替换为本桥ID,指定端口ID替换为自己的端口ID。网桥B的端口PB的指定优先级向量为:{B : 0 : B : 0 : B : PB : 0}。
MSTI的各优先级向量计算的规则和CIST优先级向量计算规则是基本一致的,存在两点区别:
l MSTI优先级向量中没有总根和外部根路径开销,仅由域根、内部根路径开销、指定桥ID、指定端口ID和接收BPDU报文的端口ID组成。
l MSTI只处理来自同一域的消息优先级向量。
下面结合图3的组网对CIST实例的计算过程进行简要说明。假设,网桥的优先级为Switch A优于Switch B,Switch B优于Switch C,4、5、10分别为链路的路径开销。Switch A和Switch B属于同一域,Switch C单独一个域。

图3中各设备的初始情况下对外发送的报文中携带的消息优先级向量如表2所示。
设备 | 端口 | 报文中的消息优先级向量 |
Switch A | AP1 | {A:0:A:0:A:AP1:0} |
AP2 | {A:0:A:0:A:AP2:0} | |
Switch B | BP1 | {B:0:B:0:B:BP1:0} |
BP2 | {B:0:B:0:B:BP2:0} | |
Switch C | CP1 | {C:0:C:0:C:CP2:0} |
CP2 | {C:0:C:0:C:CP2:0} |
设备各端口的端口优先级向量与消息优先级向量在初始情况下是保持一致的。
在初始情况下各设备的端口都会被计算为指定端口且对外发送以自己为根桥的消息优先级向量。
Switch A的端口AP1和端口AP2会分别收到来自Switch B和Switch C的报文,Switch A会将端口AP1以及AP2的端口优先级向量和收到的来自其它交换机的消息优先级向量进行比较,由于AP1和AP2的端口优先级向量优于报文中携带的消息优先级向量,端口AP1和AP2端口角色不变仍为指定端口,设备Switch A为总根且为Switch A和Switch B所在域的域根。此后端口定时对外传播以自己为根的消息。
& 说明:
端口优先级向量和消息优先级向量的比较、处理过程为:
l 逐一比较端口优先级向量和消息优先级向量中的各元素,元素值较小的优先级向量较优,当各元素都相等时,端口优先级向量和消息优先级向量相等;
l 当消息优先级向量优于端口优先级向量或者消息优先级向量中的指定桥ID的桥MAC和指定端口ID分别和端口优先级向量中的指定桥ID的桥MAC和指定端口ID一致时,用消息优先级向量替换端口优先级向量。
Switch B的端口BP1收到来自Switch C的端口CP1的报文后,将消息优先级向量和端口优先级向量比较,由于端口优先级向量优于消息优先级向量,端口角色不更新。
Switch B的端口BP2收到来自Switch A的端口AP2的报文后,处理过程如下:
(1) 将端口的消息优先级向量和端口优先级向量进行比较。由于端口的消息优先级向量优于端口优先级向量,将端口的端口优先级向量更新为消息优先级向量{A:0:A:0:A:AP2:BP2};
(2) 计算端口的根路径优先级向量。Switch A和Switch B在同一域内,端口的根路径优先级向量为{A:0:A:10:A:AP2:BP2};
(3) 计算Switch B的根优先级向量。只有端口BP2的根路径优先级向量是来自其它设备,由于端口BP2的根路径优先级向量优于Switch B的桥优先级向量,Switch B的根优先级向量为{A:0:A:10:A:AP2:BP2};
(4) 指定优先级向量计算。端口BP1的指定优先级向量为{A:0:A:10:B:BP1:BP2},端口BP2的指定优先级向量为{A:0:A:10:B:BP2:BP2}。
端口角色的确定:将端口BP1和BP2的指定优先级向量和端口优先级向量进行比较,由于BP1的指定优先级向量优于端口优先级向量,则BP1角色为指定端口,定时对外发送以Switch A为总根和域根的指定优先级向量{A:0:A:10:B:BP1:BP2};由于BP2的端口优先级向量优于指定优先级向量、且根优先级向量取自端口BP2的根路径优先级向量,则BP2角色为根端口。
Switch C的端口CP1收到来自Switch B未更新前的消息优先级向量{B:0:B:0:B:BP1:CP1},端口CP2收到来自Switch A的消息优先级向量{A:0:A:0:A:AP1:CP2},经过分别比较,CP1和CP2的消息优先级向量均优于端口优先级向量,因此分别更新CP1和CP2的端口优先级向量为{B:0:B:0:B:BP1:CP1}和{A:0:A:0:A:AP1:CP2}。由于Switch C与Switch A和Switch B不在同一域,端口CP1的根路径优先级向量为{B:5:C:0:B:BP1:CP1},端口CP2的根路径优先级向量为{A:4:C:0:A:AP1:CP2},CP2的根路径优先级向量优于CP1的根路径优先级向量,则根优先级向量为{A:4:C:0:A:AP1:CP2}。端口CP1和CP2的指定优先级向量分别为{A:4:C:0:C:CP1:CP2}和{A:4:C:0:C:CP2:CP2},端口CP1被计算为指定端口,CP2被计算为根端口。
Switch C的端口CP1收到来自BP1更新后的消息优先级向量{A:0:A:10:B:BP1:CP1}后,经过比较CP1的消息优先级向量优于端口优先级向量,更新端口优先级向量为{A:0:A:10:B:BP1:CP1},端口CP1计算后的根路径优先级向量为{A:5:C:0:B:BP1:CP1}。由于端口CP2收到的消息优先级向量没有变化,根据前面的计算,端口CP2的根路径优先级向量保持为{A:4:C:0:A:AP1:CP2},CP2的根路径优先级向量优于CP1的根路径优先级向量,则根优先级向量为{A:4:C:0:A:AP1:CP2}。端口CP1和CP2的指定优先级向量分别为{A:4:C:0:C:CP1:CP2}和{A:4:C:0:C:CP2:CP2}。CP1的端口优先级向量优于其指定优先级向量、但根优先级向量不是取自端口CP1的根路径优先级向量,故CP1角色为Alternate端口。CP2仍为根端口。
设备和端口的角色确定之后,整个树形拓扑就建立完毕了。经过上述计算后的流量转发线路如图4所示。

MSTP和RSTP能够互相识别对方的协议报文,而STP无法识别MSTP的报文,MSTP为了实现和STP设备的混合组网,同时完全兼容RSTP,设定了三种工作模式:STP兼容模式、RSTP模式、MSTP模式。
l 在STP兼容模式下,设备的各个端口将向外发送STP BPDU报文;
l 在RSTP模式下,设备的各个端口将向外发送RSTP BPDU报文,当发现与运行STP的设备相连时,该端口会自动迁移到STP兼容模式下工作;
l 在MSTP模式下,设备的各个端口将向外发送MSTP BPDU报文,当发现与运行STP的设备相连时,该端口会自动迁移到STP兼容模式下工作。
工作在RSTP/MSTP模式的设备可以自动迁移到STP兼容模式下工作,但是工作在STP兼容模式下的设备不能自动迁移到RSTP/MSTP模式,此时需要用户执行mCheck操作来迫使工作模式发生迁移。假设在一个交换网络中,运行MSTP(或RSTP)的设备的端口连接着运行STP的设备,该端口会自动迁移到STP兼容模式下工作;但是此时如果运行STP协议的设备被拆离,该端口不能自动迁移到MSTP(或RSTP)模式下运行,仍然会工作在STP兼容模式下。此时可以通过执行mCheck操作迫使其迁移到MSTP(或RSTP)模式下运行。
在STP兼容模式和RSTP模式下可以配置多实例,MSTI各端口状态和CIST保持一致。为了减小CPU的负担,建议在STP和RSTP模式下最好不要配置多实例。
Comware MSTP支持3种Path Cost缺省值的计算方法:IEEE 802.1D-1998标准方法、IEEE 802.1T标准方法和Comware的私有计算方法。
IEEE 802.1D-1998和IEEE 802.1T标准的Path Cost缺省值的基本计算请参考协议文本,下面主要介绍对标准协议的一些扩充以及Comware的私有计算方法。
(1) 对IEEE 802.1D-1998标准方法的扩充
对于聚合链路,IEEE 802.1D-1998并没有具体的规定,它没有区分聚合链路和单端口链路的优先级别的不同,因此对于IEEE 802.1D-1998中聚合链路STP的Path Cost值不用考虑聚合链路数。
(2) 对IEEE 802.1T标准方法的扩充
IEEE 802.1T Path Cost计算标准中,端口Path Cost值计算公式为:20,000,000,000 / Link Speed in Kbps,聚合链路速率为聚合链路中所有选中端口速率相加。
(3) Comware的私有计算方法

聚合链路速率为所有unblock端口速率相加。
协议中规定,端口收到的STP协议报文超时时间rcvdinfowhile小于等于3倍hello time,超过rcvdinfowhile后端口还未收到STP协议报文就会重新计算STP拓扑。在实际组网中,经常会出现由于端口不能及时收到STP报文导致rcvdinfowhile定时超时而引起网络拓扑震荡,为了解决该问题引入了超时因子。可以根据实际的组网情况设置超时因子,从而改变报文的超时时间,增强网络的稳定性。
超时时间=超时因子×3×hello time。
& 说明:
一般情况下,在稳定的网络中,推荐用户将超时因子设置为5、6或者7。
STP