当前位置: 首页 > news >正文

生成树之STP

STP目的

STP:生成树协议,旨在将一个环型网络结构修剪成一个树型的结构,达到防环的作用

image-20250104221829107

STP的步骤

STP有如下几个步骤,选举出四种角色,共同构建起STP生成树

1、开启生成树的交换机,会互相发送BPDU

image-20250105125101511

2、交换完BPDU信息之后,在通过SPA算法,确定这个网络中存在像下图这样的环路,就会开始选举一个交换机为根桥

image-20250105125558059

3、选举出根桥后,会根据哪个端口离根桥最近的基本原则,去选举出根端口(RP)

image-20250105125738844

4、选举出根端口后,在每一条STP链路上,会选举出指定端口(DP)

image-20250105125904774

5、全部的端口都已经基本确定,接下来将没有生成树角色的端口进行阻塞掉即可(Block)

image-20250105130108348

STP中的角色

STP中选举的过程中,诞生出了几种端口角色和交换机角色

交换机角色:根桥ROOT,端口角色:根端口(RP),指定端口(DP)

根桥的产生

先来了解一下根桥的产生,在互相发送BPDU的信息中,存在着每台设备的Bridge ID,也就是桥id

选举根桥的时候,会优先比较桥id,桥id更小的成为根桥

image-20250105130932389

若是桥id一致时,则会比较优先级,优先级越小的成为根桥,同时根桥是可以由我们手动进行配置的,但优先级必须是4096的整数倍

image-20250105131323896

手动修改交换机STP优先级命令如下

spanning-tree mode stp			//开启生成树,并配置其模式为stp
spanning-tree priorit ?			//查看优先级范围,结果显示只能为4096的整数倍<0-61440> Bridge priority in increments of 4096 (default value: 32768)
spanning-tree priorit 4096		//配置优先级为4096

如果再不济,优先级相同的话,可以比较MAC地址,MAC地址更小的则成为根桥

MAC地址可以通过show sysmac查看

根端口(RP)的产生

在表面上来看,根端口的产生是根据在非根交换机上哪个端口离根交换机最近的

实际上,这句话的信息量很大,1、根端口是产生于非根交换机上,而不会产生根交换机上

2、离根交换机最近,就需要看几个方面,①收到BPDU的cost值,即该端口去往根交换机所产生的开销,当然,开销越小,大多数离的越近

注意,这里不是普通的cost值,而是端口接收BPDU的cost值

如下图,通过计算开销得知,当然是①和②端口成为根交换机

image-20250105132240810

当然,我们可以手动地去修改端口接收BPDU的cost值

int g0/1		//进入端口
spanning-tree cost ?		//查看g0/1接收BPDU的cost值的范围	<1-200000000> Port path cost

如果将接收BPDU的cost值改为一致,就需要比较在收到BPDU报文中桥id值,根据越小越优先的原则,桥id值最小的BPDU的接收端口将成为根端口(RP),其实某种意义上,这样的方式,也是变相地决定了桥id值最小的是离根交换机最近的端口,因为本身根桥的桥id就是最小的,所以哪个端口最先收到这个BPDU报文,哪个端口就是离根交换机最近的端口

image-20250105133921384

当然,前面我们在选举根桥的时候就遇到了桥id一致的情况,这时就要看我们BPDU的端口id了,即端口优先级,依然是越小越优先的原则,哪个端口的端口id越小,则哪个端口就将成为根端口(RP)。同样地,端口id/端口优先级的数值也是可以进行配置的,但需要注意的是端口id只能是16的整数倍

int g0/1		//进入g0/1端口,更改BPDU端口id
spanning-tree port-priority ?		//查看端口id可配置范围<0-240> Port priority in increments of 16 (default value: 128)		//范围为0-240,且为16的整数倍,默认值为128

image-20250105134741929

指定端口(DP)的产生

在选举完根桥、根端口后,就会开始指定端口的选举,需要注意的是,与前两者不同,指定端口产生的范围是在每个开启STP的链路上

也就是说每个STP的链路上都会选举出一个指定端口,指定端口最重要是通过比较同一条链路上BPDU

与选举根端口的套路相似,也是越小越优先,比较的顺序也相似,只不过,场景变换成了在链路上的端口,而不是在同一台交换机上的端口

1、先比较链路上发送BPDU端口中的cost值,cost较小的发送端口将成为指定端口(DP)

image-20250105140321134

2、若是cost值一致,则比较发送端口发送BPDU的桥id大小,也是根据越小越优先的原则,桥id较小的成为DP

image-20250105140544480

3、最后,若是桥id一致,则在同一条链路上比较端口上发送BPDU的port id,也就是端口id/端口优先级,port id较小的则成为DP

实际上,因为根端口一旦确定,就代表着指定端口也已经确定下来了。因为根端口和指定端口的选举看的东西都是一样的,如cost值、桥id、端口id

Block端口的产生

Block端口即阻塞端口,这就很简单了,那些除了RP和DP的端口,都是被阻塞的端口

image-20250105130108348

RP、DP的作用

前面说了RP、DP是怎么产生的,但是还没有讲它们的作用是怎么样的

RP:是用来接收BPDU报文的

DP:是用来发送BPDU报文的

没错,就是这么的简单!!!

生成树的几个状态

从交换机通过spanning-tree命令开启生成树,到生成树建立完成,或是故障恢复时,交换机一共经历了4个阶段

1、blocking,阻塞阶段。2、listening,监听阶段。3、learning,学习阶段。4、forwarding,转发阶段,这也是表示创建成功的最后一个阶段

其中当出现某条线路故障的时候,生成树因为原本起到了一个阻塞端口的作用,就表示哪个阻塞的端口可以成为备份端口,当网络出现故障的时候,还有备份端口顶上去

其中恢复故障也是需要一定的时间的,从监听到学习MAC地址就要花费30s的时间,而由学习MAC地址表完成则又需要15s的时间

还有一种端口状态为disable,可以理解为STP中最懒的一个端口状态

这五种端口状态除了在不同时期体现出来,还体现在BPDU报文的处理

1、disable状态:不接受、不发送和不监听BPDU报文

image-20250105163557733

2、blocking状态:不接收、不转发数据,接收但是不转发BPDU报文(这叫做持续监听BPDU报文),不会对地址进行学习

监听的目的则是时刻保证生成树的能够重新计算

image-20250105163625344

3、listening:不接受、不转发数据,接收并发送BPDU报文,不会对地址进行学习

端口角色的选举

image-20250105163657836

4、learning:不接受、不转发数据,接收并发送BPDU报文,开始对地址进行学习

image-20250105163708567

5、forwarding:开始接收并转发数据,接收并发哦是那个BPDU报文,对地址进行学习

image-20250105163737491

STP原理

上述说的一切一切都是基于STP所用的算法,即SPA算法

开启STP之后,SPA算法会判断在网络中是否有环路,只有产生了环路,才会进行后续的工作

判断有环路之后,SPA就会使得交换机发送BPDU报文,使得BPDU报文在交换机之间进行交换

各个交换机根据收到的BPDU报文,依据BPDU报文中的各类信息(如桥id,cost值和端口id)进行各类端口角色的选举

SPA和BPDU

BPDU就是由SPA算法进行发送的

上述进行说到BPDU中的桥id、cost值和端口id,实际上,桥id、cost值和端口id就是BPDU报文中包含的信息

桥id:桥id是由MAC地址+交换机开启STP的优先级组成

cost:根路径开销,就是交换机到达根交换机的开销值。这个开销值是依赖于带宽的,带宽越大,开销值就越低

端口id:端口id由端口的优先级和端口的编号所组成

恢复故障时间以及场景

当网络出现故障或是网络拓扑出现变化的时候,生成树才会进行重新的收敛

重新收敛可以理解为交换机重新进行生成树的计算

所以重新收敛的时间=开启生成树接口的时间+接口进入转发状态的时间

而这个重新收敛的时间取决不同的场景,但可以肯定的是至少需要30s的时间,前15s用来从listening状态到learning状态。这个前15s是用来进行各个端口角色的重新选举了,后15s就是从learning状态到forwarding状态,这个后15s使用来学习MAC地址表的

而故障的类型主要分为直连故障和非直连故障

直连故障需要30s的时间来恢复,如下图,这30s就是前面经常提到的listening---->learning的15s+learning ----->forwarding的15s=30s

image-20250105153512044

非直连故障

非直连故障则需要等待50s的恢复时间,即上述说过的重新计算的30s+等待老化时间20s=50s

非直连故障主要在于理解那个老化时间是什么

老化时间,类似于OSPF中的hello时间,因为网络使一个动态的过程,随时都有可能发生变化

所以交换机就是通过老化时间,经过固定的时间后重新了解网络拓扑发生的什么变化

简单来说,交换机也不能闭门造车,也需要看看外面的世界发生了什么

image-20250105154615557

STP配置

STP的配置非常简单,只需要开启生成树,配置优先级即可

SW1(config)#spanning-tree 
SW1(config)#spanning-tree mode stp			//默认开启的是MSTP
SW1(config)#spanning-treen port-priority ?		//查看优先级的配置范围
<0-240> Port priority in increments of 16 (default value: 128)

STP高级特性之postfast端口

postfast端口最主要是针对在生成树当中,交换机与PC相连的接口

由于与PC相连的接口是没有必要列入到生成树的计算当中的,否则将会产生不必要的时间进行运算

还有最重要的一点是,若是下连PC的端口没有配置的portfast端口的话,则会导致下连PC的端口也参与到生成树的计算当中,由于SPA的计算至少需要30s时间,所以会导致用户的上网体验及其不佳

配置的portfast端口之后,则会直接跳过那SPA计算的30s,即直接进入forwarding状态

image-20250106185014993

为什么Portfast端口还会发送BPDU呢?因为portfast端口需要让其它生成树范围内的端口认为这是一个portfast端口

但如果一不小心,将portfast端口加入到与交换机连接的端口的话,由于portfast不会进行生成树的计算

一旦不进行生成树的计算的话,就会容易出现大问题,即产生环路,因为不做生成树配置的端口就相当于普通的端口一样了

所以当一个portfast端口收到了BPDU报文之后,则经过30s(2个forwarding delay时间)后porttfast端口将会重新到生成树的计算当中,即进入forwarding的状态

image-20250106193613146

配置命令

int g0/1
spanning-tree portfast

STP高级特性之BPDU Guard

BPDU Guard意思为BPDU 保护,BPDU保护是针对那些不应该受到BPDU报文的端口,如(portfast端口)

当配置上BPDU Guard端口之后,如果再次收到了BPDU报文之后,就会立即关闭端口,即非人为的shutdown掉端口

并将端口设置为error-disabled状态,意思就是错误地关闭

image-20250106200218325

如果想将error-disabled端口重新开启之后的话,有两种方式,手动和自动

1、手动开启端口,进入端口之后敲no shutdown

2、全局下配置命令

errdisabled recovery interval 300s		//将error-disabled的端口经过30s之后重新开启

BPDU Guard端口的配置

1、可以选择全局下配置

spanning-tree portfast bpduguard default

2、在接口下启用BPDU Guard

int g0/1
spanning-tree bpduguard enabled

STP高级特性之BPDU Filter

BPDU Filter最主要的功能是过滤掉接口上收到或发出的BPDU报文

如果将BPDU Filter与portfast端口相互结合,原本还发送BPDU的portfast报文的端口,现在变为即不接收BPDU报文也不发送BPDU报文了

image-20250106200809003

需要注意的是portfast+BPDU Filter的组合,当portfast失效了之后,则BPDU Filter也就失效了

因为portfast端口失效后,就表示开始发送BPD报文了,由于BPDU Filter的作用是过滤收到或发出的BPDU报文,那中不能对自己的BPDU报文进行过滤吧

BPDU Filter端口的配置命令

全局模式下配置

spanning-tree portfast bpdufilter default

接口下配置

int g0/1
spanning-tree bpdufilter enabled

STP高级特性之TC-protection

TC-protection即为TC-BPDU的保护

我们首先需要了解TC-BPDU这种包,TC-BPDU就是一个携带者TC标志的BPDU报文

当交换机收到TC-BPDU报文之后,则表示网络拓扑发生了变化,交换机会进行对MAC地址表项的删除动作,对于三层交换机,还会引发转模块的重新打通,并改变ARP表项的端口状态

知道了TC-BPUD后,就需要了解TC-BPDU报文带来的隐患,若是这个时候,有一台黑客PC机,对SW2不断的发出TC-BPDU报文,则SW2会将不断地重复删除MAC地址表项和引发转模块的重新打通,并改变ARP表项的端口状态的动作,这会使得SW2的CPU负荷迅速地增高

image-20250106202018840

当我们配置上了TC-protection端口之后,交换机会每隔一个固定的时间段(通常是4s),再去进行MAC地址表的删除操作,同时监控该时间段内是否受到了TC-BPDU报文,如果有,则交换机会在改时间超时之后再进行一次删除的操作

如下,由于黑客PC不断发出了TC-BPDU报文,SW2上又配置了TC-protection端口,则SW2每隔4s才会对MAC地址表进行删除

image-20250106202301466

TC-protection端口的配置命令

在全局下配置

spanning-tree tc-protection

STP的实验结果

查看生成树的结果

show spanning-tree summary

image-20250106204744709

http://www.lryc.cn/news/516519.html

相关文章:

  • 音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现
  • 深入解析HDFS:定义、架构、原理、应用场景及常用命令
  • Rust:运行调用 Lua 脚本
  • PHP语言的数据库编程
  • Formality:参数化设计的命名规则
  • xss-labs关卡记录8-14
  • SPSS实现中介效应与调节效应
  • 计算机的错误计算(二百零三)
  • 【计算机网络】什么是AC和AP?
  • python3中函数的参数
  • 数据仓库建设方案和经验总结
  • Re77 读论文:LoRA: Low-Rank Adaptation of Large Language Models
  • 曲波系数 curvelet transform
  • OS的随机数生成过程中的内核熵池
  • 数据结构:双向循环链表
  • IP网和传输网区别(以访问百度为例!)
  • STM32裸机开发转FreeRTOS教程
  • FreeSWITCH dialplan/default.xml 之释疑
  • lambda用法及其原理
  • Go Ebiten随机迷宫生成示例
  • 前端学习DAY31(子元素溢出父元素)
  • 『SQLite』表的创建、修改和删除
  • 可持久化数据结构-线段树(主席树)
  • 如何利用PHP爬虫按关键字搜索淘宝商品
  • GitHub - riscv-software-src/riscv-isa-sim: Spike, a RISC-V ISA Simulator
  • ubuntu开机启动服务
  • 电子电气架构 --- 设计车载充电机的关键考虑因素
  • 2025_0105_生活记录
  • 电池管理系统(BMS)架构详细解析:原理与器件选型指南
  • 用JAVA编写一个简单的小游戏