没别的,就聊聊STP协议(一)

举报
zhoulive 发表于 2021/06/09 07:53:53 2021/06/09
【摘要】 交换机一边想着怎么把数据丢出去,但假如二层网络的拓扑(Topology)是一个环状的呢?那么另外一端不断收到数据,并重复着丢数据的工作,那此时此刻发来一个目的不存在的数据会发生什么?

零、前言

上一篇文章结尾聊到,交换机一边想着怎么把数据丢出去,但假如二层网络的拓扑(Topology)是一个环状的呢?那么另外一端不断收到数据,并重复着丢数据的工作,那此时此刻发来一个目的不存在的数据会发生什么?答案是这个数据在这个环状网络中不断的转圈,直到交换机死机,从而结束这无尽的循环。

那这时候有人问了:那不成环不就行了吗?

是啊,但想想,假如这一条链路出故障了呢?比如这根线被某个人不小心剪断了?被老鼠咬断了?又或者这个交换机用太久了,质量还一般,刚好松动,从而接口断掉了?总不能让公司业务暂停,然后慢悠悠的排查吧。。。所以一方面要保证有一条备份的链路,另一方面要保证数据不能在这中间转圈(无数广播报文在环路传输,从而形成网络风暴),这个时候就要聊聊咱们今天的话题了——STP协议(Spanning Tree Protocol,生成树协议)


一、STP有什么作用?

在网络中部署生成树后,交换机之间会进行生成树协议报文的交互并进行无环拓扑计算,最终将网络中的某个(或某些)接口进行阻塞(Block),从而打破环路。

先看看下面这个图蛤,是不是就比较形象展现了上一篇说的“各个部门经理到处广播找人”的情景:

环路

这个时候假如在这些交换机中配置了STP(生成树协议)就能防止这种环状拓扑的产生。其实就是将网络拓扑通过阻塞某个端口,从而实现虽然有两条链路,但只有一条能用,另外一条在主链路出问题之后才替换上去,听上去的确就能实现防止环路产生。

这里还要聊的是这个协议的名字——生成树,哪里有树?网络里长树了?其实是通过阻塞端口形成一个树形结构的网络拓扑,所以可以理解通过阻塞端口来 生成树 状的网络拓扑。将配置完之后的网络拓扑形象化一点,就像下面这个逻辑拓扑一样。

形成树型(一)

再来张复杂一点的(这里的根端口、指定端口和阻塞端口,咱们接下来会聊到):
形成树型(二)

二、交换机是怎么实现STP的?

咱们知道,网络中就是各种报文传来传去,所以想实现STP,就得去让交换机去发报文,报文里规定了一些STP协议中所需要的数据,这样才能让其他交换机知道自己的信息,然后才考虑要不要阻塞端口?阻塞哪个端口?什么时候才切换到备用链路?不急,咱们慢慢聊,先熟悉熟悉一些STP协议中的基本概念吧。

1.STP的基本概念

  1. 桥ID(Bridge ID,BID):这里的桥指的就是交换机,所以再看看桥ID,其实就是运行STP的交换机的ID,这个ID是唯一的,实际上BID=桥优先级+桥MAC地址,例如:4096.4c1f-abcd-123c。(桥优先级可以自己配置,每个厂商的默认优先级以及优先级的判定方式不一样,这里就不细说了)
  2. 根桥(Root Bridge):按照上面说的,桥就是交换机,那么根桥是什么?就像树的根(上面的拓扑反过来看,上面是树根,下面是树的分支),一棵树只有一个根,但可以有无数分支,所以根桥就是逻辑上最顶端的那个交换机。
  3. 开销(Cost):怎么评判哪条链路最适合当树的树枝?这个时候就需要一个衡量标准了,假如一棵树的树枝左边长右边短的话,是不是每个树枝到树根的距离差距就很大呢?所以我们一般希望让这棵“树”长的均匀一些,就会根据一些计算方法来计算每个分支的花销,也就是树枝长度。花销小的链路优先作为“树”的“树枝”。(根路径开销有几种计算方式,一般使用IEEE 802.1t标准,除此之外,还有IEEE 802.1d-1998标准,以及厂商自己的计算方法,这里就不细说,根据情况查询相关计算公式)
  4. 根路径开销(RPC,Root Path Cost):这个就通俗一些了,就是设备到根桥所累加的总开销,也就是开销之和,叫做根路径开销。
  5. 接口ID(Port ID):知识迁移一下,什么是桥ID,这里的接口ID也差不多,Port ID=接口优先级+接口编号,例如:128.24。(华为交换机的接口优先级默认为128,其他厂商优先级默认不一样,评判方式也不一样)
  6. 网桥协议数据单元(BPDU,Bridge Protocol Data Unit):BPDU分为两种:
    • 配置BPDU(Configuration BPDU):STP进行拓扑计算时就需要它。
    • TCN BPDU(Topology Change Notification BPDU):只有当网络拓扑发生变化时才会需要这个报文。

2.配置BPDU的报文格式

先看看配置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)。当然,既不是根端口,也不是指定端口的端口我们就叫阻塞端口。通俗的来说,在一棵生成树中,根端口就是连接上一级交换机的,指定端口就是连接下一级交换机的,根桥就是最顶端的交换机,它没有上一级,所以它的端口都是连接下一级的指定端口。

先说说选举基本流程:

  1. 首先选一个根桥
  2. 非根交换机选一个根端口
  3. 每条链路选举一个指定端口
  4. 阻塞非根非指定端口

这里提到三种端口:根端口指定端口阻塞端口,用下面这张图来解释一下这三个端口的区别,应该还是挺好理解的。

STP端口类型

那选举看什么呢?报文里的哪些字段参与了选举呢?(上面报文表格中加粗的字段就是需要在选举中关注的,可以结合上面的图与表格理解)

  1. 将最小的根桥ID的交换机作为根桥(也就是树根)
  2. 再将每个交换机的最小RPC(根路径开销)的端口当作根端口
  3. 然后将最小网桥ID的交换机端口作为指定端口
  4. 假如交换机的桥ID一样,那就选择最小接口ID的交换机接口作为指定端口
  5. 最后阻塞那个非根端口、非指定端口的端口,也就是阻塞端口

三、结尾

这篇文章简单聊了一下STP中的基本概念,配置BPDU中的报文格式,以及在生成树型拓扑时需要用到的四个字段与三个端口类型,这些之后的学习中会讲到STP的五种状态,以及上文提到的TCN BPDU在网络变动时的作用,这篇文章就聊到这了,下篇文章咱们再继续深入了解STP,没别的,就聊聊而已。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。