STP(Spanning Tree Protocol,生成树协议)是根据IEEE协会制定的802.1D标准建立的,用于在局域网中消除数据链路层物理环路的协议。运行该协议的设备通过彼此交互信息发现网络中的环路,并有选择的对某些端口进行阻塞,最终将环路网络结构修剪成无环路的树型网络结构,从而防止报文在环路网络中不断增生和无限循环,避免设备由于重复接收相同的报文造成的报文处理能力下降的问题发生。
STP包含了两个含义,狭义的STP是指IEEE 802.1D中定义的STP协议,广义的STP是指包括IEEE 802.1D定义的STP协议以及各种在它的基础上经过改进的生成树协议。
STP采用的协议报文是BPDU(Bridge Protocol Data Unit,桥协议数据单元),也称为配置消息。
STP通过在设备之间传递BPDU来确定网络的拓扑结构。BPDU中包含了足够的信息来保证设备完成生成树的计算过程。
BPDU在STP协议中分为两类:
l 配置BPDU(Configuration BPDU):用来进行生成树计算和维护生成树拓扑的报文。
l TCN BPDU(Topology Change Notification BPDU):当拓扑结构发生变化时,用来通知相关设备网络拓扑结构发生变化的报文。
(1) 根桥
树形的网络结构,必须要有树根,于是STP引入了根桥(Root Bridge)的概念。
根桥在全网中只有一个,而且根桥会根据网络拓扑的变化而改变,因此根桥并不是固定的。
网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其它的设备对该配置BPDU进行转发,从而保证拓扑的稳定。
(2) 根端口
所谓根端口,是指一个非根桥的设备上离根桥最近的端口。根端口负责与根桥进行通信。非根桥设备上有且只有一个根端口。根桥上没有根端口。
(3) 指定桥与指定端口
指定桥与指定端口的含义,请参见表1的说明。
分类 | 指定桥 | 指定端口 |
对于一台设备而言 | 与本机直接相连并且负责向本机转发配置消息的设备 | 指定桥向本机转发配置消息的端口 |
对于一个局域网而言 | 负责向本网段转发配置消息的设备 | 指定桥向本网段转发配置消息的端口 |
指定桥与指定端口如图1所示,AP1、AP2、BP1、BP2、CP1、CP2分别表示设备Device A、Device B、Device C的端口。
l Device A通过端口AP1向Device B转发配置消息,则Device B的指定桥就是Device A,指定端口就是Device A的端口AP1;
l 与局域网LAN相连的有两台设备:Device B和Device C,如果Device B负责向LAN转发配置消息,则LAN的指定桥就是Device B,指定端口就是Device B的BP2。
& 说明:
根桥上的所有端口都是指定端口。
(4) 路径开销
路径开销是STP协议用于选择链路的参考值。STP协议通过计算路径开销,选择较为“强壮”的链路,阻塞多余的链路,将网络修剪成无环路的树型网络结构。
STP通过在设备之间传递BPDU来确定网络的拓扑结构。配置消息中包含了足够的信息来保证设备完成生成树的计算过程,其中包含的几个重要信息如下:
l 根桥ID:由根桥的优先级和MAC地址组成;
l 指定桥ID:由指定桥的优先级和MAC地址组成;
l 指定端口ID:由指定端口的优先级和端口名称组成;
& 说明:
为描述方便,在下面的描述及举例中仅考虑配置消息的其中四项内容:
l 根桥ID(以设备的优先级表示);
l 根路径开销;
l 指定桥ID(以设备的优先级表示);
l 指定端口ID(以端口名称表示)。
(1) STP算法实现的具体过程
l 初始状态
各台设备的各个端口在初始时会生成以自己为根桥的配置消息,根路径开销为0,指定桥ID为自身设备ID,指定端口为本端口。
l 最优配置消息的选择
各台设备都向外发送自己的配置消息,同时也会收到其它设备发送的配置消息。
最优配置消息的选择过程如表2所示。
步骤 | 内容 |
1 | 每个端口收到配置消息后的处理过程如下: l 当端口收到的配置消息比本端口配置消息的优先级低时,设备会将接收到的配置消息丢弃,对该端口的配置消息不作任何处理。 l 当端口收到的配置消息比本端口配置消息的优先级高时,设备就用接收到的配置消息中的内容替换该端口的配置消息中的内容。 |
2 | 设备将所有端口的配置消息进行比较,选出最优的配置消息。 |
& 说明:
配置消息的比较原则如下:
l 根桥ID较小的配置消息优先级高;
l 若根桥ID相同,则比较根路径开销,比较方法为:用配置消息中的根路径开销加上本端口对应的路径开销,假设两者之和为S,则S较小的配置消息优先级较高;
l 若根路径开销也相同,则依次比较指定桥ID、指定端口ID、接收该配置消息的端口ID等,上述值较小的配置消息优先级较高。
l 根桥的选择
网络初始化时,网络中所有的STP设备都认为自己是“根桥”,根桥ID为自身的设备ID。通过交换配置消息,设备之间比较根桥ID,网络中根桥ID最小的设备被选为根桥。
l 根端口、指定端口的选择
根端口、指定端口的选择过程如表3所示。
表3 根端口和指定端口的选择过程
步骤 | 内容 |
1 | 非根桥设备将接收最优配置消息的那个端口定为根端口 |
2 | 设备根据根端口的配置消息和根端口的路径开销,为每个端口计算一个指定端口配置消息: l 根桥ID替换为根端口的配置消息的根桥ID; l 根路径开销替换为根端口配置消息的根路径开销加上根端口对应的路径开销; l 指定桥ID替换为自身设备的ID; l 指定端口ID替换为自身端口ID。 |
3 | 设备使用计算出来的配置消息和需要确定端口角色的端口上的配置消息进行比较,并根据比较结果进行不同的处理: l 如果计算出来的配置消息优,则设备就将该端口定为指定端口,端口上的配置消息被计算出来的配置消息替换,并周期性向外发送; l 如果端口上的配置消息优,则设备不更新该端口的配置消息并将此端口阻塞,此端口将不再转发数据,只接收但不发送配置消息。 |
& 说明:
在拓扑稳定状态,只有根端口和指定端口转发流量,其它的端口都处于阻塞状态,它们只接收STP协议报文而不转发用户流量。
一旦根桥、根端口、指定端口选举成功,则整个树形拓扑就建立完毕了。
下面结合例子说明STP算法实现的计算过程。具体的组网如图2所示,Device A的优先级为0,Device B的优先级为1,Device C的优先级为2,各个链路的路径开销分别为5、10、4。
图2 STP算法计算过程组网图
各台设备的初始状态如表4所示。
设备 | 端口名称 | 端口的配置消息 |
Device A | AP1 | {0,0,0,AP1} |
AP2 | {0,0,0,AP2} | |
Device B | BP1 | {1,0,1,BP1} |
BP2 | {1,0,1,BP2} | |
Device C | CP1 | {2,0,2,CP1} |
CP2 | {2,0,2,CP2} |
l 各台设备的比较过程及结果
各台设备的比较过程及结果如表5所示。
表5 各台设备的比较过程及结果
设备 | 比较过程 | 比较后端口的配置消息 |
Device A | l 端口AP1收到Device B的配置消息{1,0,1,BP1},Device A发现本端口的配置消息{0,0,0,AP1}优于接收到的配置消息,就把接收到的配置消息丢弃。 l 端口AP2收到Device C的配置消息{2,0,2,CP1},Device A发现本端口的配置消息{0,0,0,AP2}优于接收到的配置消息,就把接收到的配置消息丢弃。 l Device A发现自己各个端口的配置消息中根桥和指定桥都是自己,则认为自己是根桥,各个端口的配置消息都不作任何修改,以后周期性的向外发送配置消息。 | AP1:{0,0,0,AP1} AP2:{0,0,0,AP2} |
Device B | l 端口BP1收到来自Device A的配置消息{0,0,0,AP1},Device B发现接收到的配置消息优于本端口的配置消息{1,0,1,BP1},于是更新端口BP1的配置消息。 l 端口BP2收到来自Device C的配置消息{2,0,2,CP2},Device B发现本端口的配置消息{1,0,1,BP2}优于接收到的配置消息,就把接收到的配置消息丢弃。 | BP1:{0,0,0,AP1} BP2:{1,0,1,BP2} |
l Device B对各个端口的配置消息进行比较,选出端口BP1的配置消息为最优配置消息,然后将端口BP1定为根端口,它的配置消息不作改变。 l Device B根据根端口BP1的配置消息和根端口的路径开销5,为BP2端口计算一个指定端口配置消息{0,5,1,BP2}。 l Device B使用计算出来的配置消息{0,5,1,BP2}和端口BP2上的配置消息进行比较,比较的结果是计算出来的配置消息较优,则Device B将端口BP2定为指定端口,它的配置消息被计算出来的配置消息替换,并周期性向外发送。 | 根端口BP1: {0,0,0,AP1} 指定端口BP2: {0,5,1,BP2} | |
Device C | l 端口CP1收到来自Device A的配置消息{0,0,0,AP2},Device C发现接收到的配置消息优于本端口的配置消息{2,0,2,CP1},于是更新端口CP1的配置消息。 l 端口CP2收到来自Device B端口BP2更新前的配置消息{1,0,1,BP2},Device C发现接收到的配置消息优于本端口的配置消息{2,0,2,CP2},于是更新端口CP2的配置消息。 | CP1:{0,0,0,AP2} CP2:{1,0,1,BP2} |
经过比较: l 端口CP1的配置消息被选为最优的配置消息,端口CP1就被定为根端口,它的配置消息不作改变。 l 将计算出来的指定端口配置消息{0,10,2,CP2}和端口CP2的配置消息进行比较后,端口CP2转为指定端口,它的配置消息被计算出来的配置消息替换。 | 根端口CP1: {0,0,0,AP2} 指定端口CP2: {0,10,2,CP2} | |
l 接着端口CP2会收到Device B更新后的配置消息{0,5,1,BP2},由于收到的配置消息比原配置消息优,则Device C触发更新过程。 l 同时端口CP1收到Device A周期性发送来的配置消息,比较后Device C不会触发更新过程。 | CP1:{0,0,0,AP2} CP2:{0,5,1,BP2} | |
经过比较: l 端口CP2的根路径开销9(配置消息的根路径开销5+端口CP2对应的路径开销4)小于端口CP1的根路径开销10(配置消息的根路径开销0+端口CP1对应的路径开销10),所以端口CP2的配置消息被选为最优的配置消息,端口CP2就被定为根端口,它的配置消息就不作改变。 l 将端口CP1的配置消息和计算出来的指定端口配置消息比较后,端口CP1被阻塞,端口配置消息不变,同时不接收从Device A转发的数据,直到新的情况触发生成树的计算,比如从Device B到Device C的链路down掉。 | 阻塞端口CP1: {0,0,0,AP2} 根端口CP2: {0,5,1,BP2} |
经过上表的比较过程,此时以Device A为根桥的生成树就确定下来了,形状如图3所示。
& 说明:
为了便于描述,本例简化了生成树的计算过程,实际的过程要更加复杂。
(2) STP的配置消息传递机制
l 当网络初始化时,所有的设备都将自己作为根桥,生成以自己为根的配置消息,并以Hello Time为周期定时向外发送。
l 接收到配置消息的端口如果是根端口,且接收的配置消息比该端口的配置消息优,则设备将配置消息中携带的Message Age按照一定的原则递增,并启动定时器为这条配置消息计时,同时将此配置消息从设备的指定端口转发出去。
l 如果指定端口收到的配置消息比本端口的配置消息优先级低时,会立刻发出自己的更好的配置消息进行回应。
l 如果某条路径发生故障,则这条路径上的根端口不会再收到新的配置消息,旧的配置消息将会因为超时而被丢弃,设备重新生成以自己为根的配置消息并向外发送,从而引发生成树的重新计算,得到一条新的通路替代发生故障的链路,恢复网络连通性。
不过,重新计算得到的新配置消息不会立刻就传遍整个网络,因此旧的根端口和指定端口由于没有发现网络拓扑变化,将仍按原来的路径继续转发数据。如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成暂时性的环路。
(3) STP定时器
STP计算中,需要使用三个重要的时间参数:Forward Delay、Hello Time和Max Age。
l Forward Delay为设备状态迁移的延迟时间。链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新配置消息无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成暂时性的环路。为此,STP采用了一种状态迁移的机制,新选出的根端口和指定端口要经过2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息已经传遍整个网络。
l Hello Time用于设备检测链路是否存在故障。设备每隔Hello Time时间会向周围的设备发送hello报文,以确认链路是否存在故障。
l Max Age是用来判断配置消息在设备内保存时间是否“过时”的参数,设备会将过时的配置消息丢弃。
(1) STP、RSTP存在的不足
STP不能快速迁移,即使是在点对点链路或边缘端口(边缘端口指的是该端口直接与用户终端相连,而没有连接到其它设备或共享网段上),也必须等待2倍的Forward Delay的时间延迟,端口才能迁移到转发状态。
RSTP(Rapid Spanning Tree Protocol,快速生成树协议)是STP协议的优化版。其“快速”体现在,当一个端口被选为根端口和指定端口后,其进入转发状态的延时在某种条件下大大缩短,从而缩短了网络最终达到拓扑稳定所需要的时间。
& 说明:
l RSTP中,根端口的端口状态快速迁移的条件是:本设备上旧的根端口已经停止转发数据,而且上游指定端口已经开始转发数据。
l RSTP中,指定端口的端口状态快速迁移的条件是:指定端口是边缘端口或者指定端口与点对点链路相连。如果指定端口是边缘端口,则指定端口可以直接进入转发状态;如果指定端口连接着点对点链路,则设备可以通过与下游设备握手,得到响应后即刻进入转发状态。
RSTP可以快速收敛,但是和STP一样存在以下缺陷:局域网内所有网桥共享一棵生成树,不能按VLAN阻塞冗余链路,所有VLAN的报文都沿着一棵生成树进行转发。
(2) MSTP的特点
MSTP(Multiple Spanning Tree Protocol,多生成树协议)可以弥补STP和RSTP的缺陷,它既可以快速收敛,也能使不同VLAN的流量沿各自的路径转发,从而为冗余链路提供了更好的负载分担机制。
MSTP的特点如下:
l MSTP设置VLAN映射表(即VLAN和生成树的对应关系表),把VLAN和生成树联系起来。通过增加“实例”(将多个VLAN整合到一个集合中)这个概念,将多个VLAN捆绑到一个实例中,以节省通信开销和资源占用率。
l MSTP把一个交换网络划分成多个域,每个域内形成多棵生成树,生成树之间彼此独立。
l MSTP将环路网络修剪成为一个无环的树型网络,避免报文在环路网络中的增生和无限循环,同时还提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载分担。
l MSTP兼容STP和RSTP。
在图4中的每台设备都运行MSTP。下面将结合图形解释MSTP的一些基本概念。
图4 MSTP的基本概念示意图
(1) MST域
MST域(Multiple Spanning Tree Regions,多生成树域)是由交换网络中的多台设备以及它们之间的网段所构成。这些设备具有下列特点:
l 都启动了MSTP;
l 具有相同的域名;
l 具有相同的VLAN到生成树实例映射配置;
l 具有相同的MSTP修订级别配置;
l 这些设备之间在物理上有链路连通。
例如图4中的区域A0,域内所有设备都有相同的MST域配置:
l 域名相同;
l VLAN与生成树实例的映射关系相同(VLAN 1映射到生成树实例1,VLAN 2映射到生成树实例2,其余VLAN映射到CIST。其中,CIST即指生成树实例0);
l 相同的MSTP修订级别(此配置在图中没有体现)。
一个交换网络可以存在多个MST域。用户可以通过MSTP配置命令把多台设备划分在同一个MST域内。
(2) VLAN映射表
VLAN映射表是MST域的一个属性,用来描述VLAN和生成树实例的映射关系。
例如图4中,域A0的VLAN映射表就是:VLAN 1映射到生成树实例1,VLAN 2映射到生成树实例2,其余VLAN映射到CIST。MSTP就是根据VLAN映射表来实现负载分担的。
(3) IST
IST(Internal Spanning Tree,内部生成树)是MST域内的一棵生成树。
IST和CST(Common Spanning Tree,公共生成树)共同构成整个交换网络的生成树CIST(Common and Internal Spanning Tree,公共和内部生成树)。IST是CIST在MST域内的片段。
例如图4中CIST在每个MST域内都有一个片段,这个片段就是各个域内的IST。
(4) CST
CST是连接交换网络内所有MST域的单生成树。如果把每个MST域看作是一个“设备”,CST就是这些“设备”通过STP协议、RSTP协议计算生成的一棵生成树。
例如图4中红色线条描绘的就是CST。
(5) CIST
CIST是连接一个交换网络内所有设备的单生成树,由IST和CST共同构成。
例如图4中,每个MST域内的IST加上MST域间的CST就构成整个网络的CIST。
(6) MSTI
一个MST域内可以通过MSTP生成多棵生成树,各棵生成树之间彼此独立。每棵生成树都称为一个MSTI(Multiple Spanning Tree Instance,多生成树实例)。
例如图4中,每个域内可以存在多棵生成树,每棵生成树和相应的VLAN对应。这些生成树就被称为MSTI。
(7) 域根
MST域内IST和MSTI的根桥就是域根。MST域内各棵生成树的拓扑不同,域根也可能不同。
例如图4中,区域D0中,生成树实例1的域根为设备B,生成树实例2的域根为设备C。
(8) 总根
总根(Common Root Bridge)是指CIST的根桥。
例如图4中,总根为区域A0内的某台设备。
(9) 域边界端口
域边界端口是指位于MST域的边缘,用于连接不同MST域、MST域和运行STP的区域、MST域和运行RSTP的区域的端口。
在进行MSTP计算的时候,域边界端口在MST实例上的角色和CIST的角色保持一致,即如果域边界端口在CIST上的角色是Master端口,则它在域内所有MST实例上的角色也是Master端口。例如图4中,如果区域A0的一台设备和区域D0的一台设备的第一个端口相连,整个交换网络的总根位于A0内,则区域D0中这台设备上的第一个端口就是区域D0的域边界端口。
(10) 端口角色
在MSTP的计算过程中,端口角色主要有根端口、指定端口、Master端口、Alternate端口、Backup端口等。
l 根端口:负责向根桥方向转发数据的端口。
l 指定端口:负责向下游网段或设备转发数据的端口。
l Master端口:连接MST域到总根的端口,位于整个域到总根的最短路径上。从CST上看,Master端口就是域的“根端口”(把域看作是一个节点)。Master端口在IST/CIST上的角色是根端口,在其它各个实例上的角色都是Master端口。
l Alternate端口:根端口和Master端口的备份端口。当根端口或Master端口被阻塞后,Alternate端口将成为新的根端口或Master端口。
l Backup端口:指定端口的备份端口。当指定端口被阻塞后,Backup端口就会快速转换为新的指定端口,并无时延的转发数据。当开启了MSTP的同一台设备的两个端口互相连接时就存在一个环路,此时设备会将其中一个端口阻塞,Backup端口是被阻塞的那个端口。
端口在不同的生成树实例中可以担任不同的角色。
请参考图5理解上述概念。图中:
l 设备A、B、C、D构成一个MST域。
l 设备A的端口1、端口2向总根方向连接。
l 设备C的端口5、端口6构成了环路。
l 设备D的端口3、端口4向下连接其它的MST域。
(11) 端口状态
MSTP中,根据端口是否学习MAC地址和是否转发用户流量,可将端口状态划分为以下三种:
l Forwarding状态:学习MAC地址,转发用户流量;
l Learning状态:学习MAC地址,不转发用户流量;
l Discarding状态:不学习MAC地址,不转发用户流量。
& 说明:
同一端口在不同的生成树实例中的端口状态可以不同。
端口状态和端口角色是没有必然联系的,表6给出了各种端口角色能够具有的端口状态(“√”表示此端口角色能够具有此端口状态;“-”表示此端口角色不能具有此端口状态)。
端口角色 端口状态 | 根端口 /Master端口 | 指定端口 | Alternate端口 | Backup端口 |
Forwarding | √ | √ | - | - |
Learning | √ | √ | - | - |
Discarding | √ | √ | √ | √ |
MSTP将整个二层网络划分为多个MST域,各个域之间通过计算生成CST;域内则通过计算生成多棵生成树,每棵生成树都被称为是一个多生成树实例。其中实例0被称为IST,其它的多生成树实例为MSTI。MSTP同STP一样,使用配置消息进行生成树的计算,只是配置消息中携带的是设备上MSTP的配置信息。
(1) CIST生成树的计算
通过比较配置消息后,在整个网络中选择一个优先级最高的设备作为CIST的根桥。在每个MST域内MSTP通过计算生成IST;同时MSTP将每个MST域作为单台设备对待,通过计算在域间生成CST。CST和IST构成了整个网络的CIST。
(2) MSTI的计算
在MST域内,MSTP根据VLAN和生成树实例的映射关系,针对不同的VLAN生成不同的生成树实例。每棵生成树独立进行计算,计算过程与STP计算生成树的过程类似,请参见“STP的基本原理”。
MSTP中,一个VLAN报文将沿着如下路径进行转发:
l 在MST域内,沿着其对应的MSTI转发;
l 在MST域间,沿着CST转发。