生成树协议STP
生成树协议STP
1.1 STP介绍
局域网中的物理环路通常有两种产生原因。一种是基于可靠性的考虑,为交换机直接提供冗余连接;另一种是由于错误的网络设置导致环路的产生。如果不对网络拓扑加以管理,以上两种情况均会导致严重的后果,如广播风暴和MAC地址学习错误等。
局域网中存在物理环路,说明环内的每一台设备和另一台设备之间至少存在两条路径,但是设备不能随意选择阻塞某条路径,这样可能会造成网络中断。用户可以通过在设备间遵循一些准则或协议,来明确由哪台设备阻塞链路,阻塞哪些链路,从而达到消除环路的目的。STP(Spanning Tree Protocol,生成树协议)就是这些协议中的一种。
STP在IEEE制定的802.1D标准中定义,用于在局域网中消除数据链路层环路。STP可以通过计算动态地阻断冗余链路,而当活动链路发生故障时,STP又可以激活冗余链路,恢复网络的连通,避免网络中断。STP消除链路层环路的基本思想是:将网络拓扑修剪为树形拓扑,而树形拓扑是不存在环路的。
运行STP的设备之间会交互一些信息,然后通过计算实现拓扑的收敛,具体内容如下:
(1)运行STP的设备依据一定的准则选举一个树根节点作为网络中的根桥,其他节点为非树根节点。
(2)每一个非树根节点,会选择最优的路径和根桥相连,非树根节点上位于最优路径的端口。为该节点的根端口。
(3)如果网络中存在冗余链路,则阻塞冗余链路。
每一个非树根节点都进行同样的计算,最终网络中任何两台设备之间都只有一条路径可达,从而形成一颗无环的树。
当拓扑发生变化时,节点重新进行计算,收敛为新的树形拓扑。
1.2 STP基本概念
1.2.1 桥和端口的角色
如图1-1所示,STP中有两种特殊的网桥:根桥(Root Bridge)和指定桥(Designate Bridge)。根桥是整个生成树的根节点,由所有网桥中优先级最高的桥担任。指定桥是负责一个Physical Segment(物理段)上数据转发任务的桥,由这个Physical Segment上优先级最高的桥担任。
网桥上的端口有不同的角色,包括根端口(Root Port)、指定端口(Designate Port)和候补端口(Alternate Port)。
根端口指网桥上距离根桥最近的端口,根桥没有根端口,每一个非根桥有且存在一个根端口。
指定端口指Physical Segment上属于指定桥的端口。根桥是所有网桥中优先级最高的,它在其所连接的所有Physical Segment上都是指定桥,所以通常情况下根桥的所有端口都是指定端口。
Alternate端口指既不是根端口也不是指定端口的端口,它用来为根端口或指定端口做备份。从Alternate端口发出到达根桥的路径,是网桥到达根桥的备用路径,即最终需要阻塞的路径。
网络处于稳定状态时,根端口和指定端口处于转发状态,Alternate端口处于阻塞状态。阻塞Alternate端口,就消除了网络中的环路。
1.2.2 桥ID
STP中每一个网桥都具有一个桥ID(Bridge ID),用于在网络中唯一标识一个桥。根桥选择的依据就是桥ID,具有最小ID的网桥即为网络中的根桥。
如表1-1所示,桥ID包含桥优先级字段和桥MAC地址两部分,长度为8B。其中,桥优先级位于桥ID中的高16为,而桥MAC地址位于桥优先级的低48位。因为MAC地址在网络中是唯一的,所以能够保证桥ID在网络中也是唯一的。
桥优先级 | 桥MAC地址 |
---|---|
2B | 6B |
在进行桥ID的比较时,先比较优先级,优先级数值小者位为优;在优先级相同的情况下,在比较MAC地址,MAC地址小者为优。例如有两个网桥A和B,桥ID分别为4096.00-1C-FC-CA-0A-43和8192.00-1C-FC-CA-0A-44,则网桥A的优先级高于网桥B.
当网桥没有配置优先级时,使用默认优先级32768,此时,具有最小MAC地址的网桥即为网络中的根桥。
1.2.3 路径开销
非根桥需要确定根端口,根端口的选择取决于端口到达根桥距离的远近,网桥上到达根桥距离最近的端口为根端口。衡量距离远近,依据的是路径开销(Path Cost)。
路径开销用于衡量桥与桥之间路径的优劣。STP中每条链路都具有开销值,默认的链路开销值取决于所遵循的路径开销标准以及链路的带宽。路径开销等于整个路径上全部开销的和。
IEEE802.1D和802.1t定义了不同速率和工作模式下的以太网链路开销,H3C则根据实际的网络运行状况优化了开销的数值定义,制定了私有标准。各种链路开销标准如表1-2所示。
链路速率 | 双工状态 | 802.1D-1998 | 802.1t | H3C私有标准 |
---|---|---|---|---|
0 | — | 65535 | 200000000 | 200000 |
10Mbps | Single Port | 100 | 2000000 | 2000 |
10Mpbs | Aggregated Link 2 Ports | 100 | 1000000 | 1800 |
10Mpbs | Aggregated Link 3 Ports | 100 | 666666 | 1600 |
10Mpbs | Aggregated Link 4 Ports | 100 | 500000 | 1400 |
100Mbps | Single Port | 19 | 200000 | 200 |
100Mbps | Aggregated Link 2 Ports | 19 | 100000 | 180 |
100Mbps | Aggregated Link 3 Ports | 19 | 66666 | 160 |
100Mbps | Aggregated Link 4 Ports | 19 | 50000 | 140 |
1000Mbps | Single Port | 4 | 20000 | 20 |
1000Mbps | Aggregated Link 2 Ports | 4 | 10000 | 18 |
1000Mbps | Aggregated Link 3 Ports | 4 | 6666 | 16 |
1000Mbps | Aggregated Link 4 Ports | 4 | 5000 | 14 |
10Gbps | Single Port | 2 | 2000 | 2 |
10Gbps | Aggregated Link 2 Ports | 2 | 1000 | 1 |
10Gbps | Aggregated Link 3 Ports | 2 | 666 | 1 |
10Gbps | Aggregated Link 4 Ports | 2 | 500 | 1 |
1.2.4 BPDU
STP使用BPDU(Bridge Protocol Data Unit,桥协议数据单元)来交互协议信息,BPDU分为两类。
(1)配置BPDU(Configuration BPDU):用来进行生成树计算和维护生成树拓扑的报文。
(2)TCN BPDU(Topology Change Notification BPDU):当拓扑结构改变时,用来通知相关设备网络拓扑结构发生变化的报文。
网桥之间通过交互配置BPDU来进行根桥的选举以及端口角色的确定。配置BPDU基于二层组播方式发送,目的地址为01-80-C2-00-00-00。
如图1-2所示,配置BPDU由根桥从指定端口周期性发出,发送周期为Hello Time。非根桥从根端口接收配置BPDU,进行更新并从指定端口将其发送出去。网络中只有根桥会产生配置BPDU,非根桥只对配置BPDU进行中继,不会自行生成配置BPDU。没有运行STP协议的网桥把配置BPDU当作普通数据帧转发。
网桥上的每个端口都会保存本端口接收到的最优配置BPDU,端口保存的配置BPDU信息老化时间为Max Age,当在Max Age时间内配置BPDU信息没有得到更新时,端口将清除保存的配置BPDU信息。
配置BPDU信息包含目的MAC地址、源MAC地址、帧长、逻辑链路头以及载荷等。载荷中包含了STP计算所需要的信息,主要包括如下内容。
(1)Root ID:根桥ID,用于表示网络中的根桥。
(2)Root Path Cost(RPC):根路径开销,指从发送该配置BPDU的网桥到根桥的最小路径开销,即最短路径上所有链路开销的代数和。
(3)Bridge ID:发送该配置BPDU的网桥ID,即该Physical Segment 的指定桥的ID
(4)Port ID:发送该配置BPDU的网桥的发送端口ID。Port ID值由端口优先级和端口索引值组合而成。该端口即为Physical Segment的指定端口。
网桥在进行STP计算时,需要比较以上信息,通常这些信息使用向量形式来表示,称为优先级向量。即
优先级向量={RootBridgeID:RootPathCost:DesignateBridgeID:DesignatePortID:BridgePortID}其中,BridgePortID(接收端口ID)为本地信息,不包含在配置BPDU中。
载荷中的其他信息介绍如下。
(1)Protocol ID:固定值为0x0000,表示是生成树(Spanning Tree)协议。
(2)Protocol Version ID:协议版本号,目前生成树有3个版本,STP版本号为0x00。
(3)BPDU Type:配置BPDU类型为0x00,TCN BPDU类型为0x80。
(4)Flags:由8位组成。最低为(0)为TC(Topology Change)标志位,最高位(7位)位TCA(Topology Change Acknowledge)标志位;其他6位保留。
(5)Message Age:从根桥生成配置BPDU开始,到当前时间为止配置BPDU的存活时间。
(6)Max Age:配置BPDU存活的最大时间。
(7)Hello Time:根桥生成配置BPDU的周期,默认时间为2s。
(8)Forward Delay:配置BPDU传播到全网的最大时延,默认为15s。
1.3 STP计算过程
1.3.1 STP计算步骤
STP的计算过程主要包含两个任务:选举根桥和确定端口角色。在实际计算过程中,这两个任务是同步计算完成的,便于理解,本例中将其分为逻辑上的两个计算过程分别进行介绍。如图1-3所示。
本例假设网络中有4个网桥,其中S1桥ID为0.MACA,S2桥ID为8192.MACB,S3桥ID为32678,MACC桥ID为4096.MACD。
网桥之间的链路带宽以及开销如表1-3所示
连接设备 | 链路带宽 | 链路开销 |
---|---|---|
S1-S2 | 100Mbps | 200 |
S1-S3 | 2x1Gbps聚合链路 | 18 |
S2-S3 | 1Gbps | 20 |
S2-S4 | 1Gbps | 20 |
s3-S4 | 100Mbps | 200 |
表中,链路开销采用H3C私有标准。
进行STP计算时,网桥将各个端口收到的配置BPDU和自己的配置BPDU作比较,得出优先级最高的配置BPDU;网桥用优先级最高的配置BPDU更新本身的配置BPDU,用于选举根桥和确定端口角色;网桥从指定端口发送新的配置BPDU。
比较配置BPDU时依据优先级向量最小者为最优的原则。当网桥比较配置BPDU时,遵循的比较步骤如下:
(1)首先比较优先级向量中的Root Bridge ID,Bridge ID小者为优。
(2)如果Root Bridge ID相同则比较RPC(根路径开销),RPC小者为优。
(3)如果RPC相同则比较Designate Bridge ID,Designate Bridge ID小者为优。
(4)如果Designate Bridge ID相同则比较Designate Port ID,Designate Port ID小者为优。
(5)如果上述参数都相同,则比较接收该配置BPDU的Bridge Port ID,Bridge Port ID小者为优。
1.3.2 根桥选举
如图1-4所示,在初始状态时,每一个网桥都还没有接收到其他网桥发送的配置BPDU,此时每个网桥都认为自己是网络中的根桥,,并将向外发送以自己为根桥的配置BPDU。
S1发送的配置BPDU中优先级向量为{0.MACA:0:0.MACA},S2发送的配置BPDU中优先级向量为{8192.MACB:0:8192.MACB},S3发送的配置BPDU中优先级向量为{32768.MACC:0:32768.MACC},S4发送的配置BPDU中优先级向量为{4096.MACD:0:4096.MACD}。此处忽略端口ID信息。
由于根桥的选举只需要比较Root Bridge ID,所以在后续的根桥选举说明中,只保留优先级向量中的Root Bridge ID参数。
由于此时每个网桥都认为自身是根桥,所以每个网桥都会发送配置BPDU,同时也会收到对端网桥发送的配置BPDU。每一个网桥都将自身认为的Root Bridge ID较小的作为网络中的根桥。
S1收到S2和S3发过来的配置BPDU,比较Root Bridge ID,得出0.MACA<8192.MACB<32768.MACC,则S1的Root Bridge ID较小,S1仍然保留自身的优先级向量{0.MACA}。
S2收到了S1、S3和S4的配置BPDU,比较Root Bridge ID,得出0.MACA<4096.MACD<8192.MACB<32768.MACC,S1的Root Bridge ID最小,S2将使用S1发过来的配置BPDU更新自身的配置BPDU。S2的优先级向量更新为{0.MACA}。
S3的情况与S2情况相近,不再赘诉。S3的优先级向量同样更新为{0.MACA}。
S4仅收到S2和S3的配置BPDU,经比较,得出4096.MAC4<8192.MACB<32768.MACC,S4仍然认为自己的Root Bridge ID是最小的,S4仍然保留自己的优先级向量{4096.MACD}。
从图1-5中可以看出,此时,S1、S2和S3达成一致,认为S1为网络中的根桥,而S4仍然认为自己是根桥。
经过Hello Time后,S1会再次发送配置BPDU,S2和S3接收S1的配置BPDU,经过更新发出配置BPDU,其中Root Bridge ID为0.MACA。此时S2和S3不会再向连接S1的端口发出配置BPDU
同时S4仍然发送Root Bridge ID为4096.MACD的配置BPDU。
S4在这个周期收到了S2和S3发送的配置BPDU。其中Root Bridge ID为0.MACA,都比自身的Root Bridge ID小,因此S4将使用接收到的配置BPDU更新自身的配置BPDU。S4的向量优先级更新为{0.MACA}。
到此为止,图1-6中S1、S2、S3和S4全部达成一致,认为S1为网络中的根桥,根桥选举过程结束。
1.3.3 确定端口角色
端口角色的确定分为根端口确定、指定端口确定和Alternate端口确定3个工作。
根端口的确定需要比较RPC。当网桥从一个端口接收到配置BPDU后,首先获取其中的RPC,和接收端口的链路开销相加,得到此端口的RPC,每个收到配置BPDU的端口都进行同样的计算。然后比较各端口的RPC,拥有最小RPC值的端口即为本网桥的根端口。
指定端口的确定需要比较端口发送的配置BPDU和接收的配置BPDU,如果发送的配置BPDU优于接收到的配置BPDU,表明端口在本Physical Segment上拥有最优的配置BPDU,则该端口为指定端口。
在实际计算过程中,端口角色的确定是同步完成的。
1.3.4 STP计算结果
其他网桥经过相同的判断,可以确定每个端口的角色,具体结果如下:
(1)S1为根桥,S1的配置BPDU在每个端口所属的局域网网段上都是最优的,所以S1的所有端口都是指定端口。
(2)S3连接S1的端口为根端口,其余端口为指定端口。
(3)S4连接S2的端口为根端口,连接S3的端口为Alternate端口。
经过STP计算,阻塞了S2连接S1的端口以及S4连接S3的端口,使得网络拓扑形成无环的树形拓扑。阻塞的端口并非Down,如果拓扑发生变化,这些端口可以转变为转发状态,从而提高网络的可靠性。
在网络稳定运行时,根桥以Hello Time时间为间隔,周期发送配置BPDU,其他网桥接收到配置BPDU,经过更新从指定端口发出新的配置BPDU。非根桥不会主动生成并发送配置BPDU。
1.3.5 等路径开销计算
在实际应用中,经常会存在链路带宽相同的网络,此时就需要比较优先级向量中的Designate Bridge ID(指定桥ID)、Designate Port ID,特殊情况下还需要比较接收端口的Bridge Port ID。
1.3.6 接收到低优先级配置BPDU时的处理
在STP稳定运行期间,根桥以Hello Time为周期发送配置BPDU,其他网桥从根端口接收配置BPDU,经过更新从指定端口发送出去,每个网桥都进行同样的动作直到配置BPDU传播到网络中的每一个角落。
通常,非根桥不会主动发送配置BPDU,但是存在一种例外情况。当网桥在指定端口收到一个低优先级的配置BPDU时,网桥会立即回应一个配置BPDU,这样可以保证新加入的网桥尽快地确认根桥和端口角色,使得网络快速实现收敛。
网桥可以立即回应配置BPDU是因为网桥都会保存当前最优的配置BPDU,该配置BPDU的生存期为Max Age。当配置BPDU生存期超时后,网桥会重新认为自身是网络中的根桥,发送以自身为根的配置BPDU。
1.4 STP端口状态
网络拓扑收敛为一颗无环的树是通过网桥之间交互配置BPDU并进行计算而得到的。STP计算收敛需要一定的时间,当网络拓扑发生变化时,最优的配置BPDU需要经过一定的延时才能传播到整个网络,在所有网桥都收到最优配置BPDU之前可能存在临时环路。
STP定义了5中端口状态:Disabled、Blocking、Listening、Learning和Forwarding。其中Listening和Learning状态为中间状态,为避免临时环路,当端口处在中间状态时,端口不能接收和发送数据。
STP各端口状态对配置BPDU收发、MAC地址学习以及数据转发的处理 有所不同,其总结如表1-4所示。
STP端口状态 | 是否发送配置BPDU | 是否进行MAC地址学习 | 是否收发数据 |
---|---|---|---|
Disabled | 否 | 否 | 否 |
Blocking | 否 | 否 | 否 |
Listening | 是 | 否 | 否 |
Learning | 是 | 是 | 否 |
Forwarding | 是 | 是 | 是 |
端口在中间状态停留时长为Forward Delay,默认为15s,Forward Delay是STP计算中非常重要的参数,它是根据Hello Time以及网络的直径综合计算得到的,用于确保配置BPDU有足够的时间传播到网络中的每一个角落,使得网络实现收敛。
在Listening状态,经过Forward Delay时长的配置BPDU交互,可以确保各网桥完成端口角色的确定,通过阻塞Alternate端口,即可防止临时环路的产生;在Learning状态,经过Forward Delay时长,可以确保各网桥有足够的时间进行MAC地址学习,尽量减少由未知单播造成的广播。
如图1-7所示,当端口为Down时,端口处于STP定义的Disabled状态,当端口UP后,经过初始化会首先进入Blocking状态。由于端口在STP计算初期均会认为自己是指定端口,所以端口直接从Blocking状态进入第一个中间状态Listening。
在Listening状态期间,端口通过交互配置BPDU,完成角色的确认,在此期间端口不进行MAC地址学习,也不能收发数据。如果端口最终被选为Alternate端口,端口会重新回到Blocking状态。如果端口角色为根端口或指定端口,当Forward Delay时间过去后,端口进入Learning状态。
在Learning状态期间,根端口和指定端口进行MAC地址学习,但仍然不进行数据的收发。如果端口在Learning状态期间重新被选为Alternate端口,则端口会回到Blocking状态,如果端口在Learning状态期间维持根端口、指定端口角色不变,则当Forward Delay时间过去后,端口会进入Forwarding状态。
在Forwarding状态,根端口和指定端口开始收发数据。之后,如果端口被重新选择为Alternate端口,端口会直接回到Blocking状态。
在Blocking、Listening和Forwarding状态,如果端口Down,则端口直接回到Disabled状态。
1.5 STP拓扑改变处理过程
当发生网桥故障、链路中断、新网桥加入等事件时,网络拓扑会发生变化,需要一段时间重新实现收敛。
STP拓扑改变的处理过程如下:
(1)网桥感知到拓扑变化,产生TCN BPDU并从根端口发出,通知根桥。
(2)如果上游网桥不是根桥,则上游网桥会将下一个要发送的配置BPDU中的TCA位置位,作为收到的TCN的确认,发送给下游网桥。
(3)上游网桥从根端口发送TCN BPDU。
(4)重复第(2)步和第(3)步,直到根桥收到TCN BPDU。
(5)根桥收到TCN BPDU后,会将下一个要发送的配置BPDU中的TCA位置位,作为对收到TCN的确认,根桥还会将该配置BPDU中的TC位置位,用于通知网络中的所有网桥网络拓扑发生变化了变化。
(6)根桥在之后的Max Age+Forward Delay时间内,将发送配置的BPDU中的TC置位,当网桥收到根桥发送的TC置位的BPDU后,会将自身的MAC地址老化时间由300s缩短为Forward Delay。
网桥发送TCN BPDU的周期位Hello Time,即当网桥发送TCN BPDU后,如果Hello Time时间内没有收到TCA置位的配置BPDU,则网桥会重复发送TCN BPDU。如果网桥在Hello Time时间内收到TCA置位的配置BPDU,则网桥停止从根端口发送TCN BPDU。
TCN BPDU有如下两个产生的条件。
(1)网桥上有端口转变为Forwarding状态,且该网桥至少包含一个指定端口。
(2)网桥上有端口从Forwarding状态或Learning状态转变为Blocking状态。
当上述两个条件之一满足时,就说明网络拓扑发生了变化,网桥需要使用TCN BPDU通知根桥。根桥可以通过配置BPDU中的对应标志位置位来通知所有网桥网络拓扑发生了变化,需要使用较短的MAC地址老化时间,保证拓扑的快速收敛。
上游网桥收到下游网桥发送的TCN BPDU后,会将下一个发送的配置BPDU中的TCA标志位置位,表示对TCN BPDU的确认。
根桥收到TCN BPDU后,会在将来一段时间将发送的配置BPDU中的TC置位,用于通知所有网桥网络拓扑发生变化。
1.6 STP协议的不足
STP为了避免临时环路的产生,每一个端口在确认位根端口或指定端口后仍然需要等待30s的时间才能进入转发状态。在此30s时间内,端口不能进行数据的转发,这对于一些对时延敏感的应用是不可接受的。
此外,对于拓扑不稳定的网络,经常需要重新进行STP计算,某些端口可能会长期处于阻塞状态而导致网络长时间的中断。
STP定义了TCN BPDU,可以使得网络拓扑变化时,在50s之内实现收敛。
TCN BPDU产生的条件之一是网桥有端口转变为Forwarding状态,且该网桥至少包含一个指定端口。
当网络中有大量的用户主机时,由于用户主机位置不固定,可能会频繁地上下线,这样会使得交换机频繁发送TCN BPDU,导致网桥MAC地址老化时间长期保持为15s。MAC地址频繁的刷新会导致网络充斥大量由未知单播造成的广播报文,严重影响网络中的应用。