STP(Spanning Tree Protocol,生成树协议)是用于消除环形网络的广播风暴(数据包在网络中不断循环转圈)和MAC地址表不稳定(MAC地址表不断更改学习到的MAC地址条目)问题,从而实现既能解决环路问题,也能形成备份;STP是IEEE 802.1D标准;
STP协议中涉及了很多术语,例如:根桥、根桥ID、桥ID、路径开销、端口ID、根端口、指定端口、阻塞端口等;
- 根桥:整个生成树的根,全网只有一个根桥(根交换机),便于后续相关角色的选举;
- 根桥ID/桥ID(RID/BID):由优先级与MAC地址两部分组成,优先级范围为0-61440,优先级默认为32768,MAC地址为交换机面板的MAC地址,而非端口上的MAC地址;
- 端口ID(PID):由端口优先级与端口编号两部分组成,优先级范围为0-255,默认为100;
- 路径开销:端口参数,端口到达根桥的开销,根桥的端口开销为0;
- 根端口:负责向根桥发送报文或接受根桥发送的报文,每个交换机只有一个根端口;
- 指定端口:负责发送根桥报文,每一个端口到端口的链路都会选出一个指定端口;
- 阻塞端口:除根端口和指定端口以外的所有端口;
STP端口状态:
端口状态 | 说明 |
---|---|
Disabled | 不接收不转发BPDU报文,不进行MAC地址学习,不转发用户流量 |
Blacking | 只接收BPDU报文,不进行MAC地址学习,不转发用户流量 |
Listening | 接收并转发BPDU报文,不进行MAC地址学习,不转发用户流量 |
Learning | 接收并转发BPDU报文,进行MAC地址学习,不转发用户流量 |
Forwarding | 接收并转发BPDU报文,进行MAC地址学习,转发用户流量 |
注:指定端口和根端口选举后,需要两倍转发延迟后才能到转发状态;
注:Hello Time(Hello定时器):STP设备发送配置BPDU报文的时间间隔,缺省为2s,TCN BPDU不受该定时器控制;
Forwarding Delay(转发延迟):STP设备在listening和Learning端口状态各自停留的时间,缺省为15s,用于防止交换网络在不同状态间频繁切换(例如:在一个时间间隔内频繁的增减设备,使得端口角色不断发生变化,端口状态也不断发生变化;存在转发延迟后,就不会频繁的从Forwarding状态到Blocking,再到Forwarding状态);
Max Age(最大生存时间):端口的BPDU的老化时间,缺省为20s,收到BPDU报文后,会比较**Message Age(消息生存时间)**和Max Age,如果Message Age小于或等于 Max Age,就非根桥设备继续转发,如果Message Age大于 Max Age,就丢弃该报文;
配置BPDU每经过一个桥设备,Message Age数值就会增加1;
根桥选举是比较桥ID,根端口和指定端口是按照下述的比较方式比较的;
- 比较根桥ID(RBID),数值越小越优;
- 如果RBID相同,就比较到达根桥的路径开销(Cost),数值越小越优;
- 如果路径开销相同,就比较发送方的桥ID(中继BID),数值越小越优;
- 如果发送方BID相同,就比较发送方的端口ID(PID),数值越小越优;
- 如果发送方的PID相同,就比较接收方的PID,数值越小越优;(适用于RSTP和MSTP)
BPDU报文分为配置BPDU和TCN BPDU;
配置BPDU是用于计算和维护生成树的报文,是初始阶段中各交换机发送的BPDU;
TCN BPDU是用于生成树拓扑发生变化的报文,下游设备通过该报文通知上游设备拓扑结构发生了变化;
配置BPDU报文格式:
报文字段 | 说明 |
---|---|
Protocol ID | 协议ID字段,数值为0; |
Protocol Version | 协议版本字段,数值“0”表示STP,数值“2”表示RSTP,数值为“3”表示MSTP; |
Message Type | 消息类型字段,标识BPDU报文类型,“0x00”表示配置BPDU,“0x02”表示RST BPDU或MST BPDU,“0x08”表示TCN BPDU; |
Flags | 标识字段,用于表示字段发生了变化,TC为置1表示通知下游设备删除发生变化的MAC地址,TCA位置1表示已确认拓扑发生了变化; |
Root ID | 根桥ID字段,标识当前根桥设备的RID; |
Root Path COST | 根路径开销字段,标识发送给BPDU报文的端口累计到跟根桥的开销; |
Bridge ID | 桥ID字段,标识发送BPDU报文的BID; |
Port ID | 端口ID字段,标识发送该报文端口的PID,即“发送者端口ID” |
Message Age | 消息生存时间字段,标识该BPDU已存在的时间,从根桥接收报文,数值为“0”;实际实现时,配置BPDU每经过一个桥设备,Message Age就会增加1; |
Max Age | 最大生存时间字段,标识报文的最大生存时间,缺省为20s,即老化时间;* |
Hello Time | 发送时间间隔字段,标识配置BPDU发送的时间间隔,缺省为2s; |
Forwarding Delay | 转发延迟字段,控制listening和learning的持续状态,缺省为15s; |
TCN BPDU报文格式:
TCN BPDU报文格式很简单只有上述报文的前三段:协议ID、协议版本和信息类型;
STP的角色选举都遵循STP比较原则。整个STP可以分为初始阶段角色选举和拓扑变化后角色选举。
生成树拓扑结构发生变化后,下游设备就会向上游设备发送TCN BPDU报文,告知上游设备拓扑发送了变化。下游设备会不断发送TCN BPDU报文,只有指定端口接收到该报文才会处理;
拓扑变化后角色选举过程(MAC地址表项重新学习):
- 当下游设备发生拓扑变化时,下游设备会不断向上游设备发送TCN BPDU报文,上游设备的指定端口收到TCN BPDU报文后,会向下游设备回复配置BPDU报文(Flags字段TCA置为1),告知下游设备已知道拓扑发生变化,并且设备会复制TCN BPDU报文,然后发送给上游设备,如此往复,直至发送将TCN BPDU报文发送给根桥设备;
- 根桥设备收到TCN BPDU报文,根桥设备会向下游设备回复配置BPDU报文(flags字段TC置为1),要求下游设备直接删除发生故障端口或发生变化端口的MAC地址表项(删除接收到TCN BPDU报文的指定端口的MAC地址表项),进而达到快速收敛的目的;
注:TCN BPDU报文是用于告知上游设备,生成树拓扑结构发生了变化;
Flags字段的TCA置为1的配置BPDU报文,是上游设备用来告知下游设备已经知道拓扑结构发生了变化;
Flags字段的TC置为1的配置BPDU报文,是根桥设备用来告知下游设备拓扑发生变化,要求下游设备删除发生故障端口或发生变化变化端口的MAC地址表项(删除接收到TCN BPDU报文的指定端口的MAC地址表项);
RSTP(Rapid STP,快速生成树协议)是STP的升级版本,用于解决STP收敛速度慢(Listening和Learning有转发延迟、只有根桥才会发送配置BPDU报文)、端口状态和端口角色划分不合理(某些端口状态功能类似,端口角色与端口状态关联性不强)等问题;RSTP是IEEE 802.1w标准;
RSTP将端口角色更加细化,将阻塞端口划分为Alternate(替代)端口和Backup(备份)端口,新加了Edge(边缘)端口;
端口角色 | 解释说明 |
---|---|
根端口 | 每个非根桥设备都会有一个;用于接收配置BPDU报文; |
指定端口 | 每条端到端链路都会有一个;用于发送配置BPDU报文; |
替代端口 | 用于无延时进入转发状态代替根端口,是对根端口的备份,相当于多了一条接收配置BPDU报文的路径; |
备份端口 | 用于无延时进入转发状态代替指定端口,是对指定端口的备份,相当于多了一条发送配置BPDU报文的路径; |
边缘端口 | 用于主机与STP设备相连的端口;不参与RSTP计算,直接是转发状态;防止主机频繁切换(断开或连接)造成网络拓扑震荡; |
RSTP将STP中某些功能相似的状态合并,使其STP的五个状态合并为RSTP的三个状态,提高了RSTP的收敛速度(状态少了,切换时间也会相应变短);
端口角色 | 角色说明 |
---|---|
Discarding | 不进行MAC地址学习,不转发数据流量 |
Learning | 进行MAC地址学习,不转发数据流量 |
Forwarding | 进行MAC地址学习,转发数据流量 |
RSTP的RST BPDU报文基本与STP的配置BPDU报文相似,较为不同的是Flags字段。
报文字段 | 解释说明 |
---|---|
TCA | 用于告知设备已知道拓扑结构发生了变化; |
Agreement | P/A(提议/确认)机制中的确认快速收敛,Agreement报文; |
Forwarding | 发送报文的端口处于转发状态; |
Learning | 发送报文的端口处于学习状态; |
Port Role | 端口角色,“00”为端口角色未知;“01”为替代端口或备份端口;“10”为根端口;“11”为指定端口; |
Proposal | P/A机制中发起快速收敛的提议报文,Proposal报文; |
TC | 根桥告知下游设备拓扑发生变化并要求删除相应的MAC地址表项; |
常见的Flags数值(仅供了解):
- 2c即0010 1100,表示发送BPDU报文的端口为转发状态,端口角色为指定端口;
- 0e即0000 1110,表示有指定端口发送的Proposal报文;
- 6c即0110 1100,表示发送Agreement报文的端口为转发状态,端口角色为指定端口;
- 2d即0010 1010,表示发送Proposal报文的端口为转发状态,端口角色为根端口;
RSTP取消了TCN BPDU报文,采用更加快捷的方式到达拓扑变化后快速收敛的目的;
RSTP虽然没有TCN BPDU报文,在与STP兼容模式中仍然能够发送和接收TCN BPDU报文(此时RSTP和STP的工作原理为STP),当STP设备完全脱离后,RSTP设备会自动切换为RSTP工作原理,开始快速收敛;
拓扑变化后角色选举的工作过程(MAC地址表项重新学习):
- 当RSTP检测到拓扑结构发生变化(非边缘端口切换到转发状态),本设备就会启动TC While定时器(数值为Hello Time定时器的两倍),在该定时器内,清空发生变化的端口上学习到的MAC地址表项,并由这些发生变化的端口发送**RST BPDU报文(Flags字段的TC置为1)**给其他RSTP设备,TC while超时就停止发送;
- 其他RSTP设备的指定端口收到RST BPDU报文(Flags字段的TC置为1)后,清空所有端口学习到的MAC地址表项,除了接收RST BPDU报文的端口,并为所有非边缘端口启动TC While定时器,重复上述过程直至所有RSTP设备都进行MAC地址表重新学习,提高了收敛速度;
注:接收到RST BPDU报文(Flags字段的TC置为1)的端口,不会再从该端口发送RST BPDU报文(Flags字段的TC置为1);
- 每台RSTP的设备指定端口都可以发送配置BPDU报文;
- 如果一个端口连续3倍hello定时器内没有收到上游发送的RST BPDU报文,就认为邻居之间协商失败;
Proposal/Agreement机制是为了实现快速收敛,减少端口状态切换的时间;P/A是在点到点链路里;
P/A的端口变量协商过程:
- Proposing(请求提议):当一个设备的指定端口处于discarding或learning状态时,端口的proposal变量置位,并向下游设备发送RST BPDU报文(Flags字段的Proposal置为1),用于请求快速切换到转发状态;
- Proposed(请求采纳):当下游设备的根端口收到上述RST BPDU报文(Flags字段的Proposal置为1),接收报文的端口proposed变量置位,表示本链路的指定端口希望尽快进入转发状态;
- Sync(同步请求):当根端口proposed变量置位,本设备的其他端口都要将sync变量置位,使得非边缘端口都进入discarding状态(阻塞其他非边缘端口),准备重新同步;
- Synced(同步完成):当非边缘端口处于discarding状态,其他端口都将synced变量置位,根端口监测到所有非边缘端口都将synced置位后,也会将自己的synced变量置位,然后向上根端口所连接的链路发送RST BPDU(flags字段的Agreement置为1);
- Agreed(提议确认):上游设备收到RST BPDU(flags字段的Agreement置为1)后,会将接收到该报文的端口agreed变量置位,并立即进入Forwarding转发状态;
按照上述步骤,依次将非边缘端口(处于discarding状态)快速切换到Forwarding状态,直至整个RSTP网络都调整完毕;
MSTP(Multiple STP,多生成树协议)是可以实现快速收敛,又能使不同VLAN的流量按照不同的路径转发,从而为冗余链路提供更好的负载分担机制;每一个区域叫做MST域(多生成树域),每个域中包含的多颗生成树叫MSTI(多生成树实例),每一颗生成树采用RSTP算法生成;
注:MSTP仅需了解基本概念,以及同一MST域下不同MSTI配置。BPDU报文也只需要了解即可
MSTP协议相对于RSTP协议多了Master(主)端口和域边缘端口;
端口角色 | 解释说明 |
---|---|
根端口 | 每个非根桥设备都会有一个;用于接收配置BPDU报文; |
指定端口 | 每条端到端链路都会有一个;用于发送配置BPDU报文; |
替代端口 | 用于无延时进入转发状态代替根端口,是对根端口的备份,相当于多了一条接收配置BPDU报文的路径; |
备份端口 | 用于无延时进入转发状态代替指定端口,是对指定端口的备份,相当于多了一条发送配置BPDU报文的路径; |
边缘端口 | 用于主机与STP设备相连的端口;不参与RSTP计算,直接是转发状态;防止主机频繁切换(断开或连接)造成网络拓扑震荡; |
主端口 | MST域和总根之间最短路径的端口,MST域内的报文去往总根都需要经过该端口;主端口是特殊的域边缘端口,也是CST/CIST的根端口; |
域边缘端口 | 位于MST域边缘且与其他MST域或SST相连的端口;域边缘端口的角色在MSTI和CIST上保持一致,即该端口在CIST里是Master端口,则该端口在所有MSTI内都是Master端口; |
- 比较总根桥ID,数值越小越优;
- 如果总根桥ID相同,就比较到达总根桥的外部路径开销(ERPC),数值越小越优;
注:外部开销是计算MST域外主端口到总根的开销(MST域内部设备到达域根桥的开销不计算);内部路径开销是计算MST域内非域根桥到达域根桥的开销;- 如果外部路径开销相同,就比较域根桥ID(RBID),数值越小越优;
- 如果RBID相同,就比较到达根桥的内部路径开销(IRPC),数值越小越优;
- 如果路径开销相同,就比较发送方的桥ID(中继BID),数值越小越优;
- 如果发送方BID相同,就比较发送方的端口ID(PID),数值越小越优;
- 如果发送方的PID相同,就比较接收方的PID,数值越小越优;(适用于RSTP和MSTP)
首先在经过配置BPDU报文比较后,在整个MSTP网络中选举出BID数值最小的交换机作为CIST的总根,然后在MST域内通过MSTP算法计算出IST的所有端口角色,同时MSTP网络将每个MST域作为单独的节点通过STP或RSTP算法计算出CST,最终CST和IST组合成整个MSPT网络的CIST;
每个MSTI当做单独RST或STP计算出生成树;
报文字段 | 字节/Bytes | 解释说明 |
---|---|---|
Version1 length=0 | 1 | Version1的BPDU报文长度,固定为0; |
Version3 length | 1 | Version3的BPDU报文长度; |
MST configuration Identifier | 51 | MST域配置标识符字段,表示MST域的标签;只有配置相同的MST标识符才会处于同一个MST域;下列有该字段的详细内容; |
CIST interval Root Path Cost | 4 | CIST内部路径开销字段,标识发送配置BPDU报文的端口到达根桥(Master端口)的累积路径开销; |
CIST Bridge ID | 8 | CIST桥ID字段,标识CIST的指定桥ID,相当于BridgeID字段; |
CIST Remaining Hops | 1 | CIST保持跳数字段,BPDU报文在CIST的剩余字段(每经过一个桥设备数值减一); |
MSTI Configuration Message | 16 | MSTI配置信息字段,每个MSTI的详细信息,用于告知总根该MST域中配置的所有MSTI详细信息;可以包含多个MSTI,下列有该字段的详细内容; |
报文字段 | 解释说明 |
---|---|
Configuration ID Format Selector | 配置标识符格式选择器,固定为0; |
Configuration Name | MST域名,每个MST域有唯一的域名; |
Revision Level | MST配置修订级别; |
Configuration Digest | 配置摘要,利用HMAC-MD5算法将VLAN与实例的映射关系加密为16字节的摘要; |
报文字段 | 解释说明 |
---|---|
MSTI Flags | MSTI标识字段,与上面Flags字段一样; |
MSTI Regional Root Identifier | MSTI域根桥ID字段,表示实例中根桥的ID; |
MSTI Interval Root Path Cost | MSTI内部路径开销字段,表示发送BPDU报文的端口到实例根桥积累的路径开销; |
MSTI Bridge Priority | MSTI桥优先级,表示本设备的桥优先级; |
MSTI Port Priority | MSTI端口优先级,表示本设备的端口优先级; |
MSTI Remaining Hops | BPDU在MSTI中的剩余跳数; |