一、前言
STP(生成树协议)是应用在交换机中的一个协议,主要用途是解决交换机环路问题,本篇总结了环路产生原因、STP原理、STP配置。
二、环路
网络中环路的危害比较好说,比如广播风暴、MAC地址漂移,反正网络中出现了环路肯定是不好的。而环路出现的原因一般是因为“冗余”,一般的示例如下图,让我不好理解的是LSW14和LSW12为什么要连一根线,这样做有什么意义吗?虽然3台交换机用作示例是比较好处理的。
所以我更喜欢用下面的网络结构,看起来比较实际。
上图结构的问题很明显,汇聚交换机如果只有一台那是非常危险的,如果出现单台的故障那整个公司的网络都“扑街”,所以汇聚层必然是需要“冗余”一台的,像下图这样。
这样看不出环路问题,我们只需要稍微挪一下,可以看出4台交换机其实是一个环路。
要打破环路也很简单,比如我们将其中一根线人为断开,比如把某个端口down掉。
但这样产生了新的问题,那就是当主用的LSW5故障时,LSW4下面的网络就瘫痪了,这时候需要我们人为的去把LSW15的端口up起来。从发现网络故障到找到人去up端口中间可能过去半个多小时了,这对于一些重要业务来说是不可接受的。所以就需要一个协议或者机制可以自动down掉某个端口来断开链路,在发生单机故障时又能自动恢复链路使网络恢复正常。
这样的东西已经有啦,那就是STP生成树协议。
三、STP原理
1.生成树
STP为什么要叫生成树协议呢?想象一下,有什么东西既没有环路,各个节点之间又可以互通的。那不就是“树”了嘛,比如下图这样“复杂”的网络结构。
我们只是在接入层的交换机也做了主备,稍微整理下,会发现出现了至少4个环路,如下图。
如果要使环路消失,同时每一台交换机又能够互通,我们需要“断开”不必要的链路,比如像下图这样。
这是不是看起来就像树,LSW1是根,其他的是分支。如果网络继续复杂,我们在汇聚层上面再加一层,也是主备。
稍微整理下,你会发现结构其实非常熟悉。
所以要打破网络中的环路,最重要的是找到一个“根”,接着从根出发找到最快到达所有节点的路径,最后将不必要的路径“断开”。为了从功能上实现这一点,STP协议使用了一些概念:
1)根网桥与非根网桥,根网桥就是作为树根的交换机,非根网桥就是除树根外其他所有的交换机。
2)根端口,非根网桥上,距离根较近的端口
3)指定端口,每一条链路上,距离根较近的端口
4)阻塞端口,如果一个端口不是根端口,也不是指定端口,那他就是阻塞端口。我们将阻塞端口阻塞起来,网络中的环路就消失啦。
为了依次找到根网桥、根端口、指定端口等,STP协议做了一些约定,并根据约定做各项“选举”,最终得到根和各端口。
2.根网桥
根网桥选举依据:
1)先看优先级
2)优先级一样看MAC地址
3)相对较小的是根网桥
通过“dispay stp”命令,可以查看CIST Bridge这个值,其中32768就是优先级,4C1F-CC33-2ADE就是MAC地址,可见所有交换机默认优先级都是一样的32768,那就比较MAC地址较小的,其中LSW4的MAC地址相对最小,所以它就是根网桥,其他除LSW4之外的就是非根网桥。CIST Bridge就是桥ID,也即是BID。
3.根端口
根端口指的是“非根网桥”上,距离根网桥较近的端口,而且每一个非根网桥上有且只有一个根端口,其实也就是在交换机上的所有端口中选一个根端口。选举依据有:
1)路径开销,就是端口的带宽,带宽越大开销越小,端口总开销的计算是“将根桥到达端口前所有’入’端口开销加起来”,这里只计算入口不计算出口,总开销较小的就是根端口。我们使用的交换机端口默认开销都是200000,这个可以通过display stp查询。
2)对端BID,如果开销一致,则比较对端的BID(也就是CIST Bridge的值),值较小的就是根端口。
3)对端PID,如果BID也一样就比较对端的PID,PID指的是Port ID,由端口优先级(默认128)+端口号组成。
4)本端PID,如果对端PID也一样,那就比较本端的PID,较小的就是根端口了。
下图将所有端口的总COST都标示出来了。
对于LSW2,两个端口的总COST一样,对端BID明显是靠近根桥的那个更小,所以E0/0/2是根端口。同理LSW3的的E0/0/2是根端口。同理LSW1的根端口是E0/0/2。
为了做下一步的分析,我们假设LSW1两个端口对端的BID一致(这样才能继续分析PID的情况)。可以看到对于LSW1的两个端口,其对端PID是相等的,所以接着可以比本端PID,这个不可能会相等,所以在这个假设情况下E0/0/1会成为根端口,不过这只是假设哈。
我们实际选举出的根端口应如下图所示。
4.指定端口
指定端口,指的是链路上的两个端口中,距离根网桥最近的端口,选举依据有:
1)路径开销,链路上两个端口中路径开销最小的就是指定端口
2)交换机BID,路径开销一样时,链路上两个端口所在交换机BID较小的是指定端口
3)端口PID,BID也一样时,则比较端口的PID,较小的是指定端口
注意前面选根端口时是在同一个交换机上的不同端口进行选举,而现在是同一个链路上的两个端口间进行选举。像下图标红处,一个链路是由两个端口连接在一起形成的,指定端口要在组成链路的两个端口上进行选举。
其实一个正常的链路在比较BID时就能得到指定端口了,但为预防有人把同一个交换机的两个端口连起来,所以再加了个PID的比较就万无一失了。
此外,对于根网桥上的端口,它的端口COST值是200000,但它到根网桥实际开销其实是0,因为他就在根网桥上。根据开销的比较我们可以得到所有指定端口如下图:
5.阻塞端口
最后非根、非指定端口就是我们要阻塞的端口了,也就是LSW1上的E 0/0/1这个端口。
四、STP配置
通过命令display stp,可以看到交换机默认就启用了MSTP协议,现在我们将其调整为stp协议,并看下执行结果与我们预期的是否一致。
一共只需要3个命令就完成了STP的启用。
而后我们用display stp命令看下结果,如下图,根据MAC地址可以知道LSW4确实被选为根网桥。
接着我们可以看看LSW4的两个端口状态,如下图,Designated port就是指定端口的意思。
再看下LSW2和LSW3,可以看到两个端口的状态都是无误的。
最后看一下LSW1,一个根端口一个阻塞端口,其中Alternate是备用的意思,所谓阻塞端口也就是备用端口的意思,当其他链路出现故障时,这个端口会被启用作为备用的意思。
五、回顾
STP相关的命令不多,而根桥、根端口、指定端口的选举也不复杂,需要注意的是端口总“开销”指的是根桥到该端口所需要“入”的端口开销和。