目录
环路问题
STP树的生成
STP报文格式
STP的改进
STP配置示例
为了提高网络的可靠性,交换网络中通常会使用冗余链路。然而,在冗余链路中会给交换网络带来环路风险,并导致广播风暴以及MAC地址表不稳定等的问题,进而影响到用户的通信质量。生成树协议STP(Spanning Tree Protocol)是一种由交换机运行的、用来解决交换网络中环路问题的数据链路层协议。
1、广播风暴
3台交换机SWA、SWB、SWC以下图的方式连接在一起,假设主机A想要给主机B发送数据,首先会发送一个ARP请求来获取主机B的MAC地址。但是由于ARP的Request包属于一个广播帧,当SWB接收到主机A发送来的广播帧时,会将该广播帧发送给所有的端口;SWA收到SWB发来的广播帧时,同样也会发送给所有端口;以此类推。这时,在SWA、SWB、SWC中就会循环往复地收发广播帧,耗费交换机资源,导致业务瘫痪。
2、MAC地址震荡
环路除了会带来广播风暴的问题,还会带来MAC地址表的震荡。当SWB第一次收到主机A发送过来的广播帧时,源MAC地址为:00-05-06-07-08-AA,源端口为G0/0/3。由于广播帧在三台交换机中循环往复的收发,当SWC将广播帧发给SWB时,SWB收到的广播帧的MAC地址依旧没变,即:00-05-06-07-08-AA。但是此时的源端口却变成了SWC的G0/0/2端口。这就是MAC地址震荡。
环路除了带来以上的问题弊端之外,还是可以为我们带来有利的。环路能够提高网络连接的可靠性。即使某两台交换机之间的链路因故障而中断了,整个网络仍然会保持其连通性,而这在无环网络中是无法做到的。
可以设想一下,在存在环路的网络中如何消除环路呢。最好的办法就是切断其中一条线路,这样环路就消失了。但是如果其中的一条线路被切断了,那么网络中如果发生故障时两台设备就没办法实现链路备份了。如何才能既想要在有环网络中消除环路,又能实现链路备份呢?显然,在物理状态下是没有办法实现的。(因为不可能通过人工手动插拔网线监测网络故障)但是我们可以假想一下,如果在逻辑层面上,网络在运行正常的情况下让其中的某个端口保持阻塞状态,当网络发生故障的时候再让该端口保持转发状态,恢复正常。完成链路备份。这样,就可以做到既能消除环路,又能实现链路备份。
这就是STP协议的基本原理:在一个具有物理环路的交换网络中,交换机通过运行STP协议,自动生成一个没有环路的工作拓扑。该无环工作拓扑也成为STP树,当网络拓扑发生变化时,STP树也会自动地发生相应的改变。简言之,有环的物理拓扑提高了网络连接的可靠性,而无环的工作拓扑避免了广播风暴、MAC地址表震荡。这就是STP的精髓。
在学习STP树之前,需要先了解几个基本术语:桥、桥的MAC地址、桥ID、端口ID;
桥(Bridge):早期的交换机一般只有两个转发端口,所以那时的交换机常常被称为“网桥”,或简称成“桥”。后来“桥”这个术语一直沿用至今,但并不是指只有两个转发端口的交换机了,而是泛指具有任意多端口的交换机。目前“桥”和“交换机”这两个术语是可以混用的。
桥的MAC地址(Bridge MAC Address):我们知道一个桥有多个转发端口,每个端口有一个MAC地址。通常,我们把端口编号最小的那个端口的MAC地址作为整个桥的MAC地址。
桥ID(Bridge Identifier,BID):一个桥(交换机)的桥ID由两部分组成,即:桥优先级 + 桥的MAC地址;其中桥优先级的值可以人为设定,默认值为0x8000(相当于十进制的32768)。取值范围是0~65535。
端口ID(Port Identifier,PID):一个桥(交换机)的某个端口的端口ID由两部分组成,即:端口优先级 + 端口编号;端口优先级的值是可以人为设定的。不同厂商的设备对于两部分所占用的字节数可能有所不同。
介绍完基本的术语之后,在STP树的生成过程是:首先选举根桥(Root Bridge),然后确定根端口(Root Port,RP)和指定端口(Designated Port,DP),最后阻塞备用端口(Alternate Port,AP)。
1、选举根桥
根桥是STP树的根节点,要生成一课STP树首先要确定出一个根桥。当运行STP协议的交换机(简称为STP交换机)会相互交换STP协议帧,这些协议帧的载荷数据被成为BPDU(Bridge Protocol Data Unit,网桥协议数据单元)。STP交换机初始启动之后,都会认为自己是根桥。并在发送给其他交换机的BPDU中宣告自己是根桥。当交换机从网络中收到其他设备发送过来的BPDU时,会比较BPDU中指定的根桥BID和自己的BID,交换机不断地交互BPDU同时进行比较,直至最终选举出一台BID值最小的交换机作为根桥。
如图,交换机S1、S2、S3都使用了默认的桥优先级32768。显然S1的BID最小,所以最终S1将被选举为根桥。
2、确定根端口
根桥确定后,其它没有成为根桥的交换机都被成为非根桥(或非根交换机)。一台非根桥设备上可能会有多个端口与网络相连,为了保证从某台非根桥设备到根桥的工作路径是最优且唯一的,就必须从该非根桥设备的端口中确定出一个被成为“根端口”的端口,由根端口来作为非根桥设备与根桥设备之间进行报文交互的端口。一台非根桥设备上最多只能有一个根端口。
非根桥在选举根端口时分别依据该端口的根路径开销、对端BID、对端PID和本端PID。一个运行STP协议的网络中,我们将某个交换机的端口到根桥的累计路径开销(即从该端口到根桥经过的所有链路的路径开销的和)称为这个端口的根路径开销(Root Path Cost,RPC)。链路的路径开销(Path Cost)与端口速率有关,端口转发速率越大,则路径开销越小。端口速率与路径开销的对应关系如下表所示:
端口速率路径开销(IEEE802.1t标准)10Mbit/s2000 000100Mbit/s200 0001Gbit/s20 00010Gbit/s2 000例1:根据RPC选举根端口
如图,假定S1已被选为根桥。并且链路的开销遵循IEEE802.1t。现在S3需要从1端口和2端口中确定出根端口。显然,S3的2端口的RPC为20 000;S3的1端口的RPC为200 000+20 000=220 000。交换机会将RPC最小的那个端口确定为自己的根端口。因此,S3将2端口确定为自己的根端口。同理,S2将自己的1端口确定为根端口。
例2:根据对端BID选举根端口
然而,在实际应用中一台非根桥设备上的不同端口的RPC可能是相同的。如图所示,假定S1已被选为根桥。对于S4而言,1端口和2端口到根桥的RPC都是相同的,这种情况下就需要根据对端BID来选举根端口。对于S4而言,它的对端BID也就是S2的BID和S3的BID。相比较之后假设S2的BID小,则1端口为S4的根端口;反之,2端口就为S4的根端口。
例3:根据对端PID选举根端口
如图,两台设备在这种连接方式下非根桥的RPC、对端BID均是相同的,这种情况就需要根据对端PID来选举根端口。对于S2而言,它的对端PID就是Root的GE 0/0/1口和GE 0/0/2口的PID。假设Root的端口优先级都是128,那么Root的端口编号就是1和2。显然Root的GE 0/0/1的PID更小,所以与之相连接的S2设备的GE 0/0/1端口就被选为根端口。
例4:根据本端PID选举根端口
如图, 两台设备中间通过一台HUB相连接。在这种方式下的非根桥的RPC、对端BID、对端PID均是相同的。这种情况就需要根据本端PID来选举根端口。假设S2的端口优先级都是128,那么显然1端口的PID更小。因此,S2的1端口就被选为了根端口。
3、确定指定端口
根端口保证了交换机与根桥之间工作路径的唯一性和最优性。为了防止工作环路的存在,网络中每个网段与根桥之间的工作路径也必须是唯一且最优的。当一个网段有两条及以上的路径通往根桥时,与该网段相连的交换机就必须确定出一个唯一的指定端口。指定端口也是通过比较RPC来确定的,RPC较小的端口将成为指定端口。如果RPC相同,则需要比较BID、PID等。
如图,假定S1已被选举为根桥,并且假定各链路的开销均相等。显然,S2将GE 0/0/1确定为自己的根端口,S3也将GE 0/0/1确定为自己的根端口。在S1与S2,、S1与S3的之间的网段上,很明显Ethernet 0/0/1和Ethernet 0/0/2均为指定端口。在S2与S3之间的网段中,由于两个端口的RPC是相同的,所以这时就需要比较S2和S3的BID;假定S2的BID小于S3的BID,那么就将S2的GE 0/0/2端口选举为该网段的指定端口。
注:通过以上的例子,其实不难发现一个规律:根桥上所有的端口,都是指定端口。
4、阻塞备用端口
在确定了根端口和指定端口之后,交换机上所有剩余的非根端口和非指定端口统称为备用端口。STP会对这些端口进行逻辑阻塞。所谓逻辑阻塞是指这些备用端口不能转发终端计算机产生并发送的帧,这些帧也被称为用户数据帧。不过,备用端口可以接受并处理STP协议帧。根端口和指定端口既可以发送和接收STP协议帧,又可以转发用户数据帧。
如图,一旦备用端口被逻辑阻塞后,STP树(无环工作拓扑)的生成过程便告完成。
STP交换机通过交换STP协议帧来建立和维护STP树,并在网络的物理拓扑发生变化时重建新的STP树。STP协议帧由STP交换机产生、发送、接收、处理。STP协议帧时一种组播帧,组播地址为01-80-c2-00-00-00。STP协议帧采用了IEEE802.3封装格式,其载荷数据被成为BPDU。BPDU有两种类型:Configuration BPDU和TCN BPDU。
1、Configuration BPDU
在初始形成STP树的过程中,各STP交换机都会周期性地(缺省为2s)主动产生并发送Configuration BPDU。在STP树形成后的稳定期,只有根桥才会周期性地(缺省为2s)主动产生并发送Configuration BPDU;相应地,非根交换机会从自己的根端口周期性地接收到Configuration BPDU,并立即被触发产生自己的Configuration BPDU,且从自己的指定端口发送出去。这一过程看起来就像是根桥发出的Configuration BPDU逐跳地“经过”了其它的交换机。
BPDU的格式 字段字节数简单说明
Protocol Identifier
2总是0x0000Protocol Version Identifier1总是0x00BPDU Type1BPDU类型:
0x00:Configuration BPDU
0x80:TCN BPDU
Flags1网络拓扑变化标志:仅使用了最低位和最高位
最低位为TC(Topology Change)标志;
最高位为TCA(TC Acknowledgment)标志
Root Identifier8当前根桥的BIDRoot Path Cost4发送该BPDU的端口的RPCBridge Identifier8发送该BPDU的交换机的BIDPort Identifier2发送该BPDU的端口的PIDMessage Age2该BPDU消息的年龄
如果Configuration BPDU 是根桥发出的,则Message Age为0。否则,Message Age是从根桥发送到当前桥接收到BPDU的总时间,包括传输延时等。在实际的实现中,Configuration BPDU每“经过”一个桥,Message Age增加1
Max Age2BPDU的最大生命周期,缺省为20sHello Time2根桥发送Configuration BPDU的周期,也相应地成为了其它交换机发送Configuration BPDU的周期,缺省为2sForward Delay2控制端口Listening和Learing状态的持续时间,缺省为15sConfiguration BPDU中携带的参数可以分为3类:
第一类是BPDU对自身的标识,包括协议标识、版本号、BPDU类型和Flags;
第二类是用于进行STP计算的参数,包括发送该BPDU的交换机的BID、当前根桥的BID、发送该BPDU的端口的PID,以及发送该BPDU的端口的RPC;
第三类是时间参数,分别是Hello Time、Forward Delay、Message Age、Max Age。
Hello Time:交换机发送Configuration BPDU的时间间隔。当网络拓扑及STP树稳定之后,全网使用根桥指定的Hello Time。如果要修改该时间参数,则必须在根桥上修改才有效。
Forward Delay:端口状态迁移的延迟时间。STP树的生成需要一定的时间,在此过程中各交换机的端口状态的变化并不是同步的。如果新选出的根端口和指定端口立刻就开始进行用户数据帧的转发的话,可能会造成临时工作环路。因此,STP引入了Forward Delay机制:新选出的根端口和指定端口需要经过2倍的Forward Delay延时后才能进入用户数据帧的转发状态,以保证此时的工作拓扑已无环路。
Message Age:是指从根桥发出某个Configuration BPDU,一直到这个Configuration BPDU“传”到当前交换机时所需的总的时间,包括传输时延等。实际的实现中,Configuration BPDU每“经过”一个桥,Message Age增加1.。从根桥发出的Configuration BPDU的Message Age为0.。
Max Age:Configuration BPDU的嘴阀生命周期。Max Age的值由根桥指定,缺省值为20s。STP交换机在收到Configuration BPDU后,会对其中的Message Age和Max Age进行比较。如果Message Age 小于等于Max Age,则该Configuration BPDU会触发该交换机产生并发送新的Configuration BPDU,否则该Configuration BPDU会被丢弃,并且不会触发该交换机产生并发送新的Configuration BPDU。
2、TCN BPDU
TCN BPDU的结构和内容非常简单,它只有协议标识、版本号和类型。其中类型字段的值是0x80。
如果网络中某条链路发生了故障,导致工作拓扑发生了改变,则位于故障点的交换机可以通过端口状态直接感知这种变化,但是其它交换机时无法直接感知到这种变化的。这是,位于故障点的交换机会以Hello Time为周期通过其根端口不断向上游交换机发送TCN BPDU,直到接收到从上游交换机发来的TCA标志置1的Configuration BPDU。上游交换机在收到TCN BPDU后,一方面会通过其它指定端口回复TCA标志置1的Configuration BPDU,另一方面会以Hello Time为周期通过其根端口不断向它的上游交换机发送TCN BPDU。此过程一直反复,直到根桥接收到TCN BPDU。根桥接收到TCN BPDU后,会发送TC标志置1的Configuration BPDU,通告所有交换机网络拓扑发生了变化。
交换机收到TC标志置1的Configuration BPDU后,便意识到网络拓扑已经发生了变化,这说明自己的MAC地址表的表项内容很可能已经不再是正确的了,这时交换机会将自己的MAC地址表的老化周期(缺省为30s)缩短为Forward Delay的时间长度(缺省为15s),以加速老化掉原来的地址表项。
STP端口状态
STP中定义了3种端口角色:根端口、指定端口、备用端口。不仅如此,根据端口是否能够接收和发送STP协议帧,以及端口是否能够转发用户数据帧,STP还将端口的状态分为了5种:去能状态、阻塞状态、侦听状态、学习状态、转发状态。
端口状态说明去能(Disabled)去能状态的端口无法接收和发出任何帧,端口出于关闭(Down)状态阻塞(Blocking)阻塞状态的端口只能接收STP协议帧,不能发送STP协议帧,也不能转发用户数据帧侦听(Listening)侦听状态的端口可以接收并发送STP协议帧,但不能进行MAC地址学习,也不能转发用户数据帧学习(Learning)学习状态的端口可以接收并发送STP协议帧,也可以进行MAC地址学习,但不能转发用户数据帧
转发(Forwarding)转发状态的端口可以接收并发送STP协议帧,也可以进行MAC地址学习,同事能够转发用户数据帧STP交换机的端口在初始启动时,首先会从Disabled状态进入到Blocking状态。在Blocking状态,端口只能接收和分析BPDU,但不能发送BPDU。如果端口被选为根端口或指定端口,则会进入Listening状态,此时端口接收并发送BPDU,这种状态会持续一个Forward Delay的时间长度,缺省为15s。然后如果没有“意外情况”而回到Blocking状态,则该端口回进入到Learning状态,并在此状态持续一个Forward Delay的时间长度。处于Learning状态的端口可以接收和发送BPDU,同时开始构建MAC地址映射表,为转发用户数据帧做好准备。处于Learning状态的端口仍然不能转发用户数据帧,因为此时网络中可能还存在因STP树的计算过程不同步而产生的临时环路。最后,端口由Learning状态进入Forwarding状态,开始用户数据帧的转发工作。在整个状态迁移的过程中,端口一旦被关闭或发生了链路故障,就会进入到去能状态;在端口状态的迁移过程中,如果端口的角色被判定为非根端口或非指定端口,则其端口状态就会立即退回到Blocking。
端口状态迁移在STP网络中,STP树的完全收敛需要依赖定时器的计时,端口状态从Blocking迁移到Forwarding至少需要两倍Forward Delay的时间长度,总的收敛时间太长。为了弥补STP慢收敛的缺陷,IEEE 802.1w定义了RSTP(Repid Spanning Tree Protocol)。RSTP在STP的基础上进行了许多改进,使得收敛时间大大减少,一般只需要几秒钟的时间。在现实网络中,STP几乎已经停止使用,取而代之的是RSTP。
1、3种端口状态
在RSTP 中,端口的状态只有3种:Discarding、Learning、Forwarding。对这3种端口的说明如下表所示:
RSTP端口状态对应的STP端口状态说明ForwardingForwarding可以转发用户数据帧;可以学习MAC地址LearningLearning不能转发用户数据帧,但是可以学习MAC地址DiscardingListening不能转发用户数据帧,也不能学习MAC地址DiscardingBlockingDiscardingDisabled2、P/A机制
STP计算中,一个端口在成为指定端口后需要等待至少两倍Forward Delay的时间才能进入Forwarding状态;而在RSTP计算中,一个端口成为指定端口之后,此端口会先进入到Discarding状态,然后采用Proposal/Agreement机制(简称P/A机制)主动与对端端口进行协商,通过协商并进行相关动作后,就可以立即进入Forwarding状态。
我们以下图所示的网络来演示STP的基本配置方法
1、配置思路
(1)配置STP模式
(2)指定根桥
(3)指定备份根桥(可选)
2、配置步骤
默认情况下,交换机是开启了STP功能的。如果STP处于关闭状态,需要首先在系统视图下使用命令stp enable来开启STP功能。
#配置交换机S1上生成树工作模式为STP。
#配置S2上生成树工作模式为STP
#配置S3上生成树工作模式为STP
#配置S4上生成树工作模式为STP
注:命令stp mode{mstp|rstp|stp}用来配置设备STP的工作模式,工作模式分别为MSTP、RSTP、STP;缺省值为MSTP。
虽然STP会自动选举出根桥,但通常情况下我们会事先指定性能较好、距离网络中心较近的交换机作为根桥。我们可以通过修改S1的桥优先级来保证S1被选举为根桥。命令stp priority priority用来设置设备的桥优先级,priority的取值范围是0~61440,步长为4096,如0、4096、8192等;缺省值是32768。priority值越小,设备被选举为根桥的可能性就越大。另外,还有一种便捷的方法来指定S1为根桥,即通过命令stp root primary直接指定S1为根桥。设备上配置了此命令后,设备的桥优先级的值会被自动设为0,并且不能通过命令stp priority priority来更改设备的桥优先级。
接下来指定S2位备份根桥,以便于当S1发生故障时可以接替S1成为新的根桥。在设备上执行stp root secondary命令后,设备的桥优先级的值会被自动设置为4096,并且不能通过命令stp priority priority来进行修改。
至此,该网络的STP基本配置结束了。我们可以通过使用命令display stp [interface interface-type interface-number] [brief]来查看生成树的状态信息与统计信息。
#在S1上使用命令display stp brief,查看STP的简要信息。可以看到,由于S1是根桥,S1的端口GE 0/0/1和GE 0/0/2都成为了指定端口,并且均处于正常的转发状态。
#我们再查看一下S3上的STP的简要信息,可以看到S3的端口Eth 0/0/1被确定为根端口,处于正常的转发状态。但是Eth 0/0/2端口被阻塞,成为了备用端口。
以下无正文, 原创文章,转载请注明出处。