前言:
交换网络为了避免单点故障,通常接入交换机与交换机之间通常要两条或者两条链路连接,但是这样会很容易产生环路,进而产生广播风暴,mac地址表震荡等对网络有重大危害的机制,思科和华为的设备默认STP就已经启动(傻瓜交换机没有STP,有广播风暴很可能会down机),通过上面这张拓扑就可以模拟广播风暴和mac地址震荡。
广播风暴:我们仅要在上图当中的PC配置一个IP,然后把三台交换机默认启动的生成树协议通过stp disenable关闭。使用192.168.0.1/24 ping 192.168.0.255会产生广播 ,我们就可以任意位置打开抓包软件看到广播风暴,因为产生了环路,广播风暴的现象就是大量的,相同的广播。单纯的阐述无法深刻理解广播风暴的危害,我仅在在PC上ping 192.168.0.255只ping了11次,大约10秒左右,结果就产生了16万个的广播,效果图如下:
地址震荡:在广播风暴期间,我们可以在任意一台交换机上通过dis mac-address查看mac地址表,会发现,连接PC的MAC地址会不断的变换接口,因为交换机会在不同的接口学到同一个PC的MAC地址,效果如下:
当有了STP之后,一切变的不同了,广播风暴没有了,地址震荡也不会出现了。STP是怎样做到的呢?STP只是阻塞了某一个交换机的某一个接口,并不是真的阻塞了,只是在逻辑上阻塞了,这样的话,形成不了环路,没有环路,就没有广播风暴,同时也没有地址震荡,只会在一端学习到MAC,接口MAC不会一直变化了;不仅环路没有了,而且还有了冗余,当正在工作那个接口down了,原本处于阻塞的接口会启用。
总结:交换机通过运行STP算法,阻塞特定的端口实现冗余无环网络。
STP
当无环树形成之后,根桥不断的发送BPDU,根接口会不断的接收DPDU包,而指定端口会一直转发BPDU,阻塞的接口不动但是会一直侦听,如果有一段时间收不到BPDU包,就会把自己置于侦听状态并发送BPDU包与广播域内的其它交换机PK,此过程在下文端口状态小节当中有详细解释。
例一:
第一步首先选举出根桥,先比较优先级,三台交换机的优先级都是一样的,然后比较背板MAC,交换机一的MAC最小,所以交换机一是根桥。
第二步每个非根桥选举出一个根接口,先比较开销,交换机二的1接口与2接口相比到达根桥的开销更小,所以交换机二上的1号接口是根端口。
交换机三上的5接口与6接口相比到达根根桥的开销更小,所以交换机三的5号接口也是根端口。
第三步在每条链路上选出指定端口,交换机一上的3号和4号接口是指定接口,还要从2号和6号接口里面选择一个,首先看开销,它样的开销是一样的,然后sw2和sw3比较桥ID,交换机二的桥ID小一些,所以2号接口是指定端口
阻塞6号接口。
第一步首先选举出根桥,先比较优先级,三台交换机的优先级都是一样的,然后比较背板MAC,交换机一最小,交换机一是根桥。
第二步每个非根桥选举出一个根接口,先比较开销,交换机二3号接口到根桥的开销比4号接口要小,所以3号接口是根接口。交换机三的5号接口到根桥的开销是19+19,6号接口到根桥的开销是100,所以5号接口是根接口。
第三步每条链路选举出一个指定端口,1和2都是指定接口,在4号和6号接口里面选出一个指定端口,先比较开销,明显4号接口的开销比较小,4号接口是指定接口。
6号接口是阻塞接口。
第一步选举出根桥,先比较优先级一样,然后比较背板MAC,交换机一最小,交换机一是根桥。
第二步非根桥选举出根端口
交换机二的3号接口到根桥的开销比4号要小,所以3号接口是根端口。
交换机三的8号接口到根桥的开销比7号要小,所以8号接口是根端口
交换机四的两个接口到根桥的开销都是一样的,然后比较发送者的优先级,5号接口从交换机二上收到BPDU包,6号接口从交换机三上收到BPDU包,就是比较交换机二和交换机三的优先级,优先级一样 ,再然后是比较MAC,交换机二的MAC小一些,所以5号接口是根接口。
第三步每条链路选举出一个指定端口,1,2接口是指定接口,4号接口比5号接口到根桥的开销要小,7接口比6号接口到根桥的开销要小,所以1,2,4,7,是指定端口。
6是阻塞接口。
第一步选举出根桥,先比较优先级一样,然后比较背板MAC,交换机一最小,交换机一是根桥。
第二步每个非根桥选举出一个根端口,3号和4号接口先比较到达根桥的开销,开销一样,然后比较发送者的桥ID,还是一样,再然后比较发送者的接口ID=优先级+接口号,发送者就是1和2号接口,那就比较1号接口和2号接口的接口优先级,这个优先级可以通过抓STP报文中port ID看到,这里我们且当1号和2号接口的优先级是一样的,接下来比较接口号的大小,1号接口比2号接口要小,所以1号接口对应的3号的接口是根接口。
第三步每一条链路选举出一个指定端口就是1,2。
剩下的4号接口会被阻塞。
端口状态
1. 卧薪尝胆,把握时机。所有的接口在刚刚启动时都是处于阻塞状态,在阻塞状态只能被动的接收BPDU包,这个时长会维持20秒的时间,如果20秒之内没有收到BPDU包,说明网络拓扑发生了变化,自己有机会成为侦听状态,它就会自己的状态自动调整成为侦听状态。
2. 欲与天公试比高,背水一战。在侦听状态就尝试向外发送BPDU报文,拿自己的桥ID与广播域内所有的交换机进行PK,成王败寇,如果自己的桥ID最小,将把自己置为根桥。如果自己的不大不小,很可能自己就是根端口或者是指定端口,如果自己的根桥最大的话,意味着自己会成为阻塞接口。如果自己有幸成为根桥,或者是接口被选举出根端口或者是指定端口的话,就会由侦听状态进行下一个状态学习状态,如果自己的被选举成为阻塞接口,就退出阻塞状态继续卧薪尝胆,等待时机,这个PK的过程是15秒左右。
3. 机会总是留给有准备的交换机。进入到学习状态还是会接入BPDU包,接入BPDU包的目的是构建自己的MAC地址表,为什么这时候要构建MAC地址表,直接上来转发不行吗?上来转发倒是也可以,只是有一个问题,上来就转发的话MAC地址表什么都没有,肯定会不断泛洪会影响带宽,所以在进入转发状态之前交换机给自己留下了15秒的时间去构建MAC地址表,机会总是留给有准备的接口的!这个学习的过程也会持续15秒左右。
4. 能力越大,责任越大。之后会进入转发状态,在转发状态什么都干,不仅发送BPDU也接收,不仅学习数据帧还转发数据帧,在此状态也可以向MAC地址表填入MAC地址。
5. 打入冷宫。禁用状态,当接口被管理down或者物理down,什么都不能做,肯定也不会转发。
基本操作
为什么要修改优先级呢?就像下图:
选举的阻塞接口是6号接口,这样的话,sw3的PC流量到核心交换机话就得绕路从2—5—4---1接口走,不能直接从sw3直接到达核心交换机,根据STP算法自动算出的阻塞端口虽然没有环路,但是并不是最好的,最好是从2,5号接口当中选出一个,为什么?因为sw3和sw2下面要接PC,而PC的流量想要到达核心的话,阻塞2和5号端口任何一个都不会绕路的,是最优的。但是交换机也不会按照我们的意愿,但是我们还是可以通过修改交换机的优先级来按照我们的意愿选举阻塞接口的。
那么我们现在就想让2号或者5号端口成为阻塞接口,我们应该怎样做呢?。我们只要让SW1成为根桥不就行了嘛(在选举阻塞接口通常都是在根桥对面的两个点上选择一个),当sw1成为了根桥之后,它正对面不就是2号和5号端口嘛,必定有一个阻塞接口,至于哪一个就无所谓了,无论是哪一个都不会让PC的流量绕路。
让SW1成为根桥也非常的简单,只要把SW1的优先级调整的高一些就好了,如下,把sw1的优先级调整为0,它就会以绝对的优势成为根桥了,有一点注意注意,优先级必须是4096的倍数。
[Huawei]stp priority 0 #0是优先级的最小了。
根据这个规律,其实我们在生产环境当中,通常都是把核心交换的优先级调整到0的。
根据优先级指定根桥是非常稳妥的行为,其实让一个交换机成为根桥不仅仅是这一个方法,还要一种方法,如下:
[Huawei]stp root primary #成为根桥
这条命令是直接把根指定成为当前的交换机,其实它背后的工作原理也是通过降低优先级完成的,只不过,这个优先级是自动向下调整的,直到成为域内最小,很少使用这个方法,不稳妥,还有一条命令可以成为备份根桥。
[Huawei]stp root secondary #成为备份根桥
成为备份根桥,优先级仅次于根桥,根桥挂了,自动顶上。
边缘端口
带有STP交换机一个端口从阻塞到转发状态要经过大概要40秒到50秒左右的时间,这一段时间是用来探测有没有环路,确认没有环路后才会启动,但是接PC的的接口用不着探测,接PC的端口肯定不可能发生环路,当我们把一个交换机的端口配置成为边缘端口之后,这个接口从阻塞状态到转发状态就不再经过侦听状态,开启了直接就转发。
int g0/0/3 #进入连接PC的那个交换机端口stp edaged-port enabled #把此接口配置成边缘端口
我们想要验证的话也非常的简单,在不开边缘端口的时候接一个PC然后一直ping网关,看看多个包后能能够ping通,然后开启边缘端口再ping,再看看多少个包之后能够ping通。
下图是不开边缘端口时,PC插上交换机的接口后就开始ping,第一波一个包都不通,第二波才通,中间大约用了30秒左右。
下面是在交换机上开了边缘端口时,PC插入交换机上就开始ping,速度明显比不开边缘端口时快很多,第一波就通了。
根保护
假如有人捣乱,有人在接入层交换机上接口下也接了个华为交换机,把自己的优先级改成0,接入之后发送BPDU要PK决定根桥,很有可能会破坏网络,根桥易主,这时候就要用来根保护的技术。
我们可以在根桥上使用一个指令,实现如果发现接入用户的接口发现有BPDU之后分析,如果优先级比真正的根桥还要小,如果放任此BPDU通过会威胁到真正的根桥,会把此BPDU丢弃,然后把接入发BPDU的那个接口给阻塞了,然后每隔一段时间再检测一下这个接口,如果没有BPDU并且优先级低于真正的根桥就将此接口给打开,不在阻塞,给用户一个机会,让其翻然悔悟,注意此指定只能在指定端口配置才会生效,也就是配置在根桥的两个端口,防止有人能够威胁到根桥的地位。
如果上图为例,假如sw1是根桥的话,根保护就应该配置在sw1的1号和3号端口。
protection保护,根桥上的端口都是指定端口,两个接口都要运行一个此命令
当核心发现有人想抢的它的位置,不允许,生气,马上把接口给置于dis状态,不玩了,除非能够改正
int g0/0/2stp root-protection
用实验验证一下,找一个交换机四把优先级调整成最低然后接入广播域里面,让这个交换机去抢根桥,结果经面易举的就是根桥给抢过来了,然后在把此交换机断开,在真正的根桥的两个接口上开启了根保护之后,又把交换机四接入到广播域当中,结果去真正的根桥的查看,交换机四虽然比真正的根桥优先级要小很多,但是并没有把根桥抢过来,真正的根桥发现有交换机想要抢自己的根桥,就会通过根保护把接口给关掉,不给别人威胁它地位的机会。等到交换机四断开或者优先级威胁不到真正的根桥时,真正的根桥才会把已经关闭的接口给打开。
BPDU防护
假如我们在接入交换机连接PC的端口上做了边缘端口,做了边缘端口之后启动时就不会有STP了,端口开启的速度变快,但是有一个缺点,有的员工不知道这个端口是边缘端口,结果把一个根的两端都接入到了同一个交换机上,一旦收到广播,环路又产生了。为了防止这个情况的产生,我们可以在做了边缘端×××换机上,通常是接入层的交换机上使用DPDU防护。
当在做了边缘接口的交换机上使用了DPDU保护之后,如果从边缘端口收到了stp报文,交换机会自动将该接口shutdown,从而确保不会发生环路。
[sw]stp bpdu-protection #全局下配置
想要恢复有两种,管理员给接口下,手动un do
还有一种方法就是30秒后自动恢复机制
[Huawei]error-down auto-recovery cause bpdu-protection interval 30
#如果是因为bpdu保护导致的接口doww30秒后自动恢复