STP(Spanning Tree Protocol,生成树协议)是根据 IEEE802.1D标准建立的,用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路,并有选择地对某些端口进行阻塞,以最终实现将环路网络结构修剪成无环路的树型网络结构,从而防止报文在环路网络中不断增生和无限循环,避免设备由于重复接收相同的报文所造成的报文处理能力下降的问题发生。
冗余链路产生的问题
广播风暴导致网络不可用;
如果HostA发出广播请求,交换机S1和S2的端口port1都将收到这个广播报文,然后从所有其他同网段的端口(如 port2)广播出去,这时对端交换机与之相连的端口又收到相同的广播报文,这台交换机再从它的其他端口(如 port1)转发出去,对端交换机又会收到相同的广播报文,如此反复,最终导致整个网络资源被耗尽,网络瘫痪不可用。
MAC地址表的翻摆:MAC地址表震荡导致MAC地址表项被破坏;
假设图所示的网络中没有广播风暴,HostA发送一个单播报文给HostB,如果此时HostB临时从网络中移去,那么交换机上有关HostB的MAC地址表项也将被删除。此时HostA发给HostB的单播报文,将被交换机S1和S2上的端口port1接收,由于S1上没有相应的MAC地址转发表项了,因此该单播报文将被同时泛洪转发到其他端口(如port2)上,交换机S2的端口port2在收到从对端port2端口发来的单播报文后,然后又以泛洪方式从其他端口(如 port1)发出去,使交换机 S1 的 port1 端口又会收到这个单播报文。如此反复,在两台交换机上,由于不间断地从端口 port2、port1 收到主机A 发来的单播文,交换机会不停地修改自己的MAC地址表项,从而引起了MAC地址表的抖动。如此下去,最终导致MAC地址表项被破坏。
多重复数据帧。
假设图所示的网络中没有广播风暴,HostA发送一个报文给HostB。S1和S2同时接收到报文,两个都要发送给HostB,这样HostB接收到两个相同的报文,消耗了链路资源。
生成树协议原理:在二层交换网络中,逻辑的阻塞部分接口,实现从根节点到所有节点唯一的路径的生成,成为一个没有环路的拓扑。当最佳路径数显故障时,个别被阻塞的接口将被打开,形成备份链路。
802.1D ---- 由IEEE组成颁布的公有协议 ---- 标准的STP协议
RSTP --- 802.1W
MSTP --- 802.1S
STP基本概念
桥ID
每一台运行STP协议的交换机都拥有的唯一的BID。
桥ID一共8字节,包含16bit的桥优先级和48bit的桥MAC地址,其中桥优先级占据桥ID的高16bit位。
根桥(RootBridge)
根桥是整个网络的逻辑中心,但不一定是物理中心,且会根据网络拓扑的变化而动态变化。一般是需要将环路中所有交换机当中性能最好的一台设置为根桥交换机,以保证能够提供最好的网络性能和可靠性。网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他设备仅对该报文进行转发,传达拓扑变化记录,从而保证拓扑的稳定。
对于一个运行STP协议的网络,根桥在全网中只有一个,就像一棵树只有一个树根一样,那就是网络中具有最小桥ID(BID)的桥。网络中除根桥外的其他桥统称为非根桥。
缺省情况下,桥优先级为32768。 --- 可以修改,但是修改范围为0-61440,且必须是4096的倍数。
开销cost与根路径开销RPC
每一个激活了STP的接口都维护着一个cost值,接口的cost主要用于计算RPC,也就是计算到达根的开销。
在一个运行STP协议的交换网络中,某端口到根桥累计的路径开销就是所经过的各个桥上的各端口的路径开销累加值,这个值叫做根路径开销(Root Path Cost)。根桥上所有端口的根路径开销,以及同交换机上不同端口间的路径开销值均为零。
默认使用IEEE802.1T标准
接口ID --- PID
每一个运行了STP协议的交换机的接口会存在一个PID值,来标识该接口信息。
接口ID长度是16bit,高4bit是接口优先级,低12bit是接口编号。
接口优先级默认为128,可以修改,取值范围0-240,必须为16的倍数。
STP协议采用的是BPDU(Bridge Protocol Data Unit,桥协议数据单元)类型报文,也称为配置消息。STP就是通过在设备之间传递BPDU来确定最终修剪完成的网络拓扑结构。
配置BPDU:用来进行生成树计算和维护生成树拓扑的报文,是初始阶段中各交换机发送的BPDU消息。
TCN BPDU:当拓扑结构发生变化时,下游设备用来通知上游设备网络拓扑结构发生变化的报文。它是当拓扑稳定后,网络中出现了链路故障,网络拓扑发生改变时所发送的BPDU消息。
BPDU载荷被直接封装在以太网数据帧中,数据帧的目的MAC地址是组播MAC地址:0180-c200-0000
在交换网络初始化过程中,每台交换机都从自己激活了STP的接口向外发送配置BPDU。
当STP收敛完成后,只有根网桥才会周期性发送配置BPDU,缺省为2秒。非根网桥会在自己接收到根网桥发送的配置BPDU以后,使用触发更新方式,将自己的配置BPDU发送出去。
配置BPDU的长度至少要35个字节,包含了桥ID、路径开销和端口ID等参数
只有当“发送者BID”或“发送端口PID”两个字段中至少有一个和本桥接收端口不同,所收到的这个BPDU报文才会被处理,否则丢弃。这样避免了处理和本端口信息一致的BPDU报文。
协议版本 --- PVI
stp ·········> 0;
rstp ·········> 2;
mstp ·········> 3
标志字段 ---STP仅仅使用了最高位(TCA---拓扑变 更确认标记)和最低位(TC--->拓扑变更标记)
消息寿命
与TTL值相同,但是为设备数量,代表BPDU从发出到现在经过的时间。
初始值为0,没经过一台交换机,数值加1。
Max Hop参数----最大消息寿命,默认值为20。
生存时间
缺省20秒
该报文用于在网络拓扑发生变化时,向根桥通知变化的发生。该报文是为了修改全网交换机的MAC地址表信息而存在的,而非是为了改变STP的生成树结构。
本地交换链路发生故障后,STP将重新收敛,为了加快刷新全网交换机的MAC地址表,故障交换机会向本地其余运行了STP的接口发送TCN BPDU报文
邻居交换机收到TCN BPDU报文后,将回复一个TCA标记为1的配置BPDU报文,用于可靠性传输。
该过程会一直持续到根网桥接收到TCN BPDU报文。
注意:非根网桥不能主动发送配置BPDU,故需要等待接收到根网桥的BPDU后,将TCA标记位置为1,转发给故障设备。
之后该TCN BPDU会一直转发到根网桥处,由根网桥下发TC标记位为1的配置BPDU(只有根可以设置该标记位),逐级下发给所有交换机。
所有交换机在收到TC标记位为1的配置BPDU后,会立即将MAC地址表的老化时间临时性修改为15秒(转发延迟),使得MAC地址表能够提前刷新。
根桥选举 --- RB <········ 交换机角色
选举范围:整个交换网络
一个交换网络有且只有一个根网桥
选择最小BID ---- 在进行BID比较时,先比较桥优先级,优先级值小的为根桥;当桥优先级值相等时,再比较桥MAC地址,MAC地址小的为根桥。
根网桥是具有可抢占性的。
根接口 <········ 接口角色
选举范围:每一个非根网桥设备上,有且只有一个跟接口。
所谓根接口 ---- 是非根网桥上所有接口中收到最优BPDU报文的接口。
指定接口 <········ 接口角色
选举范围:两台交换机之间的物理链路上选举一个指定接口。有且只有一个。
该接口是该物理链路内达到网桥最优的接口,也就是接收到最优的BPDU报文的接口。
对于非根桥而言,其所有接口中收到最优BPDU的接口将成为该设备的跟接口,随后,该非根桥使用自己接收到的最优BPDU,为本设备上的其他接口各自计算一个BPDU报文。
然后使用计算出的BPDU报文与该接口上所接收到的BPDU报文进行对比,最优的BPDU报文,那么该BPDU所在的接口为指定接口
一般而言,根网桥的所有接口都是指定接口;在存在跟接口的链路上,对端必然是指定接口。
非指定接口
所有的不是跟端口和指定端口都被称为非指定端口。而**非指定端口会被交换机进行
被阻塞的接口既不会接收也不会转发业务数据,且该接口不会发送BPDU报文,但是可以接收BPDU报文。
选择具有最小桥ID的BPDU。
这一步,实际上是在选举根网桥。通过对比BID参数。
比较入向BPDU的RPC数值,选择最小的接口作为最优BPDU报文。
如果交换机接收到的多个BPDU报文的RPC相同,则比较对端设备的BID,选择具有较小BID参数的设备所对应的接口作为最优BPDU报文。
如果存在对端设备的BID相同,则比较对端的PID值,选择较小的PID所在接口的对应接口作为最优BPDU报文。
若对端PID相同,则比较本端接收到BPDU报文的接口的PID值,选择较小的作为最优BPDU报文。
STP交换机初始化启动后,都会认为自己是根网桥,并在发送给其他交换机的配置BPDU中宣告自己为根桥。因此,此时的BPDU中的根桥ID为各自设备的网桥ID数值。
当交换机收到网络中其他设备发来的BPDU后,会对比BPDU报文中的根桥ID字段和自己的BID。
交换机不断交互BPDU报文,同时对BID进行对比,最终选举一台BID最小的交换机作为根网桥,其他为非根网桥。
根网桥的角色是可抢占的。
选举完根网桥后,根网桥仍然会持续性发送配置BPDU报文,起到保活的效果。而其他非根网桥将持续不断的收到根网桥发送的BPDU,并计算自己的BPDU报文从其他指定端口发送出去。
每个交换机根据从自己不同接口收到的BPDU报文中选择出最优的BPDU,从而选举根端口。
RPC
比较对端BID
比较对端PID
比较本地PID
每台交换机的每一条链路选举指定端口
RPC
BID
链路两端的PID
在确定了根端口和指定端口之后,交换机上所有剩余的端口都被称为非指定端口。并且会在逻辑上阻塞所有的非指定端口。
当非指定端口被阻塞后,生成STP树。
被阻塞的接口既不会接收也不会转发业务数据,且该接口不会发送BPDU报文,但是可以接收BPDU报文。
在交换网络中,一般将网关所在地、流量汇聚地点以及STP根网桥三点合并在一起。
禁用状态(Disable)
此时端口不仅不能转发 BPDU 报文,也不能转发用户流量。端口状态为Down。
接口禁用生成树协议。
阻塞接口(Blocking)
是生成树协议激活后进入的第一个状态。
该状态会停留一个最大老化时间(20秒)。然后进入到下一个状态。
此时端口仅可接收并处理BPDU,不转发用户流量。
侦听状态(Listening)
可以收发BPDU报文。进行STP角色选举过程。
该状态会选举出根网桥、根接口、指定接口和非指定接口。
停留一个转发延迟时间(15秒)后,进入下一个状态。这也是一种过渡状态。
只有根端口和指定端口会进入到学习状态,而非指定端口会退回到阻塞状态
学习状态(Learning)
接收业务流量,并学习MAC地址信息,但不转发用户流量。----目的:为了减少单播帧的洪泛。
停留一个转发延迟时间(15秒)后,进入下一个状态。
这是一种过渡状态,增加Learning状态为防止临时二层环路。
转发状态(Forwarding)
可以正常接收和转发业务数据和BPDU报文。
只有根端口和指定端口可以进入该状态。
①:端口从禁止状态开始初始化或者使能后首先进入阻塞状态。
②:在端口突然被禁用或者链路失效时将从当前其他所有状态下直接进入到禁用状态。
③:在端口被选举为根端口或指定端口后,由阻塞状态进入到监听状态。
④:在端口不再是根端口或指定端口时,会从当前其他状态直接进入阻塞状态。
⑤:当新选出的根端口和指定端口要经过两倍的转发延时(即从监听状态进入学习状态,再从学习状态进入转发状态)后才能进入转发状态,以确保新的配置消息传遍整个网络,防止临时环路的产生。
基于计时器进行收敛。
首次收敛 --- 50s(阻塞20s + 2 * 转发延迟)
根桥故障 --- 50s(最大寿命 + 2 * 转发延迟)
直连链路故障 --- 30s( 2 * 转发延迟)
非直连链路故障 --- 50s(最大寿命 + 2 * 转发延迟)
Hello Time(Hello定时器)
Hello定时器是指运行STP协议的设备发送配置BPDU的时间间隔,即设备会每隔Hello Time时间向周围的设备发送配置消息BPDU,以确认链路是否存在故障。
默认为2s。
当网络拓扑稳定之后,该定时器的修改只有在根桥修改后才有效。新的根桥会在发出的BPDU报文中填充适当的字段以向其他非根桥传递该定时器修改的信息。
当拓扑变化之后,TCN BPDU的发送不受这个定时器的管理。
Forward Delay(转发延时)
转发延时是设备进行状态迁移的延迟时间,是指一个端口处于Listening和Learning状态的各自持续时间,缺省是15s。即Listening状态持续15s,随后进入Learning状态,然后再持续15s。
链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。 但是重新计算得到的新配置消息不可能立即传遍整个网络,如果此时新选出的根端口和指定端口就立即开始数据转发的话很可能会造成临时的二层环路。为此,STP 采用了一种状态迁移机制,新选出的根端口和指定端口要经过两倍的 Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息传遍整个网络,从而防止了临时环路的产生。
Max Age(最大生存时间)
最大生存时间是指端口的BPDU报文的老化时间。
运行 STP协议的网络中非根桥设备收到配置BPDU报文后,会对报文中的Message Age(消息生存时间)和Max Age进行比较:如果Message Age小于等于Max Age,则该非根桥设备继续转发配置BPDU报文;如果Message Age大于Max Age,则该配置BPDU报文将被老化。该非根桥设备直接丢弃该配置 BPDU,可认为网络直径过大,导致根桥连接失败。
当配置 BPDU从根桥发出时报文中的Message Age值为 0。配置BPDU报文每经过一个桥,Message Age增加 1。
[sw1]stp enable ? ---启动STP协议,华为默认开启该协议
[sw1]stp mode stp ---修改STP的工作模式,默认工作模式为MSTP
?
[sw1]stp root primary ? ---将交换机设定为根网桥,其本质是将优先级修改为0
[sw2]stp root secondary ---将交换机设定为备份根网桥,其本质是将优先级修改为4096
[sw3]stp priority 8192 ---将交换机优先级设定为8192
?
[sw6-GigabitEthernet0/0/1]stp port priority ? ---修改接口优先级,干涉PID数值
INTEGER<0-240> Port priority, in steps of 16
?
[sw6]stp pathcost-standard ? ----修改本地开销值计算方法类型,全网均需要修改
dot1d-1998 IEEE 802.1D-1998
dot1t ? ? ? IEEE 802.1T
legacy ? ? Legacy
?
?
[sw6-GigabitEthernet0/0/1]stp cost ? ----直接修改接口cost值
INTEGER<1-200000000> Port path cost ---该参数可以修改的范围是根据开销值计算类型而定
?
[sw1]display stp ? ---查看STP协议运行状况
[sw1]display stp brief ---查看STP接口状态
DESI ········> 指定接口
ROOT ········> 根端口
ALTE ········> 备份端口