Uplinkfast / Backbonefast / Portfast

24 Jul

上一篇STP主要介绍了802.1d的标准生成树,它最大的问题就是收敛时间太慢了,通常需要30s-50s才能完成收敛。本篇介绍3种收敛模式,及Uplinkfast / Backbonefast / Portfast解决方案。

STP收敛:(有3种收敛方式)

20160118185317850

直连链路收敛:收敛时间30s

以上图为例。正常情况下SW1是根桥,SW2的f0/2被阻塞。现在如果SW1和SW2间直连的链路down掉,那端口也down掉。端口up /down会导致SW1会发出TC报文通知全网将MAC地址表老化,SW2的f0/5口根端口消失后,需要选新的根端口,经过15s的Listening时间后,原本被阻塞的f0/2口被选为新的根端口,再经过15s的Learning时间学习MAC地址后进入Forwarding状态。总时间是30s。因此例如原本SW1上连PC1,SW2上连PC2,两台PC通过SW1和SW2间直连链路通起来。直连链路down后,两台PC会有30s无法通信,30s后经SW3恢复通信。

非直连链路收敛:收敛时间50s

如拓扑图中SW1和SW2间连了HUB。那HUB挂了后,SW1和SW2的f0/5口仍旧是OK的,仍旧能每隔2s发送BPDU。即链路down了,但端口没有down。此时原本SW2的f0/5口每隔2s会收到SW1的BPDU,现在链路down了,SW1虽然仍旧在发送,SW2却收不到。STP里介绍BPDU报文字段时介绍过,Message age会计时,Max age为20s。20s后SW2的f0/5口仍旧没有收到新的BPDU,就知道该链路出问题了。就用f0/2口的BPDU,经过15s的Listening,选举f0/2口为根端口,再经过15s的Learning时间学习MAC地址后进入Forwarding状态。总时间是50s。因此例如原本SW1上连PC1,SW2上连PC2,两台PC通过SW1和SW2间经HUB通起来。HUB挂了后,两台PC会有50s无法通信,50s后经SW3恢复通信。

不重要的链路收敛:收敛时间30s

即上图中链路都正常,任意交换机上连PC。将PC接入或拔掉,就是不重要的链路发生变化。好比你要上网就电脑网线接一下,不用了就将网线拔掉。这种链路的变化肯定不会导致网线拓扑里根端口发生变化,但就如STP里TCN报文的例子所说,端口只要检测到up/down,就会向根桥发送TCN报文。根桥会向全网发送TC报文通知全网将MAC地址表老化,经Listening,Learning各30s后重新进入Forwarding。所以每次PC接上网线要等30s才能上网。

解决方案:UplinkFast

UplinkFast是思科私有协议,提供了非根桥的交换机上快速切换根端口的能力(根桥上不能配置UplinkFast端口)。拓扑图中SW2上配置成UplinkFast后,f0/2口可以跳过Listening和Learning直接Forwarding,将收敛时间减少到1s以内。通常只在接入层交换机上配置UplinkFast,且该交换机至少有一个端口处于被阻塞状态,链路失效必须发生在根端口时才有意义。例如常在有双上行去往根桥的交换机上配置成UplinkFast。

一旦被配置成UplinkFast,交换机会自动调整一些STP参数,因此要谨慎。因为STP参数自动调整后可能会引起STP拓扑的变化:

1.交换机的优先级会增加到比缺省值要高(32768+4096),以保证交换机不会被选为根桥(根桥没有任何根端口)

2.交换机上所有端口的cost值会增加3000(19+3000),以保证交换机端口不会被选为指定端口

配置命令很简单:

SW2(config)#spanning-tree uplinkfast  //交换机上全局配置成UplinkFast   
SW2#show spanning-tree uplinkfast     //可以查看交换机上根端口和备份根端口     

如果是直连链路收敛,主链路发生故障后,SW2的f0/2口直接Forwarding,将30s收敛时间减少到了1s。如果是非直连链路收敛(SW1和SW2间连着HUB),HUB故障后,SW2的f0/2口径20s的Max age时间后直接Forwarding,将50s的收敛时间减少到了20s。

最后,UplinkFast通常只在老式交换机上用,新式交换机常用802.1w和802.1s。

解决方案:BackboneFast

UplinkFast解决的是自身根端口直连收敛。BackboneFast解决自身非直连收敛。如拓扑图中SW1和SW3间链路down掉,该条链路对于SW2来说就是非直连链路。SW3检测到故障,根端口down了,且SW2不会发送BPDU给SW3(端口f0/2被阻塞),因此SW3认为自己是根桥,发送BPDU给SW2宣告自己是新根桥。SW2之前收到过该BPDU,因为等级低,所以f0/2口才被阻塞,因此该BPDU会被忽略。计时器max_age超时(20s)后,最先的f0/2口的BPDU老化失效,该端口进入Listening状态,会收到SW1和SW3发送的BPDU,显然SW1的BPDU优先级高,SW2会发送BPDU给SW3。SW3一收到SW2的BPDU就停止发送它的BPDU。端口f0/2通过Listening和Learning状态后进入Forwarding,花费30s。总共50s。

Backbone fast解决这个问题:刚开始和上面一样,SW2收到SW3的次优BPDU就开始重新确认它的非指定端口(而非被动等待20s的max_age时间)。它在根端口上发送RLQ请求给根桥SW1(因为SW3声称它是根桥,但SW2认为根桥应该是SW1)。根桥SW1收到请求,马上回复RLQ指出这个方向上仍旧有根桥SW1存在。SW2已经检测了所有非指定端口,它仍然有到达根桥的路径。可以立即老化掉存储在端口f0/2上的信息。端口f0/2进入Listening并发送BPDU,节省了max_age时间。配置了BackboneFast的交换机检测到间接链路失效后,阻塞端口立即Listening->Learning->Forwarding,节省了20s的max_age时间,将原本50s的收敛时间减少到了30s。

配置命令很简单:

SW1(config)#spanning-tree backbonefast  //可以只在SW2上配,但万一其他链路也挂了呢?所以通常全都配  
SW2(config)#spanning-tree backbonefast    
SW3(config)#spanning-tree backbonefast  
      
SW1#show spanning-tree backbonefast     //查看BackboneFast的配置  

最后,BackboneFast通常只在老式交换机上用,新式交换机常用802.1w和802.1s。

解决方案:PortFast

上面介绍过不重要链路收敛时间要30s,因此插拔一个终端后30s后才能接入网络,实在太慢了。PortFast接口不需要经历Listening 和Learning,可以直接Forwarding,收敛时间减少到了1s以内。而且PortFast口的Up/Down都不会产生TCN报文导致全网 Mac地址表老化重新收敛了。

20160117204154249

例如上图三台交换机组成一个网络,由于有STP因此不会形成环路。此时在SW1上接入一个路由器R1,也可以是一台PC,正常情况下,交换机端口只要检测 到up/down,就会向根桥发送TCN报文。根桥会向全网发送TC报文通知全网将MAC地址表老化,经Listening,Learning各30s后 重新进入Forwarding。所以R1接入后要等30s才能上网。可以将交换机上接终端的端口(SW1的f0/9)配置成portfast:

20160117204642351

交换机上PortFast端口的Up/Down不会产生TCN报文导致全网Mac地址表老化重新收敛,收敛时间从30s减少到了1s内,R1瞬间就接入了网络。原理是PortFast口表明该端口是接入层交换机的端口,且端口不参与STP计算,肯定不会形成环路。

可以看到上面有一端自动生成的warning警告信息:PortFast口不要接交换机,只能接非交换设备,如路由器或PC等。如果PortFast口接了交换机,因为不进行重新选举,可能会形成环路。因此一旦交换机上某端口被配成PortFast口后,该端口如果收到BPDU立刻变回普通端口。因为收到BPDU就意味着该端口连接到了交换机上,那它PortFast的能力就需要被取消。

最后PortFast口可以如上在端口下配,也可以全局配。全局配的话,交换机会自动为Access口启用PortFast功能,而Trunk口不会启用PortFast功能。如果你想对Trunk口也生效(当然该Trunk口肯定不是接交换机的,而是接其他设备,比如单臂路由的接口接路由器)那只能到端口下配,命令后加上trunk即可:

SW1(config-if)#spanning-tree portfast trunk

Leave a Reply

Your email address will not be published. Required fields are marked *