前面曾经有过一篇文章,介绍如果企业只使用一台交换机来组网,就会存在单点故障,如果交换机坏了,此时的几个模块之间都无法进行正常的工作,客户机不能访问服务器,不能连接internet,不能访问打印机,也就是一点发生故障,则整网络无法正常工作。所以在一般的交换式网络中,我们都需要对交换机进行冗余,但是引入冗余又会发生一个问题,一个很严重的问题,就是网络环路。那么网络环路会带来广播风暴、多重复数据帧、MAC地址表不稳定等因素。那么大家可以看到网络环路的问题确实不小,解决方法就是利用生成树协议STP。
Spanning-Tree Protocol:简称为STP,该协议可应用于环路网络,通过一定的算法实现路径冗余,同时将环路修剪成无环路的树型网络,从而避免报文在环路网络中“长生不老”。
以太网交换所所实现的快速生成树协议RSTP(Rapid Spanning Tree Procotol)是生成树协议的优化版,其“快速”体现在根端口和指定端口进入转发状态的延时在某种条件下大大缩短,从而缩短了网络拓扑稳定所需要的时间。
MSTP(Multiple Spanning Tree Procotol)是多生成树协议的缩写,该协议兼容STP和RSTP。
咱们来详细介绍一下STP:STP是为克服冗余网络中透明桥接的问题而创建的,目的是通过协商一条到根网桥的无环路径来避免和消除网络中的环路,它通过判定网络中存在环路的地方并动态阻断冗余链路来实现这个目的。通过这种方式,它确保到每个目的地都只有一个路径,所以永远都不会产生环路。
将环路中的一个次优接口设置在Block(阻止)状态,从而将环路打破。注意,仅仅是该接口设置为Block状态,仅仅是一个状态,而不是真正的将此接口关闭。因为一旦网络中其他链路出现了问题,这个被block的接口还可以还原为forwarding(转发)状态。如图所示:
基本思想:在此把每个交换机称为网桥,所以我们在介绍的时候,如果讲到网桥,就知道是指的交换机就可以了。每个交换机在启动的时候,都认为自己是根桥,那么就讨论开始竞争到底谁当根,大家定义好一个游戏规则,在网桥之间传递特殊的消息BPDU(Bridge Procotol Data Unit)网桥协议数据单元,包含足够的信息做以下工作:从网络中的所有网桥中,选出一个作为根网桥,然后再计算本网桥到根网桥的最短路径。而且根桥是每2秒钟发送一次BPDU。BPDU数据帧中包括了很多内容,如图所示:
我们在这里只关心网桥ID(包括两个字节的优先级和6个字节的MAC地址)。
选择根桥的方法是比较每一个交换机的Bridge ID也就是桥ID,这个桥ID的格式是:
有两部分组成:一个是桥优先级,一个是MAC地址,但是思科的交换机优先级默认都是32768,如果优先级相同,再比较后面的MAC地址,MAC肯定是不同的,所以小的就是根桥,
在一个网络中,只能有一个根网桥,其他的网桥就称为非根桥;根桥上的每一个端口都称为指派端口,也可以说根桥上的每个端口都是根端口,但是非根桥上的端口叫法就不同的,非根桥有一个端口叫根端口,其他端口叫非指派端口。
刚才我们说了,如果有多个交换机,选择根网桥使用的是bridgeID,那这里在非根桥上我怎么知道哪个是根端口,哪个是非指派端口呢,这里也有一个准则,就是依次比较每个端口到达根网桥所花代价+优先级+MAC地址+端口号(从左到右依次比较软小者),这里又可以分为是一个交换机的多个端口和多个交换机的多个端口之间如果选择。#p#
如果是同一个交换机,那么起决定作用的就是到达根桥代价最小的端口是根端口,关键是这里怎么知道哪个端口代价最小呢,这是根据带宽定义的:
其中这个代价指的就是开销,开销越小就说明连接速率越大,速度越快。我们再看上面的那个图,有两个链路,一个是100BASET,一个是10BASE-T,一个开销是100,一个开销是19,明显选择上面的那个端口作为根端口。那么下面的那个端口就是非指派端口,就会将它指定为BLOCK,不可用状态,直到根端口不可用时,它才会“翻身”。但是要注意的是这个端口怎么Block了,不能发送用户数据,但可以继续接收BPDU。
那么如果是多个非根网桥希望选择一个根端口,则先比较代价,如果代价相同再比较优先级,如果优先级也相同再比较MAC地址,这肯定是不同的。
针对这个图来说,处理Block状态的端口应该是交换机Y的端口1,因为两边的链路代价是一样的,优先级默认也相同,所以就比较MAC地址,但因为交换机X的MAC地址小,所以它的端口都是forwarding状态。但是交换机y的端口1就Block了。
以上是我们所分析的根桥以及根端口和指派端口和非指派端口的选择问题。那么一个端口从开机到正常工作会处于四种状态,分别是block,listening,learning,forward,我们来分析一下:
Block------为了防止网桥发生loop,所有的端口开始都处于Block状态。如果交换机在其他端口收到了同一个BPDU,那么交换机就认为有另一条链路可到达根桥,如果生成树决定其他链路是到根桥更好的路径,那么这个端口继续保持block,那么如果本端口被交换机认为是***的端口,那么进入到下面的状态。这个时间是20秒,称为***生存周期。
listening-----端口从block状态转为listening状态,它利用这段时间来listening是否还有到根桥的其他路径。在此状态,端口可以倾听到配置消息,但是不能转发或接收用户数据。也不允许端口将它所听到的任何信息放到地址表中,这有15秒的时间。在这一段时间里的listening状态实际上就是用来说明端口已经准备好进行传输,但是它愿意再倾听一下以确认它不会产生loop.
learning-------学习状态与倾听状态非常相似,除了端口可以将它所学到的信息添加到地址表这一点之外,它依然不可以发送和接收用户数据。这个过程也是15秒。
forward-----这个状态意味着可以发送和接收用户数据。
那么如果一个非根交换机在20秒内没有收到任何配置信息,也就是没有收到BPDU就会认为该端口连接的链路发生了故障,于是就重新计算STP。再一次选择根桥,根端口,指派端口以及非指派端口。
以上就是关于生成树协议的比较详细的介绍,但需要注意STP只是针对二层的环路起作用,对于物理层的环路是不起作用的,一层环路可以说纯粹是人为的原因。
当然我们哆哩哆嗦的讲了这么多,真正要我们配置的命令并不多,因为思科默认就已经开启了生成树协议,在本节的结尾我会附上相关的实验来验证stp的作用。
还要注意STP只是针对二层的环路起作用,对于物理层的环路是不起作用的,一层环路可以说纯粹是人为的原因!!!
Lab1:生成树协议(spanning-tree)
实验目的:了解生成树协议的作用,以及网络中有冗余环路的情况下不开生成树协议的危害。
实验设备:两台Cisco系统交换机,一台pc机,两条以太网交叉线,一条以太网直连线。
拓扑图:
在两台交换机上都关闭生成树协议:
Switch(config)#nospanning-tree
验证方法:在两台交换机上都关闭生成树协议之后很快就能发现两台交换机互连的接口灯狂闪,这就是产生广播风暴了,这时候大家可以打开PC机上的性能监视器发现CPU的利用率也非常高。
可以使用show spanning-tree查看生成树协议的一些信息,如图所示:
可以看到这个交换机是根桥,还可以通过命令showspanning-treeinterface端口号,来查看端口信息!关于STP的内容我们就介绍到这儿了,还算简单吧!