作者:网络之路一天 首发公众号:网络之路博客(ID:NetworkBlog)
怎么防止环路的产生呢
假设有这样一个功能
要想防止环路,又实现线路备份的效果,假设交换机支持这样的功能,它能够根据某种算法,交换机之间发现自己的有多条线路,并且存在环路,直接把某一根线给阻塞掉,这样就相当于只有一根线在使用,比如上图,默认情况下把办公区三到E0/0/4的线路阻塞掉,这样转发路径只能是办公区1----核心交换机----办公区3
当这个路径中某一个线路出现问题后,自动启用备用线路,达到冗余的效果,这样是不是就能够防止掉环路了,那有没有这样的技术呢,有的,就是这篇要讲解的STP。
了解STP基础概念与选举
STP,全称Spanning Tree Protocol(生成树协议),它的出现就是为了解决二层环路问题,从最早开始的STP(802.1D)、到RSTP(802.1W)、最终主流的MSTP(802.1S)三个版本,这三个版本是IEEE组织公有化的标准,全部厂商都可以支持,STP是一个很庞大的知识点体系,所以对于新手朋友来说,特别的不友好,就不跟着厂家课程的思路来了,博主把初级阶段把重点挑出来,主要去明白它是如何防止环路的,然后配合工作中的一些经验分享,来帮助消化这部分,详细的体系就留到进阶课程里面,那时候大家对于整个网络框架的知识点有了一个不一样的理解,在来学习这个就轻松很多。
1、了解树的结构
先来看看大自然中树的结构的
一棵树,有根、树干、树枝、叶子,其中树根作为树的“营养器官”将吸收的水分、通过树干输送到树枝、在到叶子,整个运输的过程中都是顺利抵达到不同树枝的叶子上面,并没有出现原地绕圈的情况发生,这正式因为树的物理结构就是发散的,从树干、树枝没有任何的物理交织起来,自然就是没有原地打环的问题。
2、回顾之前环路的产生
对于上面这样的情形,他们IT最初的意愿是想着在原有线路的基础上面加一根线路,这样原本的线路出现问题后,这条线路能够直接替补上去,做一个很好的备份冗余作用,但这样却形成了一个封闭的物理环路,加上二层转发机制是除了源接口vlan以内的其他接口进行泛洪,这样就导致了发出去的流量无休止的在绕圈环路产生了。
3、STP需要了解的概念与术语
STP作为二层网络中主流的破环协议,接下来了了解下常见的一些概念跟术语。(交换机的前身是网桥,而STP的概念在网桥时代就有了,所以术语里面介绍的都是桥相关的)
(1)桥ID(Bridgeg ID ,BID)
每台交换机在出厂的时候都有一个不一样标识,就是桥MAC,在STP里面使用了桥ID来标识不同的交换机,每一台交换机运行了STP就有一个对应的桥ID,桥ID由两部分组成,一个2字节的桥优先级,默认32768(可以管理员自行修改),一个6字节的桥MAC,通常为默认VLAN1的MAC地址。STP引入两个参数组合成桥ID(简称BID),更方便管理员自由的调整(这句话先记住,下一篇实战会理解的透彻)
桥优先级(2字节) | 桥MAC地址(6字节) |
(2)根桥(Root Bridge,RB)
STP是仿生了树的结构来完成一个无环网络的构成,其中最关键的就是树根,在STP中根桥就是作为树的树根存在一样,当STP启动后,会第一时间选举出根桥,视为老大,其余设备作为非根桥,作为小弟。
(3)根路径开销(Root Path Cost,RPC)
STP上的交换机每一个接口都有对应的一个开销值,用于表示数据通过该端口发送时的开销,开销值越小表示带宽越高,技术发展到现在有2个公有标准,华为华三自己一个私有版本。
接口速率 | IEEE 802.1D | IEEE 802.1t | 华为华三私有标准 |
10Mbps | 100 | 2000000 | 2000 |
100Mbps | 19 | 200000 | 200 |
1Gbps | 4 | 20000 | 20 |
10Gbps | 2 | 2000 | 2 |
40Gbps | 1 | 500 | 1 |
华为华三设备默认运行的是公有标准最新的802.1t,也是为对接其他设备兼容性更好,当然如果是学过思科的,很多教材里面引用的是802.1D的标准(最新的不太确定有没有改过来),这里要注意下。非根桥到达根桥存在多条路径,每条路径都有对应的开销进行累计,方便计算出哪条路径距离根桥最近,另外开销的计算是数据通过端口发出的时候才开始计算,入端口不会计算开销。对于根桥来说,根就是自己,路径开销就是0。
(4)端口ID(Port ID,PID)
运行了STP的交换机每个接口都有一个端口ID,端口ID由2个部分组成,第一部分端口优先级(4比特),第二部分端口编号(12个比特),端口编号是无法改变的,优先级可以自由调整,默认是128。
端口优先级(4比特) | 端口编号(12比特) |
(5)BPDU(桥协议数据单元)
交换机毕竟是一个独立的个体,想要把一个二层网络里面的交换机形成一颗大树一样的树状结构,那就少不了需要相互“沟通”,来了解整个二层网络的结构拓扑,正是依赖BPDU,它包含了STP协议里面相关的所有信息,通过这些信息来完成生成树的计算,这里要注意,BPDU发送的是组播帧,目的地址为 0180-C200-0000,运行了STP交换机会产生、发送、接收、处理BPDU,其余未运行的则不参与。(组播的意思是只有运行特定协议发送的组播MAC、设备才能识别与处理,比如这个STP用的,自然启用了STP的才会处理它,而其他未运行的直接会丢弃,而广播则是所有设备都会进行处理,拆开里面内容,相当于组播是运行了特定协议的设备接受处理的范围,广播是整个能收到的范围内都需要处理)。
BPDU分为两种类型
- 配置BPDU(Configuration BPDU):用于生成树计算和维护的报文
- 拓扑变化通知BPDU(Topology Change Notification BPDU),简称TCN BPDU:在网络拓扑发生了改变,用来通知整个STP网络中的交换机。
4、STP树的生成过程
STP的原理就是在运行STP的交换机之间通过STP算法构建出一个无环的网络拓扑,被称为STP树。STP树生成的过程中会选举一个唯一的根桥,其他非根桥选举根端口和指定端口,负责转发数据,剩下没有角色的端口就被阻塞,不转发数据。
选举角色 | 参选 | 选举范围 |
根桥 | 交换机 | 整个二层网络 |
根端口 | 端口 | 每台交换机 |
指定端口 | 端口 | 每条链路 |
入门篇我们主要掌握它的选举过程,以及一些注意的地方即可,我们就以上面的拓扑来开始。
(1)选举根桥
生成一颗STP树,首先需要必须要确认一个根桥,这个根桥作为整个二层网络的逻辑中心(老大)。但是需要考虑这样一个问题,在每台交换机都接入到网络的时候,是不知道整个二层网络有多少交换机存在的,也不知道对方的桥ID是多少,所以呢,每台交换机在接入网络的时候都认为自己是根桥,从所有链路发送BPDU,告诉其他交换机,我是根桥。收到BPDU的交换机会比较BPDU中的根桥ID与自己的ID,把其中最小值的根桥ID记录在自己的BPDU的根桥ID里面,最终通过不停的交互BPDU,整个二层网络选出一台根桥ID最小的交换机作为根桥,选举完毕后,根桥会固定间隔发送BPDU,其他设备对根桥发送的BPDU进行转发, 保证网络拓扑的稳定性。
对于华为设备有三个办法查看桥MAC地址的方法,
通过display bridge mac-address查看
通过display interface Vlanif 1 查看
通过display stp查看
初始化的状态,三台交换机都认为自己是根桥,并且从自己激活的口把BPDU发送出去。(默认情况下只要全局开了STP,全部接口都会运行,这里激活的口指的是物理线路up的口),注意你如果是自己搭建的环境,可能跟我的桥MAC不一样,所以需要自己记录
开启抓包,我们来看下
[Core]stp enable //开启STP功能
[Core]stp mode stp //模式运行在STP(802.1D)
Warning: The global STP state will be changed. Continue? [Y/N]y
Info: This operation may take a few seconds. Please wait for a moment...done.
#
[bg1]stp enable
[bg1]stp mode stp
Warning: The global STP state will be changed. Continue? [Y/N]y
Info: This operation may take a few seconds. Please wait for a moment...done
#
[bg3]stp enable
[bg3]stp mode stp
Warning: The global STP state will be changed. Continue? [Y/N]y
Info: This operation may take a few seconds. Please wait for a moment...done.
之前我们已经关闭了STP,默认情况下 华为华三的设备大部分是开启的,并且运行的是MSTP,但是我们学习先讲讲STP,所以切换到了STP。
由于抓取的是核心的G0/0/1口,所以能看到自己发出去的以及收到办公区一的,这个就是BPDU,我们来看下包含了什么
- IEEE 802.3 Ethernet,这个是不是觉得跟平时的以太网有点不一样,这里就要提及一下,在以太网协议中,有两个版本,一个是IEEE 802.3的Ethernet,还一个EthernetⅡ, 其中EthernetⅡ作为我们平时PC、服务器等终端常用的版本,而IEEE 802.3的Ethernet常被用于二层协议中,比如这里的STP。
- 802.1d中,protocl 标识跟版本都是0,就是指的运行的802.1d
- BPDU Type:类型为配置BDPU
- Root identifier:根桥的BID,默认都认为自己是根桥
- Root Patch Cost:根路径开销,默认根桥的的cost都为0
- Brideg Identifier:发送交换机的BID
- Port Identifier:发送BPDU端口的ID(接口编号+优先级)
三台交换机通过BPDU比较以后,发现办公区一的桥ID最小,因为1<2<b,所以它成为了根桥。
当根桥出现以后,整个STP二层网络正常情况下就只有根桥在发送BPDU,其余的非根交换机作为传递者,转发给自己连接的其他交换机。
<Core>display stp
-------[CIST Global Info][Mode STP]-------
CIST Bridge :32768.4c1f-ccb3-26da
Config Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
Active Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
CIST Root/ERPC :32768.4c1f-cc1d-1983 / 2000
<bg1>display stp
-------[CIST Global
Info][Mode STP]-------
CIST Bridge :32768.4c1f-cc1d-1983
Config Times :Hello 2s MaxAge 20s FwDly 15s MaxHop
20
Active Times :Hello 2s MaxAge 20s FwDly 15s MaxHop
20
CIST Root/ERPC :32768.4c1f-cc1d-1983/ 0
<bg3>display stp
-------[CIST Global
Info][Mode STP]-------
CIST Bridge :32768.4c1f-cc24-1670
Config Times :Hello 2s MaxAge 20s FwDly 15s MaxHop
20
Active Times :Hello 2s MaxAge 20s FwDly 15s MaxHop
20
CIST Root/ERPC :32768.4c1f-cc1d-1983/ 200000
通过display stp查看当前的根桥与自己桥ID,当然如果你是自己搭建的
(2)选举根端口(Root Port ,RP)
根桥选举出来后,其他交换机被称为非根桥(非根交换机),STP会为每个非根桥选举出来一个根端口(在每一台所有接口中选取),在STP树稳定后,根桥后定期发送BPDU,而非根桥的根端口就是用于接收BPDU的,所以根端口选取一个离根交换机最近的接口 。
选举规则为
- 非根桥所有接口中到根交换机Path Cost值最小的链路
- 如果相同则比较,上一跳交换机Bridge-id最小的链路
- 如果相同则比较,对端端口ID最小的链路
这里先说明下,根桥发送自己发送出去的开销为0(因为自己是根桥),而其他非根桥是发出的时候才计算开销,进入是不计算的,然后根据接口
带宽的不一样,开销也不一样
接口速率 | IEEE 802.1D | IEEE 802.1t | 华为华三私有标准 |
100Mbps | 19 | 200000 | 200 |
1Gbps | 4 | 20000 | 20 |
核心交换机是千兆的,所以RPC=20000,而办公区的是百兆线路,所以PRC=200000,那么这个就好计算了。
核心交换机到根桥有两个接口
G0/0/1到根桥的开销是20000
G0/0/3到根桥的开销是20000+200000
G0/0/1到根桥的开销最小,G0/0/1当RP口(根端口)
办公区三交换机到根桥有两个口
E0/0/1口到根桥的开销是200000+20000
E0/0/4口到根桥的开销是200000
E0/0/4到根桥的开销最小,E0/0/4当RP口(根端口)
<Core>display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet0/0/1 ROOT FORWARDING NONE
<bg3>display stp brief
MSTID Port Role STP State Protection
0 Ethernet0/0/4 ROOT FORWARDING NONE
通过display stp brief查看端口的角色,核心是G0/0/1为根端口,办公三为E0/0/4。
这里直接第一个条件通过RPC就比较下去了,那其他的情况有没有呢?是有的,待会我们特别举例两个来看看,这里我们先把整个选举走完。
(3)选举指定端口(Designated Port ,DP)
根端口确保了交换机到根桥的路径是唯一的,也最优的。同样交换机上有多条链路到达根桥时,也必须确定出一个唯一的指定端口,该端口也是到根桥最优的,它的作用是向链路内转发BPDU。(可以发现根端口是每台交换机来都要选择出一个最优的,而指定端口是每个交换机上的链路进行选择出来一个最优的)
它的选举规则与根端口选举是一样的
- 选择根路径开销(RPC)最小的端口
- 如果RPC相同,选择对端桥ID最小的端口
- 如果对端桥ID相同,选择对端ID最小的端口
根桥交换机的两个口
- 根桥交换机的RPC都是0,根据选举原则,根桥的所有接口都是指定接口
剩下的接口就只有核心交换机的G0/0/3与办公区三的E0/0/1需要进行选举了
核心的G0/0/3从自己的G0/0/1到达根交换机的RPC是20000
办公区三的E0/0/1从自己的E0/0/4到达根交换机的PRC是200000
所以核心的G0/0/3成为DP
(4)阻塞备用端口(Alternate port,AP)
在所有交换机的根端口和指定端口号确认完毕后,剩下的端口全部阻塞,作为根端口或者指定端口的备份,这个也是打破环路的关键,STP会将该接口逻辑的阻塞掉,阻塞后不会发送任何数据帧,会监听BPDU,当网络链路或者结构发生变化的时候,备用接口会重新选举角色,用于恢复网络的正常通信。(AP这个角色在标准的STP中并没有,只是华为、华三中它的角色命名是以RSTP来的,包括状态)
[bg3]display stp brief
MSTID Port Role STP State Protection
0 Ethernet0/0/1 ALTE DISCARDING NONE
(5)实际测试
实际测试下,可以跟博主一样,把参数、角色可以写上去,这样大家看起来清晰很多。
访问就没问题了,正式因为办公区三的E0/0/1被逻辑阻塞了 不会转发数据包,所以避免了环路的产生。
(1)PC2发起访问,查看ARP表没有关于server的缓存,于是发起ARP请求
(2)办公区1交换机收到以后打上VLAN10的tag,执行二层转发,首先把学习记录PC2的MAC、接口、VLAN信息,发现目的MAC是全F,于是泛洪出去(除源接口以外的VLAN内所有接口),从工E0/0/1、E0/0/4口,接口属于trunk,透传发送。
(3)核心交换机与办公区三都会收到这个ARP请求,同样执行二层转发,先把学习记录PC2的MAC、接口、VLAN信息,发现目的MAC是全F,于是泛洪出去(除源接口以外的VLAN内所有接口),核心会从G0/0/3发出,接入从E0/0/3,E0/0/1发出,其中E0/0/3是access口,剥离标签发送出去,而E0/0/1则是阻塞接口,所以数据会被丢弃,同样从G0/0/3过来的,E0/0/1也不会接收,直接丢弃,这样就避免数据在打环,形成环路。
(6)稳定后的状态
当STP树一切稳定后,只有根桥会定期的发送BDPU来维护维系整个二层网络,这个定期发送也叫做hello,告诉下面的非根桥设备老大还活着,另外是确认某个链路是否有故障发生,非根桥从根端口号收到BPDU后,更新自己的配置BDPU,再从指定端口发送出去。
从上面的图可以看到办公区一作为根桥,自己所有接口处于指定端口,把BPDU发送出去,办公区三以及核心非根桥设备从根端口号收到后,更新自己的配置BPDU,然后在从指定接口发送出去,其中办公区三除了根端口号以外没有指定端口,阻塞端口是不转发BPDU的,另外核心交换机从指定端口G0/0/3发送出来的BPDU,办公区三会进行接收。
端口名称 | 发送BPDU | 接收BPDU | 发送数据 | 接收数据 |
根端口 | 是 | 是 | 是 | 是 |
指定端口 | 是 | 是 | 是 | 是 |
备用端口 | 否 | 是 | 否 | 否 |
另外几个端口在转发数据上面也有区别,根端口与指定端口同时发送、接收BPDU以及收发数据,但是备用端口(阻塞)是不发送BPDU,同时不发送跟接收数据,因为它逻辑被阻断了,如果这个还发送数据,环路就会出现了。
根端口与指定端口其他选举情况
上面的讲解了选举过程,在根端口跟指定端口都是直接通过路径开销就选举出来了,其他规则比较的情况都没遇到过,正好也没讲解华三上面的配置,那么这里我们来看看华三。
(1)准备环境(这个课程有打包,记得下载)
首先先启动,然后都切换成STP模式(华三、华为默认都是运行在MSTP模式)
[H3C]sysname SW1 [SW1]stp mode stp | [H3C]sysname SW2 [SW2]stp mode stp | [H3C]sysname SW3 [SW3]stp mode stp | [H3C]sysname SW4 [SW4]stp mode stp |
华三修改的命令跟华为是一样的
接下来通过display stp 来查看每个的桥ID (华三VLANIF1用的不是桥MAC)
(2)选举根桥
BID最小的称为根桥,这里列出来的来看SW1的最小,所以它是根桥(SW4它是accd,SW1是accc,其余的SW2与SW3虽然是accc开头,但是中间是a开始,而SW1是9)
(3)选举根端口
首先把RPC都列出来,这次都是千兆口,所以除了根桥发出的为0以外,其余的都是20000的开销
回顾选举规则
- 非根桥所有接口中到根交换机Path Cost值最小的链路
- 如果相同则比较,上一跳交换机Bridge-id最小的链路
- 如果相同则比较对端端口优先级最小的链路
SW2根端口选举
- G0/1到达根桥RPC=20000
- G0/0/3到达根桥RPC=20000+20000
- G0/0/2到达根桥RPC=20000+20000+20000
- 最终G0/0/1的Patch cost最小
SW3同样的选举方式
SW4的根端口选举
- G0/0/2与G0/0/4接口到达根端口RPC都是20000+20000,Path Cost都是一样的,比较不出来
- 比较上一跳交换机的BID,SW2的为accc-a66d-0300 ,SW3为accc-a0d9-0200,SW3的相对小,所以G0/0/4成为根端口。
最终根端口选择就是这样。
如果把SW4的G0/0/4线路也接到SW2上面去,这个时候比较上一跳的交换机就不管用了,因为都是从同一台设备来的,BID都一样,接着比端口优先级
最后比较对端端口ID,小的优先,端口ID分为两个部分,优先级默认是128,所以是一样的,然后端口ID是不可改变的,G0/0/2比G0/0/4编号小,自然G0/0/2对接的口成为根端口
<SW2>display stp interface g1/0/2
Port ID : 128.3
-----
<SW2>display stp interface g1/0/4
Port ID : 128.5
通过display stp interface 对应接口查看,其中有一个port ID,优先级128+端口ID
<SW4>display stp br
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/2 ROOT FORWARDING NONE
当然这个只是一个极端的例子,实际环境中很少这样的情况发生,我们在还原之前的拓扑,把SW4的G0/0/4接回SW3。
(4)选举指定端口
根桥、根端口都选举了,剩下的就是指定端口
回顾指定端口的选取,其实与根端口是一样
- 选择根路径开销(RPC)最小的端口
- 如果RPC相同,选择对端桥ID最小的
- 如果对端桥ID相同,选择对端ID最小的端口
SW2、SW3、SW4的指定端口选取
SW2与SW3 的G1/0/3互联,其中从RP到达自己根桥的路径都是20000,RPC相同选取不出来,对比对端桥ID,SW2是accc-a66d-0300,SW3是accc-a0d9-0200,SW3的桥ID最小,所以SW3的G0/0/3为指定端口
SW2与SW4通过G1/0/2互联,其中SW2到根桥的开销20000,SW4到根桥的开销是20000+20000,SW2的G1/0/2小,成为指定端口
SW3到SW4通过G1/0/4互联,SW4的G1/0/4是根端口,那SW3的G1/0/4没必要进行选举,自然是指定端口。
剩下没有角色的接口,自然就成为了备用阻塞接口(AP)
最终的结果跟分析的一样,这里大家做个了解,能够知道整个STP的选举过程就OK了,这个也是STP的核心,入门级别最需要掌握的,上面就是以华为、华三来举例了解的STP的选举过程,下一篇我们需要来来了解下STP的状态以及对RSTP、MSTP的简单了解。