STP是一种用于解决二层环路交换网络环路的协议,在二层以太帧不存在防止环路的机制,一旦存在环路就会造成报文在环路内不断循环和增生,产生广播风暴,从而占用大量的带宽和资源,使网络变得不可用,在这种背景下生成树协议应运而生。生成树协议是一种二层管理协议,它通过有选择性地阻塞网络冗余链路来达到消除二层环路地目的,同时具备链路备份功能。生成树协议和其他协议一样,随着网络地发展而不断更新迭代。最初被广泛运用应用地是IEEE 802.1d-1998 STP,随后以它为基础产生了IEEE 802.1w RSTP(快速生成树协议)和IEEE 802.1s MSTP(多生成树协议)。
生成树协议目的就是为了解决二层交换网络环路问题,在我们部署网路时,为了提高网络地可靠性和冗余性,往往会增加多台交换机并且交换机之间会有多台链路级联。这样做地好处是,就算其中一台交换机发生故障也不会影响网络地正常工作,但是这样地做法同时也会带来环路问题。
假设所有交换机地MAC地址表都为空,PC1与PC2相互通信,PC1将数据帧发给交换机LSW2,LSW2收到数据帧后学习源MAC地址,并根据目的MAC地址查询MAC地址表进行转发,由于MAC地址表中没有目的MAC地址,交换机LSW2会向除了接收端口以外地所有其他端口泛洪数据帧,这样另外两台交换机都能收到数据帧,它们会进行和交换机LSW2一样地操作,学习数据帧源MAC地址并泛洪数据帧,经过多次转发后数据帧又会被转发会交换机LSW2,然后交换机LSW2再继续泛洪,从而形成环路。我们可以思考一下,图中地环路会一直持续下去吗,答案是不会地。因为这是一个由未知单播帧造成的环路,由于交换机MAC地址表中没有这个单播数据帧的目的MAC地址,所以数据帧会被泛洪。当PC2收到数据帧并且进行回复了以后,在交换机LSW3上的MAC地址表中国就有了PC2的MAC地址。交换机LSW3在收到数据帧后便会直接转发给PC2而不是再进行泛洪操作,这样环路也被打破了。但是如果同样的场景换成广播帧(比如ARP广播)会怎么样?会一直环路下去。数据帧不同于IP包,在IP包中可以通过TTL值防止三层环路,而数据帧中没有这种机制,这就会造成二层的永久环路,极大地浪费了网络带宽和设备处理资源,这是网络地灾难,此时交换网络基本瘫痪。
https://blog.csdn.net/weixin_62594100/article/details/123992695https://blog.csdn.net/weixin_62594100/article/details/123992695
(1)STP的作用
STP包含狭义STP和广义STP两个含义,狭义STP是指IEEE 802.1d-1998定义的STP;广义的STP包括IEEE 802.1d-1998定义的STP以及各种在其基础上经过改进的生成树协议,本书中的STP均指狭义STP。
STP的基本思想十分简单。自然界中生长的树是不会出现环路的,如果网络也能够像一颗树一样生长就不会出现环路了。于是,人们在STP中定义了根桥,根端口、指定端口、替代端口和路径开销等概念,通过构造一棵树的方法达到裁剪冗余环路的目的,同时实现链路备份和路径最优化。用于构造这棵树的算法被称为生成树算法。
要实现这些功能,交换机之间必须要进行信息交互,这些信息交互单元被称为BPDU。本书中将生成树协议的协议报文均称为BPDU。STP BPDU是一种二层报文,目的MAC地址是多播地址01-80-C2-00-00-00,所有支持STP的网桥都会接收并处理收到的BPDU报文。该报文中携带了用于生成树计算的所有信息。
(2)STP的工作原理
首先进行根桥的选举。选举依据的是网桥优先级和网桥MAC地址组合而成的网桥ID,网桥ID最小的网桥将成为网络中的根桥,在一个网络中只能有一个根桥,其他交换机都为非根桥,可以把它们统称为下游根桥。根桥的所有端口都连接到下游根桥,所以端口角色都成为指定端口。接下来,连接根桥的下游网桥将各自选择一条“最粗壮”的树枝作为根桥的路径,相应端口的角色就成为根端口。循环该过程到网络的边缘,指定端口和根端口确定之后一颗生成树就生成了。生成树经过一段时间时间(默认值是30秒左右)稳定之后,指定端口和根端口进入转发状态,其他端口进入阻塞状态。STP BPDU报文会定时从各个网桥的指定端口发出以维护链路的状态。如果网络拓扑发生变化,生成树就会重新计算,端口状态也会随之改变。这就是生成树的基本原理。
随着应用的深入和网络技术的发展,STP的缺点在应用中也被暴露了出来。STP的缺点在应用中也被暴露了出来。STP的缺点主要表现在它基于时间进行收敛。
当拓扑发生变化之后,整个网络需要重新执行生成树的收敛计算,而该计算延时称为Forward Delay 转发延时,协议默认值是15秒。在所有网桥收到拓扑变化的消息之前,如果旧拓扑结构中处于转发状态的端口还没有发现自己在新的拓扑中应该停止转发,则可能存在临时环路。为了解决临时环路的问题,STP使用了一种定时器策略,即在端口从阻塞状态到转发状态中间加入侦听和学习状态,两次状态切换的时间长度都是Forward Delay,这两种状态下交换机不转发任何数据帧,这样就可以保证在拓扑状态时不会产生临时环路。但是,这个看似良好的解决方案实际上带来的确实至少两倍Forward Delay的收敛时间,这对某些实时业务(如语言视频)是不能接收的。
生成树协议通过交互BPDU报文来计算一棵无环树,展示了BPDU的报文格式。
Protocol IDentifier |
Protocol Version IDentifier |
BPDU Type |
Flag |
Root IDentifier |
Root Path Cost |
Bridge IDentifier |
Port IDentifier |
Message Age |
Max Age |
Hello Time |
Forward Delay |
字段内容 | 说明 |
Protocol IDentifier(协议ID) | 协议ID=0 |
Protocol Version IDentifier(协议版本ID) | 协议版本标识符: STP——0; RSTP——2; MSTP——3; |
BPDU Type(BPDU类型) | STP BPDU类型有两种: 0x00——STP的配置BPDU 0x80——STP的拓扑改变通告BPDU RSTP/MSTP BPDU类型: 0x02——RST BPDU或者MST BPDU |
Flag(标志位) | Flag由8比特组成,其中STP使用2比特: 第1比特位(左边,高位)——TCA(拓扑改变确认) 最后1比特位(右边,低位)——TC(拓扑改变) |
Root IDentifier(根ID) | 根ID是通告根桥的ID,由8字节组成,前2字节由根桥优先级(优先级默认为32768)+扩展系统ID组成,后6字节标识根桥的背叛MAC地址 |
Root Path Cost(根路径开销) | 指BPDU报文的发送者到达根桥的距离,如果是根桥发送的BPDU报文,该值为0(根桥到自己的距离为0) |
Bridge IDentifier(网桥ID) | BPDU报文发送者的网桥ID,由8字节组成,前2字节由发送者的网桥优先级(优先级默认为32768)+扩展系统ID组成,后6字节标识发送者的背叛MAC地址 |
Port IDentifier(端口ID) | BPDU报文发送者的端口ID,由2字节组成,前1字节标识端口优先级,后一字节标识端口ID |
Message Age(消息老化时间) | 默认值为20秒,等于Max Age,BPDU报文每经过一台交换机转发,该值会加1,用于限制BPDU报文可以传递的范围。该判断过程如下:交换机收到BPDU报文后会将Message Age和Max Age进行对比,如果Message Age大于Max Age,丢弃BPDU报文不转发;如果Message Age小于或等于Max Age,转发BPDU报文,并将Message Age加1 |
Max Age(最大老化时间) | BPDU报文的最大老化时间,默认值为20秒。如果超过20秒没有收到BPDU报文,则认为网络出现故障重新执行STP计算,收敛网络 |
Hello Time(Hello时间) | BPDU报文发送间隔时间,默认值为2秒 |
Forward Delay(转发延时) | Listening(侦听)和Learning(学习)两种状态的持续时间 |
根桥是STP树的根节点,相当于一棵树的树根。要想生成一棵STP树,首先需要选举出树根。根桥是整个交换网络的中心,网络中只能存在一个根桥。通常核心交换机是STP的根交换机。
运行STP的交换机初始启动后都会认为自己是根桥,并在发送的BPDU报文中标识自己为根桥。当交换机从网络中收到其他交换机发送的BPDU报文后,会将BPDU报文中的网桥ID和自己的网桥ID进行对比,交换机不断地交互BPDU报文并对比网桥ID,最终会选举出一台网桥ID最小的交换机为根桥。网桥ID的比较原则是,先比较网桥ID优先级,越小越优先,默认优先级为32728;如果优先级一样,则比较系统MAC地址(而非接口MAC地址),MAC地址越小越优先。
交换机初始化启动后在发送的BPDU报文中都会标识自己为根桥,通过相互交互BPDU报文,比较网桥ID,最终选举出SWA为根桥,因为SWA的网桥ID最小(先比优先级后比MAC地址)。
根桥完成选举后,除被选为根桥的交换机以外其他的交换机都成为非根桥,而每一台非根桥的交换机都需要选举出一个到达根桥的根端口。由根端口来作为该非根桥与根桥之间进行报文交互的端口,一台非根桥交换机上最多只能有一个根端口。
STP通过比较根路径开销来选举根端口,将交换机的端口到根桥的累计开销(即从该端口到达根桥经过的所有链路的开销之和)称为该端口的根路径开销。而交换机本地端口的开销称为PC,该开销的计算与端口速率有关,端口的速率越大,开销越小。
华为默认使用IEEE 802.1t标准计算路径开销,一定要理解根路径开销(RPC)和路径开销(PC)的区别,根路径开销是指交换机的端口到达根桥的路径开销之和。而路径开销是本地端口的开销,是根据端口速率来计算的。
端口RPC计算公式是:BPDU报文中通告的RFC+接收端口的PC。
完成根端口的选举之后,所有的非根桥都需要选举出一个到达根桥的根端口。在上图中,以SWB为例子解释根端口的选举过程。SWB从自己e0/0/2和e0/0/1端口都收到了BPDU报文,根据计算公式,SWB的e0/0/2端口的RPC为20000(即0+20000),e0/0/1的RPC为40000(20000+20000),e0/0/1端口收到的是SWC转发的BPDU报文,在该BPDU报文中通告了SWC自己到达根桥的RPC为20000,所以e0/0/1的RPC为40000。交换机优先选举RPC小的端口成为根端口(根端口可以用RP标识)。采用同样的算法是在SWC上做计算,可知SWC的e0/0/2端口为根端口。
通过上面的实例我们学习了根端口的选举,根端口的选举可以参考以下步骤进行:
1.比较BPDU报文中的根桥ID(RID),优选RID小的(在一个网络中只能存在一个根桥,所以RID都是一致的)。
2.如果RID一致,比较到达根桥的累计路径开销(RPC),优选RPC小的。
3.如果到达根桥的RPC一致,比较BPDU报文发送者(即上游交换机)的网桥ID,优选BID小的。
4.如果发送者的BID一致,比较BPDU报文发送者的端口ID,优选端口ID小的。
5.如果发送者的端口ID一致,比较BPDU报文接收者的本地端口ID,优选本地端口ID小的。
在上图中,通过比较RPC选举根端口,那么在什么场景下执行后面的比较顺序呢?在下图所示的场景中,需要通过比较发送方(SWA)的端口ID选举根端口,即根据发送者端口ID选举根端口。
在上图中,SWA为根桥,那么SWB哪个端口会成为根端口呢?我们可以通过上面的选举步骤来进行选举。
1.比较RID,两个端口收到的BPDU报文中的RID都是SWA,RID一致。
2.比较两个端口到达根桥的RPC,由于两个端口都是G口,计算出到达根桥的RPC都是20000,RPC一致。
3.比较BPDU发送者的BID,都是SWA发送的,也无法比较出结果。
4.比较BPDU发送者的端口ID,SWA从G0/0/1端口发送的BPDU报文中标识的端口ID为1,从G0/0/2端口发送的BPDU报文中标识端口ID为2,SWB通过比较端口ID(先比较端口优先级,如果优先级一致再比较端口ID),最终优选G0/0/2为根端口。
根端口保证了非根桥到根桥路径的唯一性和最优性,为了防止环路在每条链路上还需要选举一个指定端口。首先比较报文到达根桥的累计路径开销(RPC),累计根路径开销最小的端口就是指定端口;如果RPC相同,则比较端口所在交换机自身的网桥ID(BID),网桥ID最小的端口被选举为指定端口。如果通过RPC和BID选举不出指定端口,则比较接收者本地端口ID,本地端口ID最小的被选举为指定端口。
指定端口选举如下图所示,该图描述了指定端口的选举过程。根端口选举后在每条链路上还需要选举一个指定端口。通常根桥的所有端口都是指定端口,和根桥连接的链路无须选举。在下图中,SWB与SWC之间的链路上哪个端口会被选举为指定端口呢?我们套用之前的选举步骤进行选举:
1.比较RPC,SWB的G0/0/2的RPC继承来自G0/0/1,即为20000,SWC的G0/0/2也为20000。该原则无法确定指定接口。
2.比较端口所在交换机的网桥ID(BID),SWB的BID为32768:00-01-02-03-04-BB,SWC的BID为32768:00-01-02-03-04-CC。先比较SWB和SWC的优先级,优先级一样;继续比较系统MAC地址,优选MAC地址小的。由于SWB的MAC地址较小,最终SWB的G0/0/2端口被选举为指定端口。
如果一个端口既不是根端口也不是指定端口,那么该端口会被堵塞,变为替代端口。通常替代端口是根端口的备份,一旦根端口发送故障,替代端口将会升级为根端口。阻塞后的端口只会侦听并接收BPDU报文,但不会发送BPDU报文和数据帧。替代端口如下图所示,在该图中,SWC的G0/0/2端口既不是根端口也不是指定端口,所以SWC的G0/0/2端口为替代端口,不转发用户数据。
将交换机连接终端(计算机、服务器等)的端口配置为边缘端口可以减少端口30秒的转发延时,同时边缘端口的开启和关闭不会造成因网络拓扑改变(TCN BPDU)带来的MAC地址表频繁被老化所导致的短暂广播风暴问题。如果从一个边缘端口收到一个配置BPDU报文,则该边缘端口将丢失边缘端口角色,变成一个普通端口并执行生成树选举。边缘端口支持配置STP安全策略,如BPDU防护和BPDU过滤等安全策略,该策略可以防止边缘端口因接入支持STP的交换机而导致的网络拓扑改变。
边缘端口由于其快速转发的特性,也会出现临时环路问题。例如,将两个边缘端口连接到一起或则接入一台不支持STP的交换机会造成临时环路,临时环路的持续时间为0~2秒,边缘端口收到配置BPDU报文后会放弃边缘端口角色,变成一个普通端口进行生成树选举,从而解决环路问题。
STP有3种端口角色:根端口、指定端口、替代端口。
STP有5种端口状态:Disabled、Listening、Learning、Forwarding、Blocking状态。
1.Disabled状态:禁用状态,端口不处理和转发BPDU报文,也不转发数据帧。
2.Listening状态:侦听状态,端口可以接收和转发BPDU报文,但不能转发数据帧。
3.Learning状态:学习状态,端口接收数据帧并构建MAC地址表,但不转发数据帧。增加Learning状态是为了防止未知单播数据帧造成的临时环路。
4.Forwarding状态:转发状态,端口既可以转发数据帧又可以转发BPDU报文。只有根端口或指定端口才能进入该状态。
5.Blocking状态:阻塞状态,端口仅接收并处理BPDU报文,但不转发BPDU报文和数据帧,此状态是替代端口的最终状态。
STP端口状态转换如下图所示,STP端口状态间的转换条件如下:
1.端口初始化或使能。
2.端口被选为根端口或者指定端口。
3.端口不再是根端口或指定端口。
4.Forwarding Delay计时器超时(15秒)。
5.端口被禁用或链路失效。
STP的交换机端口初始启动后,首先会从Disabled状态进入Blocking状态。在Blocking状态下,端口只能接收和分析BPDU报文,但不能发送BPDU报文。如果端口被选举为根端口或者指定端口,则会进入Listening状态,此时端口接收并且发送BPDU报文,这种状态会持续一个Forward Delay时间,默认为15秒。然后,如果没有因“意外情况”而退回到Blocking状态,则该端口进入到Learning状态,该状态同样会持续一个Forward Delay时间。处于Learning状态的端口可以接收和发送BPDU报文,同时开始构建MAC地址表,为转发用户数据帧做好准备,但是处于Learning状态的端口仍然不能转发数据帧,只是构建MAC地址表。最后,端口由Learning 状态进入Forwarding 状态,开始转发数据帧。在整个状态的迁移过程中,端口一旦被关闭或者发生了链路故障,就会进入Disabled状态。