我们平时应用到的STP,虽然可以保证2层网络的无环路,但是他本身也存在一些缺点。比如STP机构收敛速度慢,根交换机的身份很容易遭受威胁,不安全,没有一种措施来巩固他们的根交换机的身份。如果要是这样的话,那么在一个网络中,有可能这个网络的STP结构就会频繁的变化,导致网络中的数据包大量的增加,从而导致网络阻塞,甚至出现断网的现象。
 
所以,我们这次就就收敛速度和安全这俩个方面来讨论、学习下STP的特性。
我们要知道STP的收敛过程,和中间参加的每一个“人”,这样才可以很准确的下手来解决这个问题。
 
首先要说的就是“portfast”特性!这个特性的功能就是让一个阻塞的端口快速的进入到转发状态。而不用经过中间的监听和学习的状态,这样的话,就减少了很多端口角色的转换时间,也就减少了STP的收敛时间。显然呢,从上面的功能中,可以看的出这个功能是在端口上实现的,也就是说他是一个端口级的命令。当配置的时候,你得进入到你启动这个特性的端口下,然后输入命令:spanning-tree portfast 。然后就OK 了。如果说,这个端口接收到BPDU的话,那么他就会进入到err—disable状态(相当于阻塞的状态),停止接收数据包。并且这种状态会一直持续到“err—disable”设定的超时或者是进行手动干预。如何设定超时的时间,进行手动干预又该如何来做呢?OK ,现在给出大家相应的命令:超时时间的设定-----全局配置模式下,使用命令errdisable recovery interval {value};进行手动干预的操作是关闭接口,然后再打开-----shutdown -----no shutdown !!全部OK 了。
 
那么我们这个特性在任何类型的接口下都可以使用吗?因为我们在交换机上,平时可以见到的有俩种类型的接口:访问接口 Trunk接口。当然,是可是使用的,但是呢,我们一般都不会在trunk接口上使用这个特性的。因为在Trunk口上实现这个portfast特性,将存在产生桥接环路的危险。 并且,我们强烈建议的是:在访问接口上都要使用这种特性。为什么呢?因为在访问接口下面,我们连接的都是终端,而不是交换机等网络设备,所以呢,我们要禁止在这个接口下面使用交换机等网络设备。想想看,当这个接口下面接了一个交换机的话,那么这个交换机在刚加入到网络环境中的时候,肯定会认为自己是根交换机啊,就会发送BPDU来进行根交换机的选举。这样的话,就会给网络带来不必要的数据流量,因为我们根本就不想让他成为根交换机,以免影响网络的稳定性。所以,我们就干脆启动了这个特性,这个特性就禁止了接受BPDU数据,所以呢,连接进来的这个交换机就无法干预正常的网络结构了。这个端口呢,也会因为接收到BPDU包而进入到err-disable状态。从而不会进出任何的数据。我在我们这里就发现了这样一个问题:一个宿舍的俩个人要上网,但是下面接了一个小的交换机。这个时候他们就都上不去了。我们还用命令ping 呢,当然到网关也是没有任何反映了。后来实在没办法就去了那个机房,看了下接口,后面的括号里显示的是err-disable。我们关闭了这个端口,然后重新打开就OK 了。
 
因为访问接口下面接的全是终端,不可以接网络设备,为了避免设备的接入导致网络的不稳定,所以我们在所有的接入接口上都会启动这个特性,并且明确的在和交换机相连的上联接口上禁用这个特性。一个是安全,一个是加速了网络的收敛速度。另外还有个命令可以同时达到把接口设置成接入模式,并开启这个功能。这个命令就是:spanning-tree host 。当然了,是在接口配置模式下。
 
 
接下来,我们就说下另外的一个特性:UplikeFast
上面的PORTFAST特性,我们说的针对接入模式的接口的。那么我们这个特性就是针对trunk模式的接口的了。首先呢,他的功能也是实现端口角色的快速转换。从阻塞状态直接转换到转发状态。这不,这个端口的快速转换又加快了网络的收敛。上面我门说portfast特性是针对具体的接口的,所以我们都会在接口配置模式下进行。其实,在全局模式下也是可以进行配置的,命令:spanning-tree portfast default 他的解释是这样的:enable portfast by default on all access port 。就是说在所有的接入模式端口下默认的启用这个特性。非常的好。因为这本来就是我们一直强烈推荐的。这个UPLINKFAST特性的设置是在全局配置模式下进行的。在全局模式下启动了这个特性以后,那么在这个交换机上的根端口和其他所有的阻塞端口就备受这个特性的关注。当这个根端口的链路出现故障的时候,这个端口就会使用那些阻塞端口中的一个合适的端口快速的进入到转发状态。为什么说是合适的端口呢?因为在这个端口的状态转换过程中,其实是牵涉到俩个过程的:一个是端口的选择,一个是角色的转换速度。而UPLINKFAST中只是加速了端口角色的转换速度。端口的选择,也就是根端口的选择咯,需要比较其他的一些参数,端口开销+路径开销+端口ID
另外呢,启动了这个特性以后,对交换机还有一定的保护作用啊。当这个端口接受到BPDU的时候,他不会按照那种STP原始的通告方法,把这种BPDU发送到根交换机,然后跟交换机再发送到所有的交换机,这样的话就会浪费很多的时间,无疑是大大延长了收敛时间。当他接收到这样的BPDU以后,他就会发送到一个多播地址,也叫做为伪多播地址。这个地址就代表了所有连接到根交换机的交换机。这样呢,就不用走那么长的时间了。并且,这个特性可以使得这个端口在接收到这样的BPDU的时候,将自己所在地交换机的优先级增加到49152,这样的话,就可以保证这个交换机绝对成不了根交换机了。这不,在一定程度上也启动了根交换机保护的作用。但是呢,这种方法对于那种具有非默认的优先级和端口开销的交换机来说,就不好使了。所以呢,对于根交换机的防护我们还需要一种比较完全的方法。下面我们会讲到。
 
这个特性的启动的命令是:全局配置模式下spanning-tree uplinkfast
但是,我们如果再敲问号的话,我们还可以发现后面还有一个参数,max-update-rate ,这个参数说的是更新包的最大的传输速率。就是一秒钟之内更新包的最大数量。可以限制这种包的数量。默认的情况是150个数据包。
 
 
下面要讲的就是Backbone Fast 特性
 
可以说这个特性是对UplinkFast 特性的一种补充。Uplinkfast特性可以对连接到交换机本身的链路出故障的时候,可以准确的判断出来,并且进行快速的状态转换,但是他不能对间接的链路故障作出检测并进行修正。但是,Backbone Fast就可以啊~~ 在丢失根端口并且备份链路是采用不同的交换机情况中,这个特性就可以降低默认的收敛时间。但是这个特性的正常运作,需要网络中的所有的交换机都启用这个特性。当然了,CISCO交换机也支持第三方的交换机的这个特性。在实施这种特性的时候,一定要注意前提!
 

下面的讲述中提到的拓扑结构都是指的这个图。
 
在正常的工作状态下,L2是活动的,那么L1肯定就是阻塞的了。如果是L2出现故障后,那么交换机C可以立马检测到,并且把L3链路激活。利用的就是uplinkfast特性。也就说这个特性可以检测到直接的链路故障。但是当L1破坏的时候呢?正常的情况下,是这样的工作过程:当L1破坏了以后,交换机B就接收不到任何的BPDU了,这个时候,他就会自动的参与到根交换机的选举中,也就是他会发送自己的BPDU,其中包含着他本身的一些信息。这个时候呢,这个阻塞的L3链路就会传输BPDU到交换机C,那么他就会比较这个信息吧。如果这个成功的话,那么他不会立即应用这个根交换机的,他会在最大寿命时间以后,才会删除那个先前的根交换机的信息并应用现在这个新的根交换机。那么这个过程我们可以看到是:最大寿命时间+2倍的转发延迟时间。默认的情况是:20+2*15=50秒。
 
这样的话,时间就算是很长的了。如果我们使用了Backbone Fast特性的话,那么收敛的时间就会减少到30S。就不会有那个最大寿命时间了。下面看下使用了这个特性以后的工作过程:当L1坏掉的时候,交换机B还是那样,就认为自己是老大了,然后发送BPDU,宣告自己的一些信息。告诉别人就是老大。这个时候,通过L3传输到交换机C。交换机C收到这样的信息后,不会茫然的接受了,而是要从原来的根接口发送一个根链路查询BPDU。目的就是为了确定下以前的那个根交换机是否还活着呢,如果是的话,就不去理睬这个从交换机B发来的信息了,而是把那个接着交换机B的端口进入到转发状态,并且是指定端口的角色。这样的话,交换机B又可以到达根交换机了。你看,这样的话,收敛时间不是相当的快吗?就是一个BPDUL2上的来回时间。也许朋友们得说,不是还在L上跑了吗?因为只有在L2上跑的这段时间网络状态才是不稳定的啊。那个L3上跑的时候,网络的结构还是很稳定的。网络里的数据还是可以进行正常转发的。上面是根交换机不变的情况。如果说这个时候,交换机C的根端口也出了问题,那如何是好呢?现在这个时候,如果除了这个根端口以后,还有其他的备份的链路吗?(当然了,在这种情况下,是绝对没有了,因为我们一定要注意我们实施这个特定的前提条件是什么、、、)这个时候,我们只能考虑是根端口坏掉了,并且没有其他的链路了,怎么办呢?那么就接受这个交换机B成为根交换机,并且转变那个端口的状态和角色,立马进入工作状态。也不会等待交换机C的最大寿命时间到期了。最后一句非常的重要。这个就是运用这个特性和不运用这个特性最大的区别。这样一来呢,不但检测到了间接链路的故障,还大大提高了收敛时间。非常的好啊~~~
 
这个命令的实现也是在全局配置模式下:spanning-tree backbonefast
并且一定要记住的是:如果想让这个特性最好的为网络服务的话,那么加入的交换机都得使用这个特性。如果不是全部开启的话,那么肯定链路收敛的时候速度会不同步啊~~就会影响网络的收敛速度了。
 
 
3个特性的简单比较:
Portfast:应用在接入模式的端口上的,为了防止下面的接网络设备,同时也加快了端口的转换速度,提高了STP的收敛速度。还会抑制BPDU,只要接收到BPDU,端口就会进入到Err-disable状态。只有到了时间或者手工干预才可以啊~~~
Uplink Fast:这个也是应用在端口上的,到那时却是Trunk模式的端口。这个特性使得在活动链路出现故障的时候能够快速的进行端口角色的转换,并且还以抑制BPDU,减少发送这些BPDU所用的时间。并且在一定的程度上还有防护根交换机的功能。
Backbone Fast :可以说是第二个特性的补充!不但可以检测到间接的链路故障,还可以大大的缩短STP的收敛时间。
 
 
上述的这些特性都是在2层交换机上进行设置的。并且这些特性在设置的时候,一定要非常的清楚是设置在那个端口上,是设置上什么类型的端口上。如果想做到熟练的应用,我觉得对网络的拓扑结构有一个清楚的了解是非常重要的,可以说是实施这些特性的基础~~~
 
 
下面呢,我们还要讲几个特性,说是增加STP的弹性(么是弹性啊?哈哈、、、)
BPDU防护特性:这个特性就是说端口不接收BPDU,如果接收到的话,就会进入err-disable状态。只有到了超时的时间或者是手动进行干预才可以回复过来。这个特性我们在上面讲PortFast特性的时候也提及到了。我们使用这个命令的时候,是在全局配置模式下的:spanning-tree portfast bpduguard default。他的解释是这样的:Enable bdpu filter by default on all portfast ports 。也就说在这个交换机的所有的portfast接口上都会使用这个特性,都不接收BPDU。我们还可以在特性的接口上进行配置:spanning-tree bpduguard enable 就是在这个端口上启用这个命令。他的功能的解释是这样的:Don't accept BPDUs on this interface 。看清楚了啊,只是写得不接收BPDU 哦。我用的CISCO2960
BPDU过滤特性:这个命令的功能,我们可以使用在交换机上查看命令的方式,来理解这个命令的功能:全局配置命令spanning-tree portfast bpdufilter default。对他的意思的解释是这样的:Enable bdpu filter by default on all portfast ports 。要注意到,说的是在所有的PORTFAST接口上实现这个特性。我们还可以到接口配置模式下进行配置:spanning-tree bpdufilter enable 。看看对这个端口下的BPDU过滤特性的解释:Don't send or receive BPDUs on this interface 。可以晓得BPDU的防护特性和过滤特性有什么差距了吧~~~一个是只是不接收,而这个是发送和接收都是不允许的~~~~这样的话就彻底的保证了这个端口的下面的设备不会对网络的正常运行产生不良的影响。
注意啊,这些特性的实施都是建立在端口是接入模式的端口之上的哦~~~并且,都是启动了portfast特性的可别忽略了前提。 我们可以先是全没模式下启动这个特性,然后我们再在那些特性的上联端口上关闭掉这个特性: spanning-tree porfast diable 。其实这个叙述是多余的,因为启动这个特性的接口都是接入模式的端口,而那些上联的端口是trunk模式的,呵呵、、、快迷糊了~~~
 
根防护特性:这个功能就是通过在接口上运用一个命令来实现的。当然了,这个接口你得 慎重的选择。当运用了这个特性以后,这个端口就被强制的设置成STP的指定端口的角色。这样的话,下面无论接什么类型的设备,都不会成为根交换机了。因为即使是下面这个设备发送来更好的BPDU,那么他也不会受理。就直接进入err-disable了,这个状态在这里又叫做STP不一致状态(stp inconsistence)。一直到下面的这个设备不再发送BPDU,这个端口才恢复到正常的转发状态。因为这个特性的霸道性,所以我们应用的时候得格外的小心谨慎。我们要在根交换机的各个端口上使用这个特性,是可以的。我们也可以在我们故意设置的备份交换机上设置这个特性也是可以的。但是也得选择是那些端口上。这样的话,就可以完全的巩固根交换机的身份了嘛,不会让外来的设备来捣蛋了~~~嘿嘿、、这个根防护特性是在端口模式下配置的:spanning-tree guard root ,解释是这样的:Set guard mode to root guard on interface ~  想想看,如果我们把各个宿舍的网口都设置成这个根防护特性,那么他们下面就不能接小交换机了啊~~其实对于2层交换机的这种连接终端的端口实施一个BPDU过滤就已经够用的了吧,就不用再用这个更狠的了吧~~~
        同时呢,我们也需要清楚某个端口下的网络的最大的流量啊~~因为如果下面的数据量很大,但是那个端口的带宽很小的,就会产生丢包的现象,厉害了就会导致链路OVER,那样的话,就很有可能导致网络拓扑的改变,如果是频繁改变的话,就会严重影响网络的稳定性啊~~~所以从这个角度来看,理解一个端口的带宽大小和这个端口下的网络的最大流量是很有必要的。并且在正确的端口上实施根交换机防护特性也是当务之急啊!!!!
 
剩下的工作就是需要我们来验证这些配置信息了。我们可以通过几个命令来查看这些配置信息:
        Show spanning-tree summary detail
        Show spanning-tree interface type slot/value
        Show spanning-tree interface type slot/value detail
        Show spanning-tree inconsistenports
对于最后一个命令,我们可以查看到那些STP不一致状态的端口,这样的接口也就说明了这些显示的结果下面连接的设备发送了BPDU了嘛~~~或许是这个设备是刚加进来的,并且还是STP参数没设置好,敢来影响正常的网络机构。或者是这个设备产生了什么问题,导致发疯,无法自控了~~~哈哈、、、那么就有必要进来看看这个设备的健康状况咯!!
 
得学会从设备的显示结果中分析自己想要的结果啊~~~
 
老重要了!!最近学会的~~不是太早,呵呵、、、也说不上很晚~~哈哈、、、、
 
到此,我的总结就OK~~