STP

发布时间 2023-03-23 23:12:29作者: 0x1e61

STP

STP概述

  生成树协议STP(Spanning Tree Protocol)将环形网络修剪成为一个无环的树型网络,避免报文在环形网络中的增生和无限循环。

  在一个复杂的网络环境中,难免会出现环路。由于冗余备份的需要,网络设计者都倾向于在设备之间部署多条物理链路,其中一条作主用链路,其他链路作备份,这样都有可能会导致环路产生。

  环路会产生广播风暴,最终导致整个网络资源被耗尽,网络瘫痪不可用。环路还会引起MAC地址表震荡导致MAC地址表项被破坏。

  为了破除环路,可以采用数据链路层协议STP,运行该协议的设备通过彼此交互信息发现网络中的环路,并有选择的对某个端口进行阻塞,最终将环形网络结构修剪成无环路的树形网络结构,从而防止报文在环形网络中不断循环,避免设备由于重复接收相同的报文造成处理能力下降。

STP原理

  STP通过拥塞冗余路径上的一些端口,确保到达任何目标地址只有一条逻辑路径,STP借用交换BPDU(Bridge Protocol Data Unit,桥接数据单元)来阻止环路,BPDU中包含BID(Bridge ID,桥ID)用来识别是哪台计算机发出的BPDU。在STP运行的情况下,虽然逻辑上没有了环路,但是物理线上还是存在环路的,只是物理线路的一些端口被禁用以阻止环路的发生,如果正在使用的链路出现故障,STP重新计算,部分被禁用的端口重新启用来提供冗余。

  STP使用STA(Spanning Tree Algorithm,生成树算法)来决定交换机上的哪些端口被堵塞用来阻止环路的发生,STA选择一台交换机作为根交换机,称作根桥(Root Bridge),以该交换机作为参考点计算所有路径。

  大白话就是,找到冗余的一端,把它在逻辑上阻塞,避免环路,并且网络在该网络里面出现了问题还可以把这一端重新打开。

STP操作流程

  STP通过构造一棵树来消除交换网络中的环路。

  每个STP网络中,都会存在一个根桥,其他交换机为非根桥。根桥或者根交换机位于整个逻辑树的根部,是STP网络的逻辑中心,非根桥是根桥的下游设备。任何一个节点到根节点的工作路径不仅唯一而且最优。

  当现有根桥产生故障时,非根桥之间会交互信息并重新选举根桥,交互的这种信息被称为BPDU。BPDU中包含交换机在参加生成树计算时的各种参数信息。

端口角色

描 述

Root Port

根端口,是非根交换机去往根交换机路径最优的端口。在一个运行STP协议的交换机上最多只有一个根端口,但根桥上没有根端口。处于转发状态。

Designated Port

指定端口是交换机向所连网段转发配置BPDU的端口,每个网段有且只能有一个指定端口。一般情况下,根桥的每个端口总是指定端口。

Alternate Port

预备端口,如果一个端口既不是指定端口也不是根端口,则此端口为预备端口。预备端口将被阻塞。不向所连网段转发任何数据。

1.选举一个根桥

  STP中根桥的选举依据的是桥ID,STP中的每个交换机都会有一个桥ID(Bridge ID) 。桥ID=16位的桥优先级+48位的MAC地址。

  在STP网络中,桥优先级的取值范围是0~65535,默认值为32768。优先级最高的设备(数值越小越优先)会被选举为根桥。如果优先级相同,则会比较MAC地址,MAC地址越小则越优先。

  交换机启动后就自动开始进行生成树收敛计算(桥ID比较)。

  默认情况下,所有启动STP的交换机启动时都认为自己是根桥,自己的所有端口都为指定端口,这样BPDU报文(桥协议数据单元)就可以通过所有端口转发。当某一个端口收到自己发送的BPDU报文后,会阻塞掉该端口;而对端交换机收到BPDU报文后,会比较BPDU中的根桥ID和自己的桥ID。

  如果收到的BPDU报文中的桥ID优先级低,接收交换机会继续通告自己的配置BPDU报文给邻居交换机。

  如果收到的BPDU报文中的桥ID优先级高,则交换机会修改自己的BPDU报文的根桥ID字段,宣告新的根桥。

  最后会在整个网络中会有一个桥ID最小的交换机,这个交换机就是整个网络的根桥。

2.每个非根交换机选举一个根端口

  非根交换机在选举根端口时分别依据该端口的根路径开销、对端BID(Bridge ID)、对端PID(Port ID)和自身本端PID。一台非根交换机上最多只有一个根端口。

 

  路径开销:交换机的每个端口都有一个端口开销( Port Cost)参数,此参数表示该端口在STP中的开销值。默认情况下端口的开销和端口的带宽有关,带宽越高,开销越小。从一个非根桥到达根桥的路径可能有多条,每一条路径都有一个总的开销值,此开销值是该路径上所有接收BPDU端口的端口开销总和(即BPDU的入方向端口),称为路径开销。

  根路径开销非根桥通过对比多条路径的路径开销,到达根桥的最短路径,这条路径的路径开销被称为RPC(Root Path Cost,根路径开销),并生成无环树状网络。根桥的根路径开销是0。

  对端桥PID:运行STP交换机的每个端口都有一个端口ID,端口ID由端口优先级和端口号(比如E0/0/1)构成。端口优先级取值范围是0到240,步长为16,即取值必须为16的整数倍。越小越优先。缺省情况下,端口优先级是128。端口ID(Port ID)可以用来确定端口角色。

  对端桥BID:每个非根桥都要选举一个根端口。根端口是距离根桥最近的端口,这个最近的衡量标准是靠路径开销来判定的,即路径开销最小的端口就是根端口。端口收到一个BPDU报文后,抽取该BPDU报文中根路径开销字段的值,加上该端口本身的端口开销即为本端口路径开销。如果有两个或两个以上的端口计算得到的累计路径开销相同,那么选择收到发送者BID最小的那个端口作为根端口。

  本机PID:如果两个或两个以上的端口连接到同一台交换机上,则选择发送者PID最小的那个端口作为根端口。如果两个或两个以上的端口通过Hub连接到同一台交换机的同一个接口上,则选择本交换机的这些端口中的PID最小的作为根端口。

3.每个网段选举一个指定端口

  非根交换机在选举指定端口时分别依据根路径开销、本机BID、PID。未被选举为根端口或指定端口的端口为预备端口,将会被阻塞。

  在网段上抑制其他端口(无论是自己的还是其他设备的)发送BPDU报文的端口,就是该网段的指定端口。每个网段都应该有一个指定端口,根桥的所有端口都是指定端口(除非根桥在物理上存在环路)。

  指定端口的选举也是首先比较累计路径开销,累计路径开销最小的端口就是指定端口。——》如果累计路径开销相同,则比较端口所在交换机的桥ID,所在桥ID最小的端口被选举为指定端口。——》如果通过累计路径开销和所在桥ID选举不出来,则比较端口ID,端口ID最小的被选举为指定端口。

  网络收敛后,只有指定端口根端口可以转发数据。其他端口为预备端口,被阻塞,不能转发数据,只能够从所连网段的指定交换机接收到BPDU报文,并以此来监视链路的状态。

4.阻塞非根、非指定端口

  其他端口为预备端口,被阻塞,不能转发数据,只能够从所连网段的指定交换机接收到BPDU报文,并以此来监视链路的状态。

STP相关拓扑图

端口状态转换

STP生成树的五种端口状态

  1.Disabled:禁用状态。端口既不处理和转发BPDU报文,也不转发用户流量。端口会在这种状态下停留10秒钟时间。

  2.Blocking/Discarding:阻塞状态。端口仅仅能接收并处理BPDU,不能转发BPDU,也不能转发用户流量。此状态是预备端口的最终状态。在默认情况下,端口会在这种状态下停留20秒钟时间。

  3.Listening:侦听状态。端口可以转发BPDU报文,但不能转发用户流量。在默认情况下,该端口会在这种状态下停留15秒钟的时间。

  4.Learning:学习状态。端口可根据收到的用户流量构建MAC地址表,但不转发用户流量。增加Learning状态是为了防止临时环路。在默认情况下,端口会在这种状态下停留15秒钟时间。

  5.Forwarding:转发状态。端口既可转发用户流量也可转发BPDU报文,只有根端口或指定端口才能进入Forwarding状态。在默认情况下,端口会在这种状态下停留15秒钟时间。

STP端口状态迁移机制

1 端口初始化或使能;

2 端口被选为根端口或指定端口。

3 端口不再是根端口或指定端口。

4 forward delay计时器超时。

5 端口禁用或链路失效。

 

  STP在启动的时候,端口状态由Disabled转为Blocking,此时端口指定接收分析BPDU,不能发送;

  如果Blocking状态端口被选为根端口或者指定端口,会进入Listening状态,此时端口接收并发送BPDU,这种状态会持续一个Forward Delay时间(缺省15s)

  没有意外情况回到Blocking,端口会进入Learning状态,并持续一个Forward Delay时间(缺省15s),此时端口可以收发BPDU,同时构建MAC地址表,为转发用户数据帧做准备;

  没有意外,端口进入aForwarding状态,开始用户数据帧转发工作;

  状态迁移过程中,一旦端口被关闭或者出现链路故障,进入禁用状态;

  状态迁移过程中,一旦端口不再是根端口或者指定端口,进入阻塞状态;

BPDU报文:

BPDU报文

  为了计算生成树,交换机之间需要交换相关的信息和参数,这些信息和参数被封装在BPDU(Bridge Protocol Data Unit)中。BPDU有两种类型:配置BPDU和TCN BPDU

  配置BPDU包含了桥ID、路径开销和端口ID等参数。STP协议通过在交换机之间传递配置BPDU来选举根交换机,以及确定每个交换机端口的角色和状态。在初始化过程中,每个桥都主动发送配置BPDU。在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他交换机在收到上游传来的配置BPDU后,才会发送自己的配置BPDU。

  TCN BPDU是指下游交换机感知到拓扑发生变化时向上游发送的拓扑变化通知。

配置BPDU中包含了足够的信息来保证设备完成生成树计算,其中包含的重要信息如下:

报文字段

字节数

说明

PID

2字节

STP协议ID,该字段总是为0

PVI

1字节

STP协议版本

  • STP(802.1D)传统生成树,值为0;
  • RSTP(802.1W)快速生成树,值为2;
  • MSTP(802.1S)多生成树,值为3;

BPDU Type

1字节

指示当前BPDU消息类型配置BPDUTCN BPDU

  • 0x00为配置BPDU,负责建立,维护STP拓扑;
  • 0x80为TCN BPDU,传达拓扑变更;

Flags

1字节

标志

  • 最低位=TC(Topology Change,拓扑变化)标志,
  • 最高位=TCA(Topology Change Acknowledgement,拓扑变化确认)标志

Root ID

8字节

根桥ID,指示当前根桥的RID(即“根ID”),由2字节的桥优先级和6字节MAC地址构成

RPC

4字节

根路径开销,指示发送该BPDU报文的端口累计到根桥的开销

Bridge ID

8字节

桥ID,指示发送该BPDU报文的交换设备的BID(即“发送者BID”),也是由2字节的桥优先级和6字节MAC地址构成

Port ID 

2字节

端口ID,指示发送该BPDU报文的端口ID,即“发送端口ID”

Message Age

2字节

消息生存时间,指示该BPDU报文的生存时间,即端口保存BPDU的最长时间,过期后将删除,要在这个时间内转发才有效,如果配置BPDU是直接来自根桥的,则Message Age为0,如果是其他桥转发的,则Message Age是从根桥发送到当前桥接收到BPDU的总时间,包括传输延时等。实际实现中,配置BPDU报文经过一个桥,Message Age增加1,如果Message Age大于Max Age,非根桥会丢弃该配置BPDU。

Max Age

2字节

最大生存时间,指示BPDU消息的最大生存时间,也即老化时间

Hello Time

2字节

Hello消息定时器,指示发送两个相邻BPDU的时间间隔,根桥通过不断发送STP维持自己的地位,Hello time 是发送的间隔时间

Fwd Delay

2字节

转发延时,指示控制listening和learning状态的持续时间,表示在拓扑结构改变后,交换机在发送数据包前维持在监听和学习状态的时间

STP 计时器

  Hello Time是指运行STP协议的设备发送配置BPDU的时间间隔,用于检测链路是否存在故障。交换机每隔Hello Time时间会向周围的交换机发送配置BPDU报文,以确认链路是否存在故障。当网络拓扑稳定后,该值只有在根桥上修改才有效

  Message Age是从根桥发送到当前交换机接收到BPDU的总时间,包括传输延时等。如果配置BPDU是根桥发出的,则Message Age为0。实际实现中,配置BPDU报文每经过一个交换机,Message Age增加1。

  Max Age是指BPDU报文的老化时间,可在根桥上通过命令人为改动这个值。Max Age通过配置BPDU报文的传递,可以保证Max Age在整网中一致。非根桥设备收到配置BPDU报文后,会将报文中的Message Age和Max Age进行比较:如果Message Age小于等于Max Age,则该非根桥设备会继续转发配置BPDU报文。如果Message Age大于Max Age,则该配置BPDU报文将被老化掉。该非根桥设备将直接丢弃该配置BPDU,并认为是网络直径过大,导致了根桥连接失败。

  Forward Delay是指端口状态迁移时间。STP生成树需要一定的时间,如果选出来的根端口或者指定端口马上进入转发状态的话,可能就会造成临时工作环路。forward delay机制:新选出来根端口指定端口需要经过两倍的forward delay时间延时后才可以进入用户数据帧的转发状态,保证此时工作拓扑已无环路。

STP拓扑变化

为什么要有STP拓扑变化机制

  网络中发生拓扑变化时,例如链路中断或接口异常Down等情况,由于MAC地址老化时间的存在(缺省为5分钟),如果不及时通知上游设备,则可能会导致上游设备的报文在这段时间内一直向一个不可达的链路发送。如 图1-1 所示,正常情况下,S1和S2之间的链路被阻塞,由A到B的流量依次流经S1、S3、S4和S2。如果S3和S4之间的链路发生故障,流量则由S1直接转发到S2,但在MAC地址表项老化前,S1上仍然存在指向S3的MAC地址表项,流量也仍会被转发给S3,从而导致流量丢失,因此需要拓扑变化机制将网络拓扑的变更及时通知整个STP网络。

图1-1 MAC地址未老化导致流量丢失

STP拓扑变化处理过程

STP拓扑变化处理过程如 图1-2 所示。

图1-2 TCN的发送和TC的泛洪

  1.T点接口发生变更后,下游设备会不间断地向上游设备发送TCN BPDU报文。

  2.上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文。其它端口也有可能收到TCN BPDU报文,但不会处理。

  3.上游设备会把配置BPDU报文中的Flags的TC位和TCA位同时置1,然后发送给下游设备,告知下游设备停止发送TCN BPDU报文。

  4.上游设备复制一份TCN BPDU报文,向根桥方向发送。

  5.重复步骤1、2、3、4,直到根桥收到TCN BPDU报文。

  6.根桥把配置BPDU报文中Flags的TC位和TCA位同时置1后发送,TC位置1是为了通知下游设备直接删除桥MAC地址表项,TCA位置1是为了通知下游设备停止发送TCN BPDU报文。

说明:

  TCN BPDU报文主要用来向上游设备乃至根桥通知拓扑变化。

  TCA标记置位的配置BPDU报文主要是上游设备用来告知下游设备已经知道拓扑变化,通知下游设备停止发送TCN BPDU报文

  置位的TC标记的配置BPDU报文主要是上游设备用来告知下游设备拓扑发生变化,请下游设备直接删除桥MAC地址表项,从而达到快速收敛的目的。

STP拓扑改变分析

这是STP正常收敛后的情况。

现在我们假设SWA与SWC间的链路故障。

这时,SWC的E0/1端口无法收到根桥SWA发来的BPDU,但E0/2端口会收到SWB转发过来的BPDU,SWC依然知道根桥是SWA。但由于原RP消失,所以需要重新选举RP。E0/2端口由Blocking状态迁移到Listening后,被选举为新的RP,再经过30秒后,迁移到Forwarding状态,开始收发报文。

所以,SWA与SWC间的链路故障,经过30秒后网络恢复。

我们回到开始,SWA与SWC间链路没有故障,假设SWA与SWB间的链路故障。

这时,SWB无法从E0/1端口收到BPDU,也无法从E0/2端口收到(对面SWC的端口E0/2为AP端口,不会发)。这时,SWB在BPDU Max age老化时间20秒内,依然很“忠心”地认为SWA是根桥。过了20秒,SWB认为根桥消失,那自己来做根桥。于是从所有端口发出BPDU,告诉其他人自己是根桥。

SWC收到一看笑了,优先级4096也想当根桥?不知道还有个SWA啊。于是E0/2端口状态由Blocking变成Listening,角色由AP变成DP,把根桥SWA的BPDU转发出去。SWB收到后,原来SWA还在啊,老老实实把E0/2端口变成RP。SWC的E0/2端口经过30秒延时后,状态迁移到Forwarding。

所以,当SWA与SWB间的链路故障,经过50秒(Max Age 20秒+两倍的Forward Delay收敛时间也就是30秒)后网络恢复。

上面这两种情况,我们都没有提到TCN BPDU,因为不论哪条链路故障,根桥SWA都会知道,所以TCN没有意义。

我们来看下面这个图。

图中,SWA是根桥,正常情况下,PC连接在SWC的E0/2端口。

现在,SWC的E0/2端口故障,管理员立即把PC连接在了SWD的E0/2端口。

第一种场景:SWA~SWD都运行了STP协议。

根据发送TCN的第一种情况,SWC发现有DP端口故障,立即从RP端口E0/1发送TCN BPDU。

SWB收到后,把要转发的配置BPDU中Flag中的TCA置位,转发给SWC,同时把收到的TCN BPDU从E0/1端口发出。

根桥SWA收到后,把配置BPDU中Flag中的TC和TCA同时置位,从E0/1端口发出。并且在以后的35秒内(BPDU Max age + Forwarding Delay),都会把要发送的配置BPDU中Flag中的TC置位。

SWB收到TC置位的配置BPDU后,把MAC地址表老化时间修改为15秒,并把此配置BPDU分别从E0/2和E0/3端口发出。

SWC和SWD收到SWB转发的TC置位的配置BPDU后,也把MAC地址表老化时间修改为了15秒。

与此同时,由于SWD的E0/2端口UP,STP重新收敛,E0/2变为DP端口,经过30秒后状态迁移到Forwarding。

所以在此场景中,STP收敛时间为30秒。

第二种场景:SWD没有运行STP。

由于SWD没有运行STP,所以它的E0/2端口UP后立即进入Forwarding状态,没有延时。所以待MAC地址表老化后即可收敛。

所以在此场景中,STP收敛时间为15秒。

第三种场景:SWC没有运行STP。

SWC没有运行STP,它当然也不会发TCN BPDU。而SWD的E0/2端口UP后,变为DP端口,经过30秒后迁移到Forwarding状态,满足发送TCN的第二种情况,所以从RP端口E0/1发出TCP BPDU。

SWB和SWA对TCN的处理方法和第一种场景相同,SWA开始发送TC置位的配置BPDU。

SWB、SWC和SWD收到TC置位的配置BPDU后,都把MAC地址表老化时间修改为了15秒。

所以在此场景中,STP的收敛时间为45秒。

还有一种很常见的情况,接入层交换机连接的电脑因为开机或关机,会造成所连接的交换机端口因此而UP/DOWN,如果接入电脑较多,就会产生大量的TCN BPDU,造成STP频繁收敛,严重影响网络的正常使用。

所以,STP的缺点非常明显:对拓扑变化的处理不够灵活,收敛时间太长了!这不仅会影响使用体验,更重要的是会影响很多对延时比较敏感的业务正常开展。

虽然我们说的STP中的时间,如BPDU老化时间20秒、Forwarding Delay时间15秒都是默认时间可以修改,但修改这些时间会极大地影响网络稳定性,一般不建议修改。

那么,有没有别的办法能加快收敛呢?

802.1w定义的RSTP,也叫快速生成树,对STP做了很多改进,加快了收敛速度。

设备上的配置

  1. STP配置交换机的生成树协议模式的命令:stp mode { mstp | stp | rstp }

缺省情况下,在MSTP模式。在使用STP前,STP模式必须重新配置。

2. STP配置设备优先级值命令:stp priority priority 。priority值为整数,取值范围为0到61440,步长为4096。缺省情况下,交换设备的优先级取值是32768。

可以通过stp root primary命令指定生成树里的根桥,确定网络中的数据流量使用最优路径转发。

3. 配置指定交换机上路径开销值标准的命令:

stp pathcost-standard { dot1d-1998 | dot1t | legacy }

dot1d-1998 IEEE 802.1D-1998

dot1t IEEE 802.1T

legacy Legacy

手动设置端口路径开销值的命令:stp cost cost 缺省情况下,路径开销标准为IEEE 802.1t。

使用华为的私有计算方法时,cost取值范围是1~200000。

使用IEEE 802.1d标准方法时,cost取值范围是1~65535。

使用IEEE 802.1t标准方法时,cost取值范围是1~200000000。

4. 检查当前交换机的STP配置的命令:display stp

命令输出中信息介绍如下:

CIST Bridge参数标识指定交换机当前桥ID,包含交换机的优先级和MAC地址。

Bridge Times参数标识Hello:BPDU发送的周期。MaxAge:BPDU的最大生存期。

FwDly:端口状态迁移的延时时间。MaxHop:MST域的最大跳数。。

CIST Root/ERPC参数标识根桥ID以及此交换机到根桥的根路径开销

详见华为官网:https://support.huawei.com/enterprise/zh/doc/EDOC1100064380/b46ed27b

 

内容来源

STP原理

https://www.cnblogs.com/lkztrovo-lsh/p/15246233.html

STP的端口状态以及转换

https://www.cnblogs.com/lkztrovo-lsh/p/15292158.html

STP的BPDU报文

https://www.cnblogs.com/lkztrovo-lsh/p/15249806.html

STP的拓扑变化机制 - 华为

https://support.huawei.com/enterprise/zh/doc/EDOC1100092149

STP拓扑改变分析

https://zhuanlan.zhihu.com/p/142200388