系列文章目录
零、前言
上一篇文章结尾提出疑问,交换机一边想着怎么把数据转发出去同时,二层网络的拓扑(Topology)又刚好是一个环状的该怎么办? 如果另外一端不断收到数据,并重复着转发数据的工作,那此时此刻发来一个目的不存在的数据会发生什么?答案是这个数据在这个环状网络中不断的转圈,直到交换机宕机,从而结束这循环。那有没有办法不成环呢?
确实,只要不成环就行,但想想,假如这一条链路出故障了该怎么办?所以一方面要保证有一条备份的链路,另一方面要保证数据不能在这中间无休止泛洪(无数广播报文在环路传输,从而形成网络风暴),这个时候就要介绍今天的主题——STP协议(Spanning Tree Protocol,生成树协议)。
一、STP有什么作用?
在网络中部署生成树后,交换机之间会进行生成树协议报文的交互并进行无环拓扑计算,最终将网络中的某个(或某些)接口进行阻塞(Block),从而打破环路。
先看看下面这个图蛤,是不是就比较形象展现了上一篇说的“各个部门经理到处广播找人”的情景,一直泛洪,直到交换机承受不了网络风暴后宕机才结束:
这个时候假如在这些交换机中配置了STP(生成树协议)就能防止这种环状拓扑的产生。其实就是将网络拓扑通过阻塞端口,从而实现虽然有两条链路,但只有一条能用,另外一条在主链路出问题之后才替换上去,听上去不仅能实现防止产生环路,同时还备份了一条链路。
这里还要聊的是这个协议的名字——生成树,这是通过阻塞端口形成一个树形结构的网络拓扑,所以可以理解通过阻塞端口来 生成树 状的网络拓扑。将配置完之后的网络拓扑形象化一点,就像下面这个逻辑拓扑一样。
再来张复杂一点的(这里的根端口、指定端口和阻塞端口,咱们接下来会聊到):
二、交换机是怎么实现STP的?
网络中就是各种报文相互传输,所以想实现STP,就得去让交换机去发报文通知其他交换机,发送的报文里规定了一些STP协议中所需要的数据,这样才能让其他交换机知道自己的信息,然后才考虑要不要阻塞端口?阻塞哪个端口?什么时候才切换到备用链路?先来熟悉一些STP协议中的基本概念。
1.STP的基本概念
- 桥ID(Bridge ID,BID):这里的桥指的就是交换机,所以再看看桥ID,其实就是运行STP的交换机的ID,这个ID是唯一的,实际上BID=桥优先级+桥MAC地址,例如:4096.4c1f-abcd-123c。(这里的优先级是4096,MAC地址是4C-1F-AB-CD-12-3C,桥优先级可以自行配置,每个厂商的默认优先级以及优先级的判定方式不一样,这里就不细说了)
- 根桥(Root Bridge):按照上面说的,桥就是交换机,那么根桥是什么?就像树的根(上面的拓扑反过来看,上面是树根,下面是树的分支),一棵树只有一个根,但可以有无数分支,所以根桥就是逻辑上最顶端的那个交换机。
- 开销(Cost):怎么评判哪条链路最适合当树的树枝?这个时候就需要一个衡量标准了,假如一棵树的树枝左边长右边短的话,是不是每个树枝到树根的距离差距就很大呢?所以我们一般希望让这棵“树”长的均匀一些,就会根据一些计算方法来计算每个分支的花销,也就是树枝长度。花销小的链路优先作为“树”的“树枝”。(根路径开销有几种计算方式,一般使用IEEE 802.1t标准,除此之外,还有IEEE 802.1d-1998标准,以及厂商自己的计算方法,这里就不细说,根据情况查询相关计算公式)
- 根路径开销(RPC,Root Path Cost):这个就通俗一些了,就是设备到根桥所累计的总开销,也就是开销之和,叫做根路径开销。
- 接口ID(Port ID):迁移一下桥ID的概念,这里的接口ID也差不多,Port ID=接口优先级+接口编号,例如:128.24。(华为交换机的接口优先级默认为128,其他厂商优先级默认不一样,评判方式也不一样)
- 网桥协议数据单元(BPDU,Bridge Protocol Data Unit):BPDU分为两种:
- 配置BPDU(Configuration BPDU):STP进行拓扑计算时就需要它。
- TCN BPDU(Topology Change Notification BPDU):只有当网络拓扑发生变化时才会需要这个报文。
2.配置BPDU的报文格式
先看看配置BPDU长什么样吧,就长下面这样:
实际抓包(抓取数据包,工具Wireshark),可以看到这样的数据格式(从第4行的BPDU类型可以看出来是配置BPDU):
来看看报文中各个字段的占用字节长度以及分别有什么作用,如下表所示:
字节 | 字段 | 描述 |
---|---|---|
2 | PID | 协议ID ,对于STP而言,该字段的值总为0 |
1 | PVI | 协议版本ID,对于STP而言,该字段的值总为0 |
1 | BPDU Type | 指示本BPDU的类型,若值为0x00,则表示本报文为配置BPDU;若值为0x80,则为TCN BPDU |
1 | Flags | 标志,STP只使用了该字段的最高及最低两个比特位,最低位是TC(Topology Change,拓扑变更)标志,最高位是TCA(Topology Change Acknowledgment,拓扑变更确认)标志 |
8 | Root ID | 根网桥的桥ID |
4 | RPC | 根路径开销,到达根桥的STP Cost |
8 | Bridge ID | BPDU发送桥的ID |
2 | Port ID | BPDU发送网桥的接口ID(优先级+接口号) |
2 | Message Age | 消息寿命,从根网桥发出BPDU之后的秒数,每经过一个网桥都加1,所以它本质上是到达根桥的跳数 |
2 | Max Age | 最大寿命,当一段时间未收到任何BPDU,生存期到达最大寿命时,网桥认为该接口连接的链路发生故障。默认20s |
2 | Hello Time | 根网桥连续发送的BPDU之间的时间间隔,默认2s |
2 | Forward Delay | 转发延迟,在侦听和学习状态所停留的时间间隔,默认15s |
3.配置BPDU的比较原则
这里先说说选举,就是选举一个代表,运行STP的交换机也要选举出一些“代表”,一个是交换机的代表,叫做根桥(Root Bridge)。然后还不够,还得选两个端口代表,一个叫根端口(Root Ports)。如果端口“离根最近”,再指定一个端口与下面的交换机通信,这里我们就叫指定端口(Designated Ports)。当然,既不是根端口,也不是指定端口的端口我们就叫阻塞端口。通俗的来说,在一棵生成树中,根端口就是连接上一级交换机的,指定端口就是连接下一级交换机的,根桥就是最顶端的交换机,它没有上一级,所以它的端口都是连接下一级的指定端口。
先说说选举基本流程:
- 首先选一个根桥
- 非根交换机选一个根端口
- 每条链路选举一个指定端口
- 阻塞非根非指定端口
这里提到三种端口:根端口,指定端口和阻塞端口,用下面这张图来解释一下这三个端口的区别,应该还是挺好理解的。
STP选举看什么?报文里的哪些字段参与了选举?(上面报文表格中加粗的字段就是需要在选举中关注的,可以结合上面的图与表格理解)
- 将最小的根桥ID的交换机作为根桥(也就是树根)
- 再将每个交换机的**最小RPC(根路径开销)**的端口当作根端口
- 然后将最小网桥ID的交换机端口作为指定端口
- 假如交换机的桥ID一样,那就选择最小接口ID的交换机接口作为指定端口
- 最后阻塞那个非根端口、非指定端口的端口,也就是阻塞端口
三、结尾
这篇文章稍微介绍了一下STP中的基本概念,配置BPDU中的报文格式,以及在生成树型拓扑时需要用到的四个字段与三个端口类型,这些之后的学习中会讲到STP的五种状态,以及上文提到的TCN BPDU在网络变动时的作用,这篇文章就介绍到这了,下篇文章咱们再继续深入了解STP。