生成树之STP
STP目的
STP:生成树协议,旨在将一个环型网络结构修剪成一个树型的结构,达到防环的作用
STP的步骤
STP有如下几个步骤,选举出四种角色,共同构建起STP生成树
1、开启生成树的交换机,会互相发送BPDU
2、交换完BPDU信息之后,在通过SPA算法,确定这个网络中存在像下图这样的环路,就会开始选举一个交换机为根桥
3、选举出根桥后,会根据哪个端口离根桥最近的基本原则,去选举出根端口(RP)
4、选举出根端口后,在每一条STP链路上,会选举出指定端口(DP)
5、全部的端口都已经基本确定,接下来将没有生成树角色的端口进行阻塞掉即可(Block)
STP中的角色
STP中选举的过程中,诞生出了几种端口角色和交换机角色
交换机角色:根桥ROOT,端口角色:根端口(RP),指定端口(DP)
根桥的产生
先来了解一下根桥的产生,在互相发送BPDU的信息中,存在着每台设备的Bridge ID,也就是桥id
选举根桥的时候,会优先比较桥id,桥id更小的成为根桥
若是桥id一致时,则会比较优先级,优先级越小的成为根桥,同时根桥是可以由我们手动进行配置的,但优先级必须是4096的整数倍
手动修改交换机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值
如下图,通过计算开销得知,当然是①和②端口成为根交换机
当然,我们可以手动地去修改端口接收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报文,哪个端口就是离根交换机最近的端口
当然,前面我们在选举根桥的时候就遇到了桥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
指定端口(DP)的产生
在选举完根桥、根端口后,就会开始指定端口的选举,需要注意的是,与前两者不同,指定端口产生的范围是在每个开启STP的链路上
也就是说每个STP的链路上都会选举出一个指定端口,指定端口最重要是通过比较同一条链路上BPDU
与选举根端口的套路相似,也是越小越优先,比较的顺序也相似,只不过,场景变换成了在链路上的端口,而不是在同一台交换机上的端口
1、先比较链路上发送BPDU端口中的cost值,cost较小的发送端口将成为指定端口(DP)
2、若是cost值一致,则比较发送端口发送BPDU的桥id大小,也是根据越小越优先的原则,桥id较小的成为DP
3、最后,若是桥id一致,则在同一条链路上比较端口上发送BPDU的port id,也就是端口id/端口优先级,port id较小的则成为DP
实际上,因为根端口一旦确定,就代表着指定端口也已经确定下来了。因为根端口和指定端口的选举看的东西都是一样的,如cost值、桥id、端口id
Block端口的产生
Block端口即阻塞端口,这就很简单了,那些除了RP和DP的端口,都是被阻塞的端口
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报文
2、blocking状态:不接收、不转发数据,接收但是不转发BPDU报文(这叫做持续监听BPDU报文),不会对地址进行学习
监听的目的则是时刻保证生成树的能够重新计算
3、listening:不接受、不转发数据,接收并发送BPDU报文,不会对地址进行学习
端口角色的选举
4、learning:不接受、不转发数据,接收并发送BPDU报文,开始对地址进行学习
5、forwarding:开始接收并转发数据,接收并发哦是那个BPDU报文,对地址进行学习
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
非直连故障
非直连故障则需要等待50s的恢复时间,即上述说过的重新计算的30s+等待老化时间20s=50s
非直连故障主要在于理解那个老化时间是什么
老化时间,类似于OSPF中的hello时间,因为网络使一个动态的过程,随时都有可能发生变化
所以交换机就是通过老化时间,经过固定的时间后重新了解网络拓扑发生的什么变化
简单来说,交换机也不能闭门造车,也需要看看外面的世界发生了什么
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状态
为什么Portfast端口还会发送BPDU呢?因为portfast端口需要让其它生成树范围内的端口认为这是一个portfast端口
但如果一不小心,将portfast端口加入到与交换机连接的端口的话,由于portfast不会进行生成树的计算
一旦不进行生成树的计算的话,就会容易出现大问题,即产生环路,因为不做生成树配置的端口就相当于普通的端口一样了
所以当一个portfast端口收到了BPDU报文之后,则经过30s(2个forwarding delay时间)后porttfast端口将会重新到生成树的计算当中,即进入forwarding的状态
配置命令
int g0/1
spanning-tree portfast
STP高级特性之BPDU Guard
BPDU Guard意思为BPDU 保护,BPDU保护是针对那些不应该受到BPDU报文的端口,如(portfast端口)
当配置上BPDU Guard端口之后,如果再次收到了BPDU报文之后,就会立即关闭端口,即非人为的shutdown掉端口
并将端口设置为error-disabled状态,意思就是错误地关闭
如果想将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报文了
需要注意的是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负荷迅速地增高
当我们配置上了TC-protection端口之后,交换机会每隔一个固定的时间段(通常是4s),再去进行MAC地址表的删除操作,同时监控该时间段内是否受到了TC-BPDU报文,如果有,则交换机会在改时间超时之后再进行一次删除的操作
如下,由于黑客PC不断发出了TC-BPDU报文,SW2上又配置了TC-protection端口,则SW2每隔4s才会对MAC地址表进行删除
TC-protection端口的配置命令
在全局下配置
spanning-tree tc-protection
STP的实验结果
查看生成树的结果
show spanning-tree summary
相关文章:

生成树之STP
STP目的 STP:生成树协议,旨在将一个环型网络结构修剪成一个树型的结构,达到防环的作用 STP的步骤 STP有如下几个步骤,选举出四种角色,共同构建起STP生成树 1、开启生成树的交换机,会互相发送BPDU 2、交换…...

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现
一、引言 通过FFmpeg命令可以获取到PS文件/PS流的视频压缩编码格式、色彩格式(像素格式)、分辨率、帧率信息: ./ffmpeg -i XXX.ps 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 (…...

深入解析HDFS:定义、架构、原理、应用场景及常用命令
引言 Hadoop分布式文件系统(HDFS,Hadoop Distributed File System)是Hadoop框架的核心组件之一,它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用命令等…...
Rust:运行调用 Lua 脚本
以下是一个Rust运行Lua脚本的简单例子: 首先,确保你的Rust项目中已经添加了rust-lua库的依赖。可以在Cargo.toml文件中添加以下内容: [dependencies] rust-lua "0.36" # 注意:版本号可能会更新,请根据实…...
PHP语言的数据库编程
PHP语言的数据库编程 引言 随着互联网的发展,各类网站和应用程序如雨后春笋般涌现,数据库作为它们数据存储和管理的核心,扮演着至关重要的角色。PHP作为一种流行的服务器端脚本语言,被广泛应用于Web开发。PHP不仅具有简单易学的…...

Formality:参数化设计的命名规则
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中使用set_top命令设置一个容器的顶层设计(elaborate)时,一个参数化的设计(或者说模块)可能因为其参数覆盖而出现不同…...

xss-labs关卡记录8-14
第八关 还是常规方法,先上传我们常用的试试,onfocus <script> <a hrefjavascript:alert()> 查看源码发现,value这里应该是对我们的<>进行了 处理,然后在href这里,对常用的关键词进行了替换处理&…...

SPSS实现中介效应与调节效应
1. 中介效应 SPSS 实现 本例研究的自变量(X) “工作不被认同”;中介变量(M)为“焦虑”,因变量(Y)为“工作绩效”。探讨焦虑是否在工作不被认同与工作绩效间的作用。 (2&…...
计算机的错误计算(二百零三)
摘要 利用两个大模型化简计算 其中一个大模型是数学解题器,它通过化简得出了正确结果;另外一个大模型给出了 Python代码。 例1. 化简计算摘要中算式。 下面是一个数学解题器大模型给的回答。 以上是数学解题器大模型给的回答。 下面是与另外一个大模型…...
【计算机网络】什么是AC和AP?
在现代的无线网络中,AC(Access Controller,接入控制器)和AP(Access Point,无线接入点)是两个至关重要的设备,它们在网络的管理、连接和优化中扮演着重要角色。理解它们的功能和区别&…...

python3中函数的参数
一. 简介 前面学习了Python3中函数的语法规则,文章如下: python3中函数的语法规则-CSDN博客 本文继续学习python中函数的参数。调用函数时可使用的正式参数类型: 必需参数,关键字参数,默认参数,不定长参…...

数据仓库建设方案和经验总结
在做数据集成的过程中,往往第二步的需求就是建设数仓由于数据分散在不同的存储环境或数据库中,对于新业务需求的开发需要人工先从不同的数据库中同步、集中、合并等处理,造成资源和人力的浪费。同时,目前的系统架构,无…...

Re77 读论文:LoRA: Low-Rank Adaptation of Large Language Models
诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:LoRA: Low-Rank Adaptation of Large Language Models ArXiv网址:https://arxiv.org/abs/2106.09685 官方GitHub网站(包含在RoBERTa、DeBERTa、GPT-2上用Lora微调…...

曲波系数 curvelet transform
Curvelet 变换后的系数涵义 曲波变换(Curvelet Transform)是一种多尺度、多方向的变换工具,能够有效地表示信号中的几何特征(如边缘、曲线等)。曲波变换后的系数具有明确的物理意义,反映了信号在不同尺度、…...
OS的随机数生成过程中的内核熵池
内核熵池(Kernel Entropy Pool)是操作系统内核中用于收集和管理熵(随机性来源)的机制 ,在操作系统的随机数生成过程中发挥关键作用。 以下从其原理、作用、工作方式方面详细介绍: 原理:熵在信…...
数据结构:双向循环链表
双向循环链表(Doubly Circular Linked List) 双向循环链表是双向链表的一种变体,其特点是链表的头节点和尾节点相连,形成一个闭环。这种结构允许在链表中进行无缝的双向遍历,并且由于循环特性,可以从任何节…...
IP网和传输网区别(以访问百度为例!)
1. IP网和传输网的关系 IP网:是基于IP协议的网络,负责数据的逻辑传输,包括数据包的路由、寻址和转发。IP网是“虚拟”的,它依赖于底层的传输网来实际传递数据。 传输网:是物理网络基础设施,负责数据的物理…...

STM32裸机开发转FreeRTOS教程
目录 1. 简介2. RTOS设置(1)分配内存(2)查看任务剩余空间(3)使用osDelay 3. 队列的使用(1)创建队列(1)直接传值和指针传值(2)发送/接收…...
FreeSWITCH dialplan/default.xml 之释疑
准备花时间好好研究下,一直都是一知半解 sip_looped_call 通俗地说,就是自己呼叫自己 查文档,是这样讲的:如果调用已通过 ACL 以外的方式进行身份验证,并且当前请求 IP/port 与配置文件 IP/port 匹配,那…...

lambda用法及其原理
目录 lambda形式lambda用法1.sort降序2.swap3.捕捉列表 习题解题 lambda形式 [capture-list](parameters)->return type{function boby}[capture-list]:[捕捉列表]用于捕捉函数外的参数,可以为空,但不能省略;(parameters) &am…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...