生成树协议
STP
STP(Spanning Tree Protocol)是用于局域网中消除环路的协议,运行该协议的设备通过彼此交互信息而发现网络中的环路,并适当对某些端口进行阻塞,从而达到消除环路的目的。
STP要解决的问题:环路
广播风暴导致网络不可用
环路产生广播风暴,广播风暴会导致网络不可用。图中,假设交换设备上没有启用STP协议。如果ServerA发出广播请求,那么广播报文将被其他两台交换设备的端口port1接收,并分别从端口port2广播出去,然后端口port2又收到另一台交换设备发过来的广播报文,再分别从两台交换设备的端口port1转发,如此反复,最终导致整个网络资源被耗尽,网络瘫痪不可用。
MAC地址表震荡导致MAC地址表项被破坏
即使是单播报文,也有可能导致交换设备的MAC地址表项混乱,以致破坏交换设备的MAC地址表。
假设图中所示的网络中没有广播风暴,ServerA发送一个单播报文给ServerB,如果此时ServerB临时从网络中移去,那么交换设备上有关ServerB的MAC地址表项也将被删除。此时ServerA发给ServerB的单播报文,将被交换设备S1的端口port1接收,由于S1上没有相应的MAC地址转发表项,该单播报文将被转发到端口port2上,然后交换设备S2的端口port2又收到从对端port2端口发来的单播报文,然后又从port1发出去。同时,交换设备S2的端口port1也会接收ServerA发给ServerB的单播报文,然后又从port2发出去。如此反复,在两台交换设备上,由于不间断地从端口port1、port2收到主机A发来的单播报文,交换设备会不停地修改自己的MAC地址表项,从而引起了MAC地址表的抖动。如此下去,最终导致MAC地址表项被破坏。
STP协议相关概念
一个桥根
STP作为生成树协议,顾名思义就是将环状结构转换成树形结构,树形的网络结构必须有树根,于是STP引入了根桥(Root Bridge)概念。
对于一个STP网络,根桥在全网中只有一个,它是整个网络的逻辑中心,但不一定是物理中心。根桥会根据网络拓扑的变化而动态变化。
网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他设备仅对该报文进行处理,传达拓扑变化记录,从而保证拓扑的稳定。
注:BPDU(Bridge Protocol Data Unit),网桥协议数据单元,是生成树协议定义的一个数据单元,用于各网桥之间的通信。
两种度量
生成树的生成计算有两大基本度量依据:ID和路径开销。
ID
ID又分为:BID(Bridge ID)和PID(Port ID)。
BID:桥ID
IEEE 802.1D标准中规定BID是由桥优先级(Bridge Priority)与桥MAC地址构成。BID桥优先级占据高16位,其余的低48位是MAC地址。
在STP网络中,桥ID最小的设备会被选举为根桥。
PID:端口ID
PID由两部分构成的,高4位是端口优先级,低12位是端口号。
PID只在某些情况下对选择指定端口有作用。端口优先级可以影响端口在指定生成树实例上的角色,详细介绍请见 STP拓扑计算
路径开销
路径开销(Path Cost)是一个端口变量,是STP协议用于选择链路的参考值。STP协议通过计算路径开销,选择较为“强壮”的链路,阻塞多余的链路,将网络修剪成无环路的树形网络结构。
在一个STP网络中,某端口到根桥的路径开销就是所经过的各个桥上的出端口的路径开销累加而成,这个值叫做根路径开销(Root Path Cost)。
三要素选举
从环形网络拓扑结构到树形结构,总体来说有三个要素:根桥、根端口和指定端口。
根桥RB(Root Bridge)
根桥就是网桥ID最小的桥,通过交互配置BPDU协议报文选出最小的BID。
根端口RP(Root Port)
所谓根端口就是去往根桥路径开销最小的端口,根端口负责向根桥方向转发数据,这个端口的选择标准是依据根路径开销判定。在一台设备上所有使能STP的端口中,根路径开销最小者,就是根端口。很显然,在一个运行STP协议的设备上根端口有且只有一个,根桥上没有根端口。
指定端口DP(Designated Port),如下表所示:
分类 | 指定桥 | 指定端口 |
---|---|---|
对于一台设备而言 | 与本机直接相连并且负责向本机转发配置消息的设备 | 指定桥向本机转发配置消息的端口 |
对于一个局域网而言 | 负责向本网段转发配置消息的设备 | 指定桥向本网段转发配置消息的端口 |
举例说明:
- S1通过端口AP1向S2转发配置消息,则S2的指定桥就是S1,指定端口就是S1的端口AP1。
- 与局域网LAN相连的有两台设备:S2和S3,如果S2负责向LAN转发配置消息,则LAN的指定桥就是S2,指定端口就是S2的BP2。
一旦根桥、根端口、指定端口选举成功,则整个树形拓扑建立完毕。在拓扑稳定后,只有根端口和指定端口转发流量,其他的非根非指定端口都处于阻塞(Blocking)状态,它们只接收STP协议报文而不转发用户流量。
四个比较原则
STP选举有四个比较原则,构成消息优先级向量{根桥ID,根路径开销,发送设备BID,发送端口PID }
字段内容 | 简要说明 |
---|---|
根桥ID | 每个STP网络中有且仅有一个根。 |
根路径开销 | 发送配置BPDU的端口到根桥的距离,决定了到根桥的路径开销。 |
发送设备BID | 发送配置BPDU的设备的BID。 |
发送端口PID | 发出配置BPDU的端口的PID。 |
STP网络中的其他设备收到配置BPDU消息后,将比较表中所述的字段,四个基本比较原则如下:
- 最小BID:用来选举根桥。运行STP协议的设备之间根据表中所示根桥ID字段选择最小的BID。
- 最小根路径开销:用来在非根桥上选择根端口。在根桥上,每个端口到根桥的根路径开销都是0。
- 最小发送者BID:当一台运行STP协议的设备要在两个以上根路径开销相等的端口之中选择根端口时,通过STP协议计算,将选择接收到的配置消息中发送者BID较小的那个端口。如 图1 所示,假设S2的BID小于S3的BID,如果S4的A、B两个端口接收到的BPDU里面的根路径开销相等,那么端口B将成为根端口。
- 最小PID:用于在根路径开销相同的情况下,不阻塞最小PID的端口,而是阻塞PID值较大的端口。如 图3 所示的情况下PID才起作用,S1的端口A的PID小于端口B的PID,由于两个端口上收到的BPDU中,根路径开销、发送交换设备BID都相同,所以消除环路的依据就只有PID。
五种端口状态
端口状态 | 目的 | 说明 |
---|---|---|
Forwarding | 端口既转发用户流量也处理BPDU报文。 | 只有根端口或指定端口才能进入Forwarding状态。 |
Learning | 设备会根据收到的用户流量构建MAC地址表,但不转发用户流量。 | 过渡状态,增加Learning状态防止临时环路。 |
Listening | 确定端口角色,将选举出根桥、根端口和指定端口。不转发数据帧,不学习MAC地址表,接收并发送BPDU | 过渡状态。 |
Blocking | 端口仅仅接收并处理BPDU,不发送BPDU,不转发用户流量。 | 阻塞端口的最终状态。 |
Disabled | 端口不仅不处理BPDU报文,也不转发用户流量。 | 端口状态为Down。 |
华为设备缺省情况下使用MSTP,MSTP的端口状态只有三种:
端口状态 | 说明 |
---|---|
Forwarding | 在这种状态下,端口既转发用户流量又处理BPDU报文。 |
Learning | 这是一种过渡状态。在Learning下,交换设备会根据收到的用户流量,构建MAC地址表,但不转发用户流量,所以叫做学习状态。Learning状态的端口处理BPDU报文。 |
Discarding | Discarding状态的端口只接收BPDU报文。 |
影响端口状态的三个因素
Hello Time
运行STP协议的设备发送配置消息BPDU的时间间隔,用于设备检测链路是否存在故障。设备每隔Hello Time时间会向周围的设备发送hello报文,以确认链路是否存在故障。
当网络拓扑稳定之后,该计时器的修改只有在根桥修改后才有效。新的根桥会在发出的BPDU报文中填充适当的字段以向其他非根桥传递该计时器修改的信息。但当拓扑变化之后,TCN BPDU的发送不受这个计时器的管理。
Forward Delay
设备状态迁移的延迟时间。链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新配置消息无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成临时环路。为此,STP采用了一种状态迁移机制,新选出的根端口和指定端口要经过2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息传遍整个网络,从而防止了临时环路的产生。
Forward Delay Timer指一个端口处于Listening和Learning状态的各自持续时间,默认是15秒。即Listening状态持续15秒,随后Learning状态再持续15秒。这两个状态下的端口不转发用户流量,这正是STP用于避免临时环路的关键。
Max Age
端口的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参数表如下:
参数 | 缺省值 | 取值范围 |
---|---|---|
Hello Time | 200厘秒(2秒) | 100~1000 |
Max Age | 2000厘秒(20秒) | 600~4000 |
Forward Delay | 1500厘秒(15秒) | 400~3000 |
STP报文格式
桥ID、路径开销和端口ID等信息,所有这些信息都是通过BPDU协议报文传输,BPDU分为两种报文类型:
- 配置BPDU是一种心跳报文,只要端口使能STP,则配置BPDU就会按照Hello Time定时器规定的时间间隔从指定端口发出。
- TCN BPDU是在设备检测到网络拓扑发生变化时才发出。
BPDU报文被封装在以太网数据帧中,目的MAC是组播MAC:01-80-C2-00-00-00(IP组播对应的地址是我们俗知的01-00-5E-xx-xx-xx),Length/Type字段为MAC数据长度,后面是LLC头,LLC之后是BPDU报文头。以太网数据帧格式如下图所示。
配置BPDU
通常所说的BPDU报文多数指配置BPDU。
在初始化过程中,每个桥都主动发送配置BPDU。但在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他桥在收到上游传来的配置BPDU后,才触发发送自己的配置BPDU。配置BPDU的长度至少要35个字节,包含了桥ID、路径开销和端口ID等参数。只有当发送者的BID或端口的PID两个字段中至少有一个和本桥接收端口不同,BPDU报文才会被处理,否则丢弃。这样避免了处理和本端口信息一致的BPDU报文。
配置BPDU在以下3种情况下会产生:
- 只要端口使能STP,则配置BPDU就会按照Hello Time定时器规定的时间间隔从指定端口发出。(除了Blocking和Disable状态的端口)
- 当根端口收到配置BPDU时,根端口所在的设备会向自己的每一个指定端口复制一份配置BPDU。
- 当指定端口收到比自己差的配置BPDU时,会立刻向下游设备发送自己的BPDU。
BPDU报文格式如下表
域 | 字节 | 说明 |
---|---|---|
Protocol Identifier | 2 | 总是0。 |
Protocol Version Identifier | 1 | 总是0。 |
BPDU Type | 1 | 当前BPDU类型:0x00:配置BPDU。0x80:TCN BPDU。 |
Flags | 1 | 网络拓扑变化标志:最低位=TC(Topology Change,拓扑变化)标志。最高位=TCA(Topology Change Acknowledgment,拓扑变化确认)标志。 |
Root Identifier | 8 | 当前根桥的BID。 |
Root Path Cost | 4 | 本端口累计到根桥的开销。 |
Bridge Identifier | 8 | 本交换设备的BID。 |
Port Identifier | 2 | 发送该BPDU的端口ID。 |
Message Age | 2 | 该BPDU的消息年龄。如果配置BPDU是根桥发出的,则Message Age为0。否则,Message Age是从根桥发送到当前桥接收到BPDU的总时间,包括传输延时等。实际实现中,配置BPDU报文经过一个桥,Message Age增加1。 |
Max Age | 2 | 消息老化年龄。 |
Hello Time | 2 | 发送两个相邻BPDU的时间间隔。 |
Forward Delay | 2 | 控制Listening和Learning状态的持续时间。 |
其中flag字段格式如下,STP只用了最低位和最高位
TCN BPDU
TCN BPDU内容比较简单,只有上表中列出的前3个字段:协议号、版本和类型。类型字段是固定值0x80,长度只有4个字节。
TCN BPDU是指在下游拓扑发生变化时向上游发送拓扑变化通知,直到根节点。TCN BPDU在如下两种情况下会产生:
- 端口状态变为Forwarding状态。
- 指定端口收到TCN BPDU,复制TCN BPDU并发往根桥。
STP拓扑计算
网络中所有的设备使能STP协议后,每一台设备都认为自己是根桥。此时,每台设备仅仅收发配置BPDU,而不转发用户流量,所有的端口都处于Listening状态。所有设备通过交换配置BPDU后,进行选举工作,选出根桥、根端口和指定端口。
BPDU报文的交互过程
如图1所示,用{}标注的四元组表示了由根桥ID(图中以S1_MAC和S2_MAC代表两台设备的BID)、累计根路径开销、发送者BID、发送端口PID构成的有序组。配置BPDU会按照Hello Timer规定的时间间隔来发送。
STP算法实现的基本过程
初始状态
由于每个桥都认为自己是根桥,所以在每个端口所发出的BPDU中,根桥字段都是用各自的BID,Root Path Cost字段是累计的到根桥的开销,发送者BID是自己的BID,端口PID是发送该BPDU端口的端口ID。
选择根桥
网络初始化时,网络中所有的STP设备都认为自己是“根桥”,根桥ID为自身的设备ID。通过交换配置消息,设备之间比较根桥ID,网络中根桥ID最小的设备被选为根桥。
选择根端口和指定端口
根端口和指定端口的选择过程如下 表1 所示。
表1
步骤 过程 1 非根桥设备将接收最优配置消息(最优配置消息的选择过程如[表2]所示)的那个端口定为根端口 2 设备根据根端口的配置消息和根端口的路径开销,为每个端口计算一个指定端口配置消息:根桥ID替换为根端口的配置消息的根桥ID;根路径开销替换为根端口配置消息的根路径开销加上根端口对应的路径开销;发送者BID替换为自身设备的ID;发送端口PID替换为自身端口ID。 3 设备将计算出的配置消息与角色待定端口自己的配置消息进行比较:如果计算出的配置消息更优,则该端口被确定为指定端口,其配置消息也被计算出的配置消息替换,并周期性地向外发送;如果该端口自己的配置消息更优,则不更新该端口的配置消息并将该端口阻塞。该端口将不再转发数据,且只接收不发送配置消息。注意,在华为设备中被阻塞的非指定端口表现为Alternate Port 表2
步骤 过程 1 每个端口将收到的配置消息与自己的配置消息进行比较:如果收到的配置消息优先级较低,则将其直接丢弃,对自己的配置消息不进行任何处理;如果收到的配置消息优先级较高,则用该配置消息的内容将自己配置消息的内容替换掉。 2 设备将所有端口的配置消息进行比较,选出最优的配置消息。
STP实现举例
各设备的初始状态:
配置消息格式是{根桥ID,累计根路径开销,发送者BID,发送端口PID}
STP拓扑比较过程
注:计算出的配置是在当前端口配置信息的基础上,加上链路信息等进行计算的。
根端口在成为根端口前,进行替换端口配置信息时,是将收到的配置信息直接全部替换的;
而指定端口替换信息时,是会将发送者BID和发送端口PID替换成自己的信息的。(因为计算生成的配置中默认是将BID和PID改成自己的信息的,而只有计算生成的配置信息优于本身待定的配置信息时,端口才会成为指定端口,否则将阻塞该端口)
拓扑稳定后,根桥仍然按照Hello Timer规定的时间间隔发送配置BPDU报文,非根桥设备从根端口收到配置BPDU报文,通过指定端口(DP)转发。如果接收到的优先级比自己高的配置BPDU,则非根桥设备会根据收到的配置BPDU中携带的信息更新自己相应的端口存储的配置BPDU信息。(只有DP能转发BPDU,RP和AP只能被动接受)
STP拓扑变化
- 在网络拓扑发生变化后,下游设备会不间断地向上游设备发送TCN BPDU报文。
- 上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文。其它端口也有可能收到TCN BPDU报文,但不会处理。
- 上游设备会把配置BPDU报文中的Flags的TCA位设置1(由此可见TCA是封装在配置BPDU报文中的),然后发送给下游设备,告知下游设备停止发送TCN BPDU报文。
- 上游设备复制一份TCN BPDU报文,向根桥方向发送。
- 重复步骤1、2、3、4,直到根桥收到TCN BPDU报文。
- 根桥把配置BPDU报文中的Flags的TC和TCA位置1后发送,通知下游设备直接删除桥MAC地址表项。
注:
- TCN BPDU报文主要用来向上游设备乃至根桥通知拓扑变化。
- 置位的TCA标记的配置BPDU报文主要是上游设备用来告知下游设备已经知道拓扑变化,通知下游设备停止发送TCN BPDU报文。
- 置位的TC标记的配置BPDU报文主要是上游设备用来告知下游设备拓扑发生变化,请下游设备直接删除桥MAC地址表项,从而达到快速收敛的目的。
根桥故障
上面是官方培训手册给出的分析过程,其中发生的故障并不出现在物理层,例如SW1关闭了STP协议。
而当根桥在物理层发生故障时,SW2和SW3的根端口也就故障(down),这时候SW2和SW3则会直接进行重新选举并且端口会在两个delay time(15s)后恢复转发状态;
而若该拓扑图改变一下,SW2和SW3分别不是直连于根桥SW1,例如中间加了HUB,那么根桥故障,SW2和SW3的根端口实际上感知不到,并没有变down,此时又会如上图分析所示,经过Max Age和两个delay time后才恢复。
因此,30s还是50s的区别,在于非根桥能否直接感知到根桥的失效。
直连链路故障
上图中,SW2的根端口链路故障,但备用端口会不断收到根桥发送的配置BPDU,因此SW2依旧知道根桥存在,所以不会去竞争根桥 ,因此,SW2要做的就是在所有使能了STP端口中选举出一个新的根端口,并将其转换到forwarding状态。在上图这种拓扑图中,自然而然就是将备用端口(阻塞)转换成根端口。其他情况在下面进行分析
非直连链路故障
若链路在物理层故障,SW2的根端口所在链路故障,且同时其他端口无法受到包含根桥ID的配置BPDU,此时SW2会认为根桥故障,会认为自己是根桥,立刻通过DP(指定端口)向SW3发送自己的配置BPDU,希望选举根桥,此时SW3的应答行为分成两种情况:
(一)标准STP(思科):
标准STP协议中,对于受到次优的BPDU,是直接丢弃的,因此在Max Age结束之前,即配置BPDU失效前,SW3的备用端口(ALTER)是不会理会的,直到过了Max Age后,才会进行角色调整,其中SW3的角色由备用端口转为指定端口,端口状态转换成listening,发送从根端口接收到的SW1(根桥)的BPDU,告诉SW2它不应该成为根桥,经过选举后,SW3的AP转变为DP,SW2的DP转变为RP,并且经过30s后端口状态变为forwarding。因此收敛时间为50s。
注意:在标准STP中,只有DP会对次优BPDU进行立即处理回应
(二)华为设备:
当端口收到次优BPDU时,立刻进行角色转变,例如本例中AP转为DP,并发送最优配置BPDU,告诉SW2不应该成为根桥,选举完成后,经过两个delay time将端口状态转换为forwarding。此时这里收敛时间只需要30s,因为不需要等待SW3的AP的配置BPDU失效。这里其实是RSTP中对STP的改进,华为设备在STP中利用了这个改进。
若链路在非物理层故障,此时SW2无法直接感知链路故障,要等待MAX AGE过后,才向SW3发生自己的配置BPDU,希望选举根桥,而此时无论对于思科还是华为来说,SW3的AP同样也过了MAX AGE,已经转变为了DP,则直接发送BPDU进行协商,使得SW2无法成为根桥,且端口成为RP,并且经过两个delay time完成收敛,收敛时间就都为50s。
MAC地址表错误
在交换网络中,交换机依赖MAC地址表转发数据帧。缺省情况下,MAC地址表项的老化时间是300秒。如果生成树拓扑发生变化,交换机转发数据的路径也会随着发生改变,此时MAC地址表中未及时老化掉的表项会导致数据转发错误,因此在拓扑发生变化后需要及时更新MAC地址表项。
本例中,SW2中的MAC地址表项定义了通过端口GigabitEthernet 0/0/1可以到达主机A,通过端口GigabitEthernet 0/0/3可以到达主机B。由于SW3的根端口产生故障,导致生成树拓扑重新收敛,在生成树拓扑完成收敛之后,从主机A到主机B的帧仍然不能到达目的地。这是因为MAC地址表项老化时间是300秒,主机A发往主机B的帧到达SW2后,SW2会继续通过端口GigabitEthernet 0/0/3转发该数据帧。
拓扑变化过程中,根桥通过TCN BPDU报文获知生成树拓扑里发生了故障。根桥生成TC用来通知其他交换机加速老化现有的MAC地址表项。
拓扑变更以及MAC地址表项更新的具体过程如下:
SW3感知到网络拓扑发生变化后,会不间断地向SW2发送TCN BPDU报文。
SW2收到SW3发来的TCN BPDU报文后,会把配置BPDU报文中的Flags的TCA位设置1,然后发送给SW3,告知SW3停止发送TCN BPDU报文。
SW2向根桥转发TCN BPDU报文。
SW1把配置BPDU报文中的Flags的TC位设置为1后发送,通知下游设备把MAC地址表项的老化时间由默认的300 s修改为Forward Delay的时间(默认为15 s,实际上真实物理设备是立即清空)。
最多等待15 s之后,SW2中的错误MAC地址表项会被自动清除。此后,SW2就能重新开始MAC表项的学习及转发操作。
STP配置
RSTP
STP的不足之处
STP协议虽然能够解决环路问题,但是由于网络拓扑收敛慢,影响了用户通信质量。如果网络中的拓扑结构频繁变化,网络也会随之频繁失去连通性,从而导致用户通信频繁中断,这是用户无法忍受的。
STP的不足之处如下:
STP没有细致区分端口状态和端口角色,不利于初学者学习及部署。
网络协议的优劣往往取决于协议是否对各种情况加以细致区分。
从用户角度来讲,Listening、Learning和Blocking状态并没有区别,都同样不转发用户流量。
从使用和配置角度来讲,端口之间最本质的区别并不在于端口状态,而是在于端口扮演的角色。
根端口和指定端口可以都处于Listening状态,也可能都处于Forwarding状态。
STP算法是被动的算法,依赖定时器等待的方式判断拓扑变化,收敛速度慢。
STP算法要求在稳定的拓扑中,根桥主动发出配置BPDU报文,而其他设备进行处理,传遍整个STP网络。
这也是导致拓扑收敛慢的主要原因之一。
RSTP对STP的改进(基本概念)
根据STP的不足,RSTP删除了3种端口状态,新增加了2种端口角色,并且把端口属性充分的按照状态和角色解耦;此外,RSTP还增加了相应的一些增强特性和保护措施,实现网络的稳定和快速收敛。
增添端口角色
从配置BPDU报文发送角度来看:
Alternate端口就是由于学习到其它网桥发送的配置BPDU报文而阻塞的端口。
Backup端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口。
从用户流量角度来看:
Alternate端口提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口。
Backup端口作为指定端口的备份,提供了另一条从根桥到相应网段的备份通路。
给一个RSTP域内所有端口分配角色的过程就是整个拓扑收敛的过程。
- 在STP中用户终端接入交换设备端口状态由Disabled状态转到Forwarding状态需要经过15s,那么用户在这段时间无法上网,如果网络频繁变化,用户上网状态非常不稳定,时断时续。
- 边缘端口一般与用户终端设备直接连接,不与任何交换设备连接。边缘端口正常情况下接收不到配置BPDU报文,不参与RSTP运算,可以由Disabled状态直接转到Forwarding状态,且不经历时延,就像在端口上将STP禁用了一样。但是,一旦边缘端口收到配置BPDU报文,就丧失了边缘端口属性,成为普通STP端口,并重新进行生成树计算,从而引起网络震荡。
简化端口状态
加快处理配置BPDU
快速收敛机制
PA机制
整体过程:
- SW2和SW1都认为自己是根桥,于是互相发送RST BPDU
- SW2收到SW1发送的BPDU后,知道自己不是根桥,并将端口设为RP
- SW1收到SW2的BPDU后,知道了自己是根桥,向SW2端口发送P置位的BPDU,并将DP状态设置为discarding
- SW2收到P置位的BPDU后,将下游端口中非边缘端口全设置为discarding(防止临时环路),并将RP设置为forwarding,向SW1发送A置位的BPDU
- SW1收到A置位的BPDU后,将DP设为forwarding状态
- SW2的下游端口继续执行PA协商。
MSTP中提供了 增强型PA机制
PA机制详细过程如下:引用了曹世宏 文章 中的图片
拓扑变更机制
RSPT报文格式
报文格式基本与STP一致,但其中的TYPE和FLAGS字段改变:
Type字段:配置BPDU类型不再是0而是2,因此运作STP的设备将会丢弃RSTP的配置BPDU报文
Flags字段:使用了原来保留的的中间六位,用来确定端口状态和角色。其中Bit6和Bit1是PA位置
(
用于RSTP的PA机制
)
改变后的配置BPDU称为”RST BPDU"
保护功能
BPDU保护
ROOT保护
- 由于维护人员的错误配置或网络中的恶意攻击,网络中合法根桥有可能会收到优先级更高的RST BPDU,使得合法根桥失去根地位,从而引起网络拓扑结构的错误变动。这种不合法的拓扑变化,会导致原来应该通过高速链路的流量被牵引到低速链路上,造成网络拥塞。
- 注意,Root保护只能在指定端口上配置生效。
在上图的情况中,DeviceA和DeviceB处于网络核心层,两者间的链路带宽为1000M,DeviceA为网络中的根桥。DeviceC处于接入层,DeviceC和DeviceA、DeviceC和DeviceB之间的链路带宽为100M。正常情况下,DeviceB和DeviceC之间的链路被阻塞。
当DeviceD新接入DeviceC时,如果DeviceD的桥优先级高于DeviceA,此时DeviceD会被选举为新的根桥,导致两个核心交换机DeviceA和DeviceB之间的千兆链路被阻塞,会导致VLAN中的流量都通过两条100M链路传输,可能会引起网络拥塞及流量丢失。
因此为了防止这种情况,可以在DeviceC连接DeviceD的端口上,配置根保护。(这里我的理解是,在接入的时候,C连接D的端口是处于DP角色的,因此此时可以设置根保护,防止原根桥角色变化)对于启用根保护功能的指定端口,其端口角色只能保持为指定端口。一旦启用Root保护功能的指定端口收到优先级更高的RST BPDU,端口状态将进入Discarding状态,不再转发报文。如果在一段时间(通常为两倍的Forward Delay)内,如果端口没有再收到优先级更高的RST BPDU,端口会自动恢复到正常的Forwarding状态。
环路保护
TC-BPDU保护
工作过程
**这里说明了只有RP才会响应P/A协商。**这里AP受到的不是次优BPDU,所以不会回复
RSTP配置
MSTP
RSPT/STP的不足
改进
在RSTP上提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡。
MSTP可以将一个或多个VLAN映射到一个Instance(实例)上,再基于Instance计算生成树,映射到同一个Instance的VLAN共享同一个生成树。
如上图,将计算生成两棵树:
Instance1对应的生成树以SW1为根交换设备,转发VLAN1~VLAN10的报文。
Instance2对应的生成树以SW2为根交换设备,转发VLAN11~VLAN20的报文。
不同VLAN的报文沿不同的路径转发,实现了负载分担。
MSTP相关概念
MST Region
同一个MST域的设备具有以下特点:
- 都启动了MSTP
- 具有相同的域名
- 具有相同的VLAN到生成树实例映射配置。
- 具有相同的MSTP修订级别配置。
MSTI(多生成树实例)
Instance0是缺省存在的,缺省时,所有的vlan映射到Instance0上。
- 通过设置VLAN映射表(即VLAN和MSTI的对应关系表),把VLAN和MSTI联系起来。
- 每个VLAN只能对应一个MSTI,即同一VLAN的数据只能在一个MSTI中传输,而一个MSTI可能对应多个VLAN。
个人理解:MSTI是针对于域生成的,因此MSTI应该只属于一个域(MSTI不是由vlan生成的,因此并不是我们一眼看到的MSTI属于很多个域)
CST(公共生成树)
IST(内部生成树)
SST(单生成树)
图中列举的是第二种情况,而第一种情况,在MSTP环境中运行RSTP的设备构成SST,因为只属于MSTI0。
总根、域根和主桥
总结:
端口角色
MSTP的端口角色相较于RSTP,多了两个,分别是Master端口 和 域边缘端口
上图中的SW1应该是某个MSTI的根桥,即MSTI域根
MSTP报文格式
MSTP的报文中Type 跟RSTP一样,都是02
无论是域内还是域间的,MSTP的报文前36字节跟RSTP BPDU 一样
从第37个字节开始是MSTP专有字段。最后的MSTI配置信息字段由若干MSTI配置信息组连缀而成。
字段内容 | 字节 | 说明 |
---|---|---|
Protocol Identifier | 2 | 协议标识符。 |
Protocol Version Identifier | 1 | 协议版本标识符,STP为0,RSTP为2,MSTP为3。 |
BPDU Type | 1 | BPDU类型:0x00:STP的Configuration BPDU0x80:STP的TCN BPDU(Topology Change Notification BPDU)0x02:RST BPDU(Rapid Spanning-Tree BPDU)或者MST BPDU(Multiple Spanning-Tree BPDU) |
CIST Flags | 1 | CIST标志字段。 |
CIST Root Identifier | 8 | CIST的总根交换设备ID。 |
CIST External Path Cost | 4 | CIST外部路径开销指从本交换设备所属的MST域到CIST根交换设备所属的MST域的累计路径开销。CIST外部路径开销根据链路带宽计算。 |
CIST Regional Root Identifier | 8 | CIST的域根交换设备ID,即IST Master的ID。如果总根在这个域内,那么域根交换设备ID就是总根交换设备ID。 |
CIST Port Identifier | 2 | 本端口在IST中的指定端口ID。 |
Message Age | 2 | BPDU报文的生存期。 |
Max Age | 2 | BPDU报文的最大生存期,超时则认为到根交换设备的链路故障。 |
Hello Time | 2 | Hello定时器,缺省为2秒。 |
Forward Delay | 2 | Forward Delay定时器,缺省为15秒。 |
Version 1 Length | 1 | Version1 BPDU的长度,值固定为0。 |
Version 3 Length | 2 | Version3 BPDU的长度。 |
MST Configuration Identifier | 51 | MST配置标识,表示MST域的标签信息,包含4个字段。 |
CIST Internal Root Path Cost | 4 | CIST内部路径开销指从本端口到IST Master交换设备的累计路径开销。CIST内部路径开销根据链路带宽计算。 |
CIST Bridge Identifier | 8 | CIST的指定交换设备ID。 |
CIST Remaining Hops | 1 | BPDU报文在CIST中的剩余跳数。 |
MSTI Configuration Messages(may be absent) | 16 | MSTI配置信息。每个MSTI的配置信息占16 bytes,如果有n个MSTI就占用n×16bytes。 |
MSTP拓扑计算
MSTP可以将整个二层网络划分为多个MST域,各个域之间通过计算生成CST。域内则通过计算生成多棵生成树,每棵生成树都被称为是一个MSTI。其中MSTI 0被称为IST,其他的多生成树实例为MSTI。域内的IST和CST计算生成CIST。MSTP同STP一样,使用配置消息进行生成树的计算,只是配置消息中携带的是设备上MSTP的配置信息。
优先级向量
MSTI和CIST都是根据优先级向量来计算的,这些优先级向量信息都包含在MST BPDU中。各交换设备互相交换MST BPDU来生成MSTI和CIST。
参与CIST计算的优先级向量为:
{ 根交换设备ID,外部路径开销,域根ID,内部路径开销,指定交换设备ID,指定端口ID,接收端口ID }
参与MSTI计算的优先级向量为:
{ 域根ID,内部路径开销,指定交换设备ID,指定端口ID,接收端口ID }
括号中的向量的优先级从左到右依次递减。
向量名 | 说明 |
---|---|
根交换设备ID | 根交换设备ID用于选择CIST中的根交换设备。根交换设备ID = Priority(16bits) + MAC(48bits)。其中Priority为MSTI0的优先级。 |
外部路径开销(ERPC) | 从CIST的域根到达总根的路径开销。MST域内所有交换设备上保存的外部路径开销相同。若CIST根交换设备在域中,则域内所有交换设备上保存的外部路径开销为0。 |
域根ID | 域根ID用于选择MSTI中的域根。域根ID = Priority(16bits) + MAC(48bits)。其中Priority为MSTI0的优先级。 |
内部路径开销(IRPC) | 本桥到达域根的路径开销。域边缘端口保存的内部路径开销大于非域边缘端口保存的内部路径开销。 |
指定交换设备ID | CIST或MSTI实例的指定交换设备是本桥通往域根的最邻近的上游桥。如果本桥就是总根或域根,则指定交换设备为自己。 |
指定端口ID | 指定交换设备上同本设备上根端口相连的端口。Port ID = Priority(4位) + 端口号(12位)。端口优先级必须是16的整数倍。 |
接收端口ID | 接收到BPDU报文的端口。Port ID = Priority(4位) + 端口号(12位)。端口优先级必须是16的整数倍。 |
同一向量比较,值最小的向量具有最高优先级。
如果端口接收到的BPDU内包含的配置消息优于端口上保存的配置消息,则端口上原来保存的配置消息被新收到的配置消息替代。端口同时更新交换设备保存的全局配置消息。反之,新收到的BPDU被丢弃。
CIST的计算
经过比较配置消息后,在整个网络中选择一个优先级最高的交换设备作为CIST的树根(总根)。在每个MST域内MSTP通过计算生成IST;同时MSTP将每个MST域作为单台交换设备对待(每个域的IST域根作为单台交换设备,即域的代表),通过计算在MST域间生成CST。CST和IST构成了整个交换设备网络的CIST。
MSTI的计算
在MST域内,MSTP根据VLAN和生成树实例的映射关系,针对不同的VLAN生成不同的生成树实例。每棵生成树独立进行计算,计算过程与STP计算生成树的过程类似,请参见 STP拓扑计算 。
MSTI的特点:
- 每个MSTI独立计算自己的生成树,互不干扰。
- 每个MSTI的生成树计算方法与STP基本相同。
- 每个MSTI的生成树可以有不同的根,不同的拓扑。
- 每个MSTI在自己的生成树内发送BPDU。
- 每个MSTI的拓扑通过命令配置决定。
- 每个端口在不同MSTI上的生成树参数可以不同。
- 每个端口在不同MSTI上的角色、状态可以不同。
在运行MSTP协议的网络中,一个VLAN报文将沿着如下路径进行转发:
- 在MST域内,沿着其对应的MSTI转发。
- 在MST域间,沿着CST转发。
增强型P/A机制
- 上游设备发送Proposal报文,请求进行快速迁移。下游设备接收到后,把与上游设备相连的端口设置为根端口,并阻塞所有非边缘端口。
- 上游设备继续发送Agreement报文。下游设备接收到后,根端口转为Forwarding状态。
- 下游设备回应Agreement报文。上游设备接收到后,把与下游设备相连的端口设置为指定端口,指定端口进入Forwarding状态。
跟 普通P/A机制 的区别是,增强型在计算同步标志位的时候也在计算根端口,而普通的在计算同步标志位的时候是忽略根端口的,意思是增强型的根端口变为forwarding和阻塞非边缘端口是同时进行的,而普通的是等阻塞完后根端口再变为forwarding状态
MSTP网络数据转发
MSTP多进程
产生背景:
- UPE为汇聚层设备,运行MSTP。
- UPE1和UPE2之间为二层链路。
- UPE1和UPE2下接有多个环,不同环通过不同端口接入。
- 环上的交换设备为接入层设备,只运行STP/RSTP,同时UPE1和UPE2属于不同的运营商,不希望计算在一个生成树中,拓扑变化不能影响对方。
对于MSTP协议标准来说,MSTP支持生成树多实例,但是MSTP支持的多实例必须存在同一个域中,且同一个域中所有设备配置也必须一致。如果不同的设备属于不同的域,那么MSTP在进行生成树计算时,只按一个实例进行计算。所以,当网络内的设备属于不同域时,整个网络只能在一个实例中进行生成树计算,网络内任何一台设备状态发生变化,都将影响整个网络。图1所示组网中与UPE相连的交换设备只支持STP/RSTP协议,不支持MSTP协议。根据MSTP协议标准,UPE收到来自交换设备的RSTP报文后,则认为彼此不属于同一个域。那么UPE和交换设备构成的环只会计算出一个生成树,不能实现各个接入环的相互独立。
MSTP多进程是基于MSTP协议的增强性技术。此技术可将二层交换设备上的端口绑定到不同的进程中,并以进程为单位进行MSTP协议计算,不在同一个进程内的端口不参与此进程中的MSTP协议计算,从而实现各个进程内的生成树计算相互独立,互不影响。因此通过MSTP多进程机制,可将图1所示组网划分为多个MSTP进程,每个进程对应一个交换设备构成的环,每个MSTP进程功能相同,支持生成树多实例,各进程进行MSTP协议计算时相互独立,不会影响到其它进程中的MSTP协议计算。
UPE1和UPE2之间的链路是二层链路,并运行MSTP协议。UPE1和UPE2之间的公共链路和接入交换设备的链路不同在于:公共链路上的端口需要参与多个接入环和多个MSTP进程的计算,这样UPE1和UPE2之间的MSTP协议报文就需要能区分是来自哪个进程的MSTP协议报文。
(也就是接入层设备的端口使用RSTP/STP协议,同时将该端口加入到一个MSTP进程,而接入同层的端口使用MSTP端口,同时将该端口加入到多个MSTP进程)
此外,公共链路上的同一个端口同时参与多个MSTP进程的计算,多个MSTP进程中都会计算出端口状态,这样端口就可能同时存在多个状态,从而无法决定采用哪个生成树的状态。
对于上述情况,公共链路上的端口虽然参与多个MSTP进程的状态计算,但是只具有MSTP进程0的状态,从而不会影响其他MSTP进程。
接入环路形成环路
如果UPE1配置为最高优先级,UPE2配置为次高优先级,交换设备采用默认优先级或配置为更低优先级。当UPE1和UPE2之间链路发生故障后,交换设备上的(根端口替换端口)阻塞端口因不再收到高优先级报文而重新进行状态机计算,新计算的结果是成为指定端口,此时就会产生永久环路
这里的情况是:阻塞端口在S1上,因此当UPE之间的链路故障时,S1将无法受到优级的BPDU,因此会重新计算状态,显而易见,它会成为DP,因此会转发数据。于是如上图的深蓝色虚线所示,会形成环路。
该情况的解决方法是链路聚合,即将UPE之间的链路设置为Eth-Trunk
但如果Eth-Trunk全部都故障,那么还是会出现环路,此时就可以在UPE2配置根保护,使得UPE2的DP进入discarding状态,不转发数据,从而避免了环路的形成。
假设阻塞端口在S1上,当UPE1和UPE2之间的公共链路发生故障后,S1上的阻塞端口因不再收到高优先级BPDU报文而重新进行状态机计算,新计算的结果是该端口成为指定端口,同时和下游设备进行P/A协商。
当与UPE2直连的S1发送的更高优先级的BPDU报文到达UPE2的启动了根保护的端口后,该端口将被阻塞,因为后续会持续收到报文,所以该端口将一直处于阻塞状态。从而保证不会出现环路。
MSTP配置
兼容性
- RSTP模式:设备的所有端口都向外发送RSTP BPDU。当端口收到对端设备发来的STP BPDU时,会自动迁移到STP模式;如果收到的是MSTP BPDU,则不会进行迁移。
- MSTP模式:设备的所有端口都向外发送MSTP BPDU。当端口收到对端设备发来的STP BPDU时,会自动迁移到STP模式;如果收到的是RSTP BPDU,则不会进行迁移。