STP前言
STP,即Spaning-Tree Protocol,生成树协议,它诞生的目的基本是为了解决二层环路问题
STP启动后,STP网络中会选举一个Root Bridge(根桥),并以此为树根来计算出一个无环的STP交换网络
STP交换设备具有五种端口状态和三种端口角色
定义STP的协议为802.1d
STP也是有开销Cost机制的
Root Bridge选举原则
Root Bridge是根据Bridge ID的大小来选举的
Bridge ID有两部分组成:
·Priority优先级(32768+-4096)——高2字节
·MAC地址——低6字节
同样都是越小越优,先根据Priority优先级部分来进行挑战,若两者相同(默认是32768),则使用MAC地址继续挑战,胜者为根
五种端口状态
STP具有五种端口状态,如下:
1)Disable禁用——完全不使能,即关闭
2)Blocking阻塞——不参与流量转发,能持续接收和处理BPDU
3)Listening监听——不参与流量转发,但能接收和发送BPDU
4)Learning学习——不参与流量转发,但能学习地址、接收和发送BPDU
5)Forwarding转发——参与流量转发,完全使能
在华为产品中,STP是魔改版的,所以理论中的Blocking状态在华为中体现为Discarding状态,是为RSTP中的端口状态
三种端口角色
STP具有三种端口角色,如下:
1)Root Port 根端口
2)Designated Port 指定端口
3)Blcoking Port 阻塞端口
上文提过了,在华为产品中,STP是魔改的,所以这里也一样的,理论中的Blocking端口,在华为中体现为Alternate Port,是为RSTP中的端口角色,貌似华为中的普通STP都向RSTP靠拢了
根端口的概述与选举规则
Root Port存在的目的是什么?指定端口和根端口一样都能参与流量的转发,那为什么要分成指定端口和根端口呢?
因为STP生成树网络是有一个依据生成树根路径构造的生成树结构,以此来层层区分上游设备和下游设备,Root端口的对端是上游设备,这就是生成树结构
根端口选举顺序:
1)主要依据根路径开销(Root Path Cost)的大小来选举的,开销越小,距离根桥越近,自然选举权重越高
2)根据上行交换机的桥ID大小来选举,越小越优先
3)根据上行交换机的端口优先级和端口号来选举,都是越小越优端口优先级默认128,可以手动配置,配置命令为在端口视图下键入[stp port priority]。
根交换机的所有活动端口都是指定端口,而在非根交换机中指定端口一般就是根端口选剩下来的。
什么,你说阻塞端口呢?那一般就是在阻塞链路上选举出来的,一般一条阻塞链路有一个指定端口和一个阻塞端口。但是,在阻塞链路上如何选举谁是阻塞端口呢,下面会讲
冗余链路与阻塞端口的选举概述
阻塞链路,一般又叫冗余链路、备用链路,是STP交换网络为了避免环路而临时阻塞的链路,但是这条链路不会永远阻塞,因此这条链路上会选出一个指定端口来在链路上传播生成树网络的信息,因为阻塞端口是处于blocking状态,因此能够处理和接收指定端口发来的BPDU。
如该图,SW1是根桥,SW2是老二,SW3是老三,那么此时,STP网络会将LSW2和LSW3的互联链路给阻塞掉,因此该拓扑的生成树结构是
虚线即是冗余链路,那么冗余链路的选举以及冗余链路上两个端口是如何进行BP和DP选举的呢?
1)冗余链路中的DP与BP是根据桥ID大小来选举的,越小越优先,选举流程如下:
刚开始两个互联端口都是阻塞端口,当网络拓扑发生变化时,会导致STP重新计算生成树,从而触发端口角色重新选举,两个互联端口变为非指定端口,从blocking状态进入listening状态,然后向对端发送携带桥ID与其他参数的BPDU,本地接收到对端发送的BPDU后,比较BPDU中携带的桥ID参数与本地桥ID大小,若本端小,则端口进入指定端口,保持listening状态;本本端大,则端口退回阻塞端口与阻塞状态
知道选举规则就好,流程了解一下
2)冗余链路是根据根路径开销的全局计算来选举的,越小越优先,如下图,
我修改了开销值后,冗余链路迁移到SW1和SW3的互联链路,因为A链路+B链路的根路径开销小于C链路,这是比较重要的,一定要理解
STP的计时器
STP有三种主要的计时器,如下:
1)Hello Time:决定了BPDU的发送周期,默认是2s,用来维护和管理生成树信息
2)Max-age:最大年龄,可以理解为最大生存时间,默认是20s。它的主要作用是用来检测邻居是否还活着,当Max-age计时器超时后仍未收到邻居的信息,则认为邻居失效
3)Forward Delay:转发时延,默认是15s。当你从Listening状态或Learning状态即将转变为下一状态时,需要压制一段时间,这段时间就叫Forward Delay。为什么要压制?是为了让STP交换网络适应拓扑变化,而不至于出现临时的环路。
STP的BPDU报文
STP的BPDU报文有两种类型,一种Configuration BPDU,一种TCN BPDU:
1)Configuration BPDU:即配置BPDU,STP中配置BPDU一般是从上游设备的指定端口往下游设备的根端口发的,在稳定的网络拓扑中,只有根桥会主动发送配置BPDU,非根交换机都是转发根桥的BPDU,它有两个标志位:
1.TCA(Topology Change Ack)位:
发送TCA置位的配置BPDU表示本地已收到下游发送的TCN BPDU,通知下游设备停止发送TCN BPDU。一般TCA是和TC同时置位的
2.TC位(Topology Change)位:
发送TC置位的配置BPDU表示通知下游设备更新本地的桥MAC表项
2)TCN BPDU:全名是Topology Change Notification BPDU,当STP交换网络中某台交换机检测到本地的端口角色或端口状态发生变化时,就会认为STP网络拓扑发生变化,然后就向上游发送TCN BPDU以通知上游设备网络拓扑发生变化
STP拓扑变更机制
流程:当STP交换网络中某台交换机检测到本地的端口角色或端口状态发生变化时,就会认为网络拓扑发生变化,随后通过根端口向上游设备发送TCN BPDU报文,上游设备收到后,回送一个TCA+TC置位的Configuration BPDU,表示响应TCN BPDU,并通知下游设备停止发送TCN BPDU,然后继续沿着生成树结构向上游发送TCN BPDU,以此往复,直到抵达根桥。
根桥收到TCN BPDU后会回送一个TCA+TC置位的Configuration BPDU报文,然后再向下泛洪TC置位的BPDU,通知下游设备更新本地的桥MAC表项
STP存在的问题:
STP对计时器的高依赖:
在STP中端口切换几乎都要依赖计时器,从blocking状态切换到listening状态需要一个forward delay,从listening切换到learning又需要一个forward delay,已知一个forward delay默认是15s,两个就是30s,在如今毫秒级的时代,这已经是超高的延迟了,但是在另一个场景中,甚至还需要50s。
1)非直连场景
非故障端口为DP:
A1链路故障,由于非直连,SW2需要等待一个max-age时间(20s)才会认为根桥故障,然后向SW3发送携带桥ID BPDU来抢根,即让SW3认自己为根,SW3比较SW2中携带的桥ID参数和SW3中缓存的桥ID进行比较,当发现SW2的桥ID比SW1大时,会将BP从blocking状态转为Forward状态,需要经历两个Forward delay时间,即30s,因此,收敛时间为50s
非故障端口为BP:
当B链路故障时,由于B1链路和SW3非直连,因此SW2需要等一个Max age时间才会认为根桥故障,然后BP从blocking状态进入listening就绪,等待两个Forward delay状态后,转变为Forwarding,所以收敛需要50s
2)直连场景
非故障端口为DP:
当A链路故障,由于是直连链路,因此SW2会在一个hello时间内迅速感知并认为根桥故障,然后首先会触发拓扑变化机制,再向SW3发送携带桥ID的BPDU来抢根。SW3比较SW2的桥id与本地缓存的根桥ID,若SW2的桥ID较大,则SW2的BP迅速进入listening状态,并依次经历两个forward delay转变为forwarding状态,SW2的DP端口变为RP
非故障端口为BP:
当B链路故障,由于是直连链路,因此SW3会在一个hello时间内迅速感知并认为根桥故障,然后首先会触发拓扑变化机制,SW3的BP口收到SW2的DP转发的根桥BPDU后经历两个Forward delay时间转变为RP
STP多余的端口状态:
根据前文我们知道,STP有五种端口状态,disabled-blocking-listening-learning-forwarding
但是,到forwarding转发才开始参与流量转发,也就是说,对于用户侧来说,无论是disabled还是learning,都没区别,但是却足足有4个状态。当用户终端接入STP网络中时,从blocking转变为最终的forwarding状态,要经历足足的30s收敛时间