闲聊STP/RSTP(Spanning Tree Protocol)
STP(Spanning Tree Protocol),1998年IEEE提出的802.1D协议,它是一种二层(数据链路层)管理协议,通过有选择性地阻塞网络冗余链路来达到消除网络二层环路的目的,同时具备链路的备份功能。说白了就是解决以太网中的防环,和顺带解决链路备份。
一、建立STP
STP协议它是通过形成一棵无环的树。树形的网络结构必须有树根,于是STP引入了根桥(Root Bridge)概念。STP网络,根桥在全网中只有一个,它是整个网络的逻辑中心,根桥会根据网络拓扑的变化而动态变化。网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他设备收到该配置BPDU后,如果优先级比自己的配置BPDU高,则非根桥设备会根据收到的配置BPDU中携带的信息更新自己STP端口存储的配置BPDU信息,否则会丢弃该配置BPDU。
两种度量:生成树的生成计算有两大基本度量依据:ID和路径开销。
ID ID又分为:BID(Bridge ID)和PID(Port ID)。
BID:桥ID
IEEE 802.1D标准中规定BID是由16位的桥优先级(Bridge Priority)与桥MAC地址构成。BID一个是8字节。其中优先级占据高16位,就是2的16次方,65535 。但是只用了前面4位,一步长是4096,优先级最小位0,最大为61440,默认是32768。
其余的低48位是MAC地址。
在STP网络中,BID最小的设备会被选举为根桥。
PID:端口ID
PID一共2字节,由两部分构成的,高8位是端口优先级,低8位是端口号。实际上也只是用了高4位,其余12位为端口号。优先级范围是2的8次方。(0-255)。
路径开销
路径开销(Path Cost)是一个端口变量,是STP协议用于选择链路的参考值。STP协议通过计算路径开销,选择较为“强壮”的链路,阻塞多余的链路,将网络修剪成无环路的树形网络结构。在一个STP网络中,某端口到根桥的路径开销就是所经过的各个桥上的各端口的路径开销累加而成,这个值叫做根路径开销(Root Path Cost)。
三要素选举
从环形网络拓扑结构到树形结构,总体来说有三个要素:根桥、根端口和指定端口。
根桥RB(Root Bridge):根桥就是网桥ID最小的桥,通过交互配置BPDU协议报文选出最小的BID。
根端口RP(Root Port):所谓根端口就是去往根桥路径开销最小的端口,根端口负责向根桥方向转发数据,这个端口的选择标准是依据根路径开销判定。在一台设备上所有使能STP的端口中,根路径开销最小者,就是根端口。很显然,在一个运行STP协议的设备上根端口有且只有一个,根桥上没有根端口。
指定端口DP(Designated Port):根交换机上全是指定端口,一个网段中有且只有1个指定端口,在2个非根网桥中,指定端口是根据端口所在的网桥的BID进行选择,选小的一方为指定端口,另一方为阻塞端口。
特殊情况除外:
五种端口状态:
收敛时间:
1.Blocking-- —>Listening ----->15秒 —>Learning----->15秒 —>Forwarding。
从阻塞到转发一共30秒。
2.如果是非根交换机的根端口出现故障,STP的收敛时间为20秒次优BPDU+Listening ----->15秒 —>Learning----->15秒 —>Forwarding= 50秒;
3.如果是非直连故障,STP的收敛时间为: BPDU 最大老化时间20秒+Listening ----->15秒 —>Learning----->15秒 —>Forwarding=50秒。
所有综上所述,STP 的收敛时间为 30秒---------50秒。
定时器:
对于STP,影响端口状态和端口收敛有以下3个时间参数:
Hello Time
运行STP协议的设备发送配置BPDU的时间间隔(默认情况下,hello time 2秒一次)。设备每隔Hello Time时间会向周围的设备发送BPDU报文,以确认链路是否存在故障。当网络拓扑稳定之后,该计时器的修改只有在根桥修改后才有效。新的根桥会在发出的BPDU报文中填充相应的字段以向其他非根桥传递该计时器修改的信息。但当拓扑变化之后,TCN BPDU的发送不受这个计时器的管理。
Forward Delay
设备状态迁移的延迟时间。链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新配置消息无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成临时环路。为此,STP采用了一种状态迁移机制,新选出的根端口和指定端口要经过2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息传遍整个网络,从而防止了临时环路的产生。
Forward Delay Timer指一个端口处于Listening和Learning状态的各自持续时间,默认是15秒。即Listening状态持续15秒,随后Learning状态再持续15秒。这两个状态下的端口均不转发用户流量,这正是STP用于避免临时环路的关键。
Max Age
端口的BPDU报文老化时间,可在根桥上通过命令人为改动老化时间。Max Age通过配置BPDU报文的传输,可保证Max Age在整网中一致。运行STP协议的网络中非根桥设备收到配置BPDU报文后,报文中的Message Age和Max Age会进行比较:如果Message Age小于等于Max Age,则该非根桥设备继续转发配置BPDU报文。如果Message Age大于Max Age,则该配置BPDU报文将被老化。该非根桥设备直接丢弃该配置BPDU,可认为网络直径过大,导致根桥连接失败。如果配置BPDU是根桥发出的,则Message Age为0。否则,Message Age是从根桥发送到当前桥接收到BPDU的总时间,包括传输延时等。实际实现中,配置BPDU报文每经过一个桥Message Age增加1。
BPDU报文
STP采用的协议报文是BPDU(Bridge Protocol Data Unit),也称为配置消息。STP通过在设备间传递BPDU报文来确定网络的拓扑结构,并完成生成树的计算。BPDU报文被封装在以太网数据帧中,
目的MAC是组播MAC:01-80-C2-00-00-00。
STP协议的BPDU报文分为以下两种:
配置BPDU(Configuration BPDU):用来进行生成树计算和维护生成树拓扑的报文。
TCN BPDU(Topology Change Notification BPDU):拓扑变化通知BPDU,是在网络拓扑发生变化时,用来通知相关设备的报文。
配置BPDU
网桥之间通过交互配置BPDU来进行根桥的选举及端口角色的确定,配置BPDU在以下3种情况下会产生:
1.只要端口使能STP,则配置BPDU就会按照Hello Time定时器规定的时间间隔从指定端口发出。
2.当根端口收到配置BPDU时,如果优先级比自己的配置BPDU高,则会根据收到的配置BPDU中携带的信息更新自己STP端口存储的配置BPDU信息并从指定接口向下游发送,否则会丢弃该配置BPDU。
3.当指定端口收到比自己差的配置BPDU时,会立刻向下游设备发送自己的BPDU。
配置BPDU报文格式:
stp flags字段:
TCN BPDU: 拓扑变更BPDU
TCN BPDU的结构与配置BPDU基本相同,主要是关注:
Protocol Identifier(协议号)
Protocol Version Identifier(协议版本)
BPDU Type(BPDU类型)。类型字段是固定值0x80,长度只有4个字节。
TCN BPDU是指在下游拓扑发生变化时向上游发送拓扑变化通知,直到根节点。
TCN BPDU在如下两种情况下会产生:
端口状态变为Forwarding状态。
指定端口收到TCN BPDU,复制TCN BPDU并发往根桥。
二、维护STP:
发现链路故障的交换机,会将产生的 TCN BPDU ,沿着根端口一直上传,传输到根交换机。但是在上传过程中,为了确保该 TCN BPDU 的稳定传输,所以发送该报文的交换机,必须收到上联交换机发送过来的 TCA BPDU ,此时才算做刚才的 TCN BPDU 传输成功,然后停止传输。然后上联交换机,继续通过根端口,向上传输,一直重复这个过程中,一直传输到根交换机。
根交换机一旦收到一个 TCN BPDU 之后,就会产生一个 TC BPDU 用于通知所有的非根交换机STP网络拓扑发生了变化。任何一个交换机收到 TC BPDU 之后,都会迅速的将自己的MAC地址表中的动态条目的存活时间降低为 15s 。
三、STP的缺点:
STP 网络的故障修复时间为: 30s — 50s ,就有了RSTP的诞生(Rapid Spanning Tree Protocol)。
四、RSTP的改进
1. 端口及角色 细化了端口角色 -根端口 -指定端口 -alternate 端口 (替代端口),替代的是“根端口”,即去往根交换机“第二好”的端口; -backup 端口 (备份端口),备份的是“指定端口” ;
增加了边缘端口---->边缘端口不参与STP计算,状态直接从discarding到forwarding。
精简了端口状态 -discarding,丢弃 -learning,学习 -forwarding ,转发
2. 报文的改进:
配置BPDU格式的改变,充分利用了STP协议报文中的Flag字段,明确了端口角色。
在配置BPDU报文的格式上,除了保证和STP格式基本一致之外,RSTP作了一些小变化:
Type字段,配置BPDU类型不再是0而是2,所以运行STP的设备收到RSTP的配置BPDU时会丢弃。
Flags字段,使用了原来保留的中间6位,这样改变的配置BPDU叫做RST BPDU,
3. 发现故障:
在RSTP协议中,并不是每个端口的状态一旦变化,就被认定为“故障”,只有非边缘端口从阻塞到Forwarding时,才算作是链路故障/拓扑变更。
4. 通知故障快:
任何一个发现故障的交换机,都可以从主机的所有的根端口和指定端口发送 TC BPDU 。并且在发送的时候,这些端口上都会启用一个 TC While timer,默认是 hello 计时器的两倍。每个交换机收到 TCBPDU 之后,不是将 MAC 地址表迅速老化为15s ,而是直接清空MAC地址表。
5. 解决故障快:
端口发生故障处理办法:
-根端口 -alternate 端口 ,替代的是“根端口”,即去往根交换机“第二好”的端
-指定端口 -backup 端口 (备份端口),替代的是“指定端口” ;
1.根端口快速切换机制 如果网络中一个根端口失效,那么网络中最优的Alternate端口将成为根端口,进入Forwarding状态。因为通过这个Alternate端口连接的网段上必然有个指定端口可以通往根桥。
2.引进了P/A机制:端口状态的转变,不再依靠计时器。而是 靠P/A 机制。只有确定了端口角色之后,想要确定端口状态时,才会使用该机制。-------->让指定端口快速进入Forwarding状态
什么是P/A机制:
6.RSTP的保护功能:
1.引入“边缘端口特性”。这种端口,一旦收到BPDU,就会立刻将该端口阻塞掉,成为:error-down 状态。想恢复:
&手动:进入该端口,
执行 shutdown --> undo shutdown
&自动:可以在系统视图下配置命令:
error-down auto-recovery cause bpdu-protection interval 30
即:交换机因为 bpdu 保护功能而阻塞的端口,会在30s自后,自动的转变为 forwarding;如果再次收到BPDU,那么就会再次进入到 error-down ;
2.根保护:
主要作用是强制一个接口,永远为“指定端口”,如果连接这个端口的其他交换机,向该端口发送一个更好的BPDU;该端口就会进入到 discarding,从而防止了该端口上连接的其他交换机抢占原根交换机的位置。一旦该端口收到的更好的BPDU没有了,这个端口,会再次自动的恢复过到 forwarding 状态。
配置命令:
interface gi0/0/x
stp root-protection -> 该端口启用根保护,确保该端口永远是指定端口。
3.环路保护:
在运行RSTP协议的网络中,根端口和其他阻塞端口状态是依靠不断接收来自上游交换设备的RST BPDU维持。当由于链路拥塞或者单向链路故障导致这些端口收不到来自上游交换设备的RST BPDU时,此时交换设备会重新选择根端口。原先的根端口会转变为指定端口,而原先的阻塞端口会迁移到转发状态,从而造成交换网络中可能产生环路。 为了避免该问题的发生,我们可以在交换机上开启“环路保护”功能,此时,一旦出现上述问题,对方交换机也仅仅是转变端口角色,变成指定端口。但是,端口的状态是进入到了 discarding 。从而,防止了环路的发生。环路保护功能只能在根端口或Alternate端口上配置生效。
配置命令:
[Huawei]interface gi0/0/x
[Huawei-GigabitEthernet0/0/1]stp loop-protection
4.防TC BPDU 攻击
交换设备在接收到TC BPDU报文后,会执行MAC地址表项和ARP表项的删除操作。如果有人伪造TC BPDU报文恶意攻击交换设备时,交换设备短时间内会收到很多TC BPDU报文,频繁的删除操作会给设备造成很大的负担,给网络的稳定带来很大隐患。
启用防TC-BPDU报文攻击功能后,在单位时间内,交换设备处理TC BPDU报文的次数可配置。如果在单位时间内,交换设备在收到TC BPDU报文数量大于配置的阈值,那么设备只会处理阈值指定的次数。对于其他超出阈值的TC BPDU报文,定时器到期后设备只对其统一处理一次。这样可以避免频繁的删除MAC地址表项和ARP表项,从而达到保护设备的目的。即规定一个端口在单位时间内处理的 TC BPDU 报文的数量。默认情况下,1s中,最多只能处理1个TC BPDU 。 如果在1s收到很多很多的 TC BPDU , 那么其他的多余的BPDU,就等到下个周再次处理。从而防止了:
配置命令:[Huawei]stp tc-protection 开启
[Huawei]stp tc-protection threshold x 设置阈值