1、HCIP之RSTP协议与STP相关安全配置
目录
RSTP—快速生成树协议
STP
STP的缺点:
STP的选举(Listening状态中):
RSTP
P/A(提议/同意)机制
同步机制:
边缘端口的配置:
RSTP的端口角色划分:
ensp模拟器BUG:
Topology Change
STP的安全设置:
BPDU保护:
BPDU过滤:
根保护:
TC-BPDU泛洪保护:
RSTP—快速生成树协议
STP
STP的缺点:
收敛慢,从初始状态到完全收敛至少需要经过30S的时间(Listening—learning—forwarding,三个阶段,每个阶段需要15S的时间)
STP的选举(Listening状态中):
BPDU的四个参数:
1、ROOT ID:根桥(ROOT)的桥ID(Bridge ID)
2、COST:到达根桥(ROOT)的开销值,G口默认为2000,越小越优先
3、Bridge ID:优先级+实例编号+MAC地址,其中优先级默认为32768,实例编号默认位0。优先级在设置的时候必须是4096的整数倍且越小越优先
4、Port ID:优先级+端口编号,优先级默认为128
根桥的选举规则:
对比自身和收到的Bridge ID,也就是优先级➕MAC地址
1、先比较优先级,越小越优先;
2、当优先级一样时对比MAC地址,越小越优先;
3、根桥上的端口都是指定端口
根端口(非根交换机)的选举规则:
1、比较到达根桥的开销COST,越小越优先;
2、比较接口对端交换机的BID,越小越优先;
3、比较对端接口的PID,越小越优先;
4、比较本设备上的PID,越小越优先;(少见)
指定端口(非必须)的选举规则:
1、根桥的所有接口都是指定接口;
2、比较接口去往根桥的开销,越小越优先;
3、比较接口对端交换机的BID,越小越优先;
4、比较本端接口的PID,越小越优先;(少见)
堵塞端口(Blocked port):
1、如果不是以上阐述的三者之一,就堵塞该端口,此时环路被消除;
2、如果两交换机的两条或以上的端口互联,则选出一个根端口后剩下都是阻塞端口;
RSTP
P/A(提议/同意)机制
为了加快指定端口和根端口互联链路上的两端口快速进入转发状态(避免30秒的等待)而采取的机制。
P/A协商要求在点对点全双工链路。

P/A机制的过程:
1、当两设备的RSTP功能启动时都认为自己是根桥且会向对方发送一份BPDU,其中的P位值会设置为1(提议),A位也是1(同意)
2、当B收到对方的BPDU后与自己的“四个参数”作对比,如果选举失败就会向A发送一个A位为1的BPDU,且立即将自己端口中选举成功的一方设置为RP(根端口),选举失败的端口设置为AP(阻塞端口)
3、A收到B发送的同意BPDU后会立即将自己的端口都设置为DP(指定端口)
这里假设A的桥ID最大,B次之。
以上过程为秒级切换,但会有环路风险问题,因此需要引入同步机制


同步机制:
在对端设备接受同意前会将其他接口全部阻塞,会造成网络的一个中断但是周期很短,如下:

以上拓扑中各角色的选举过程:
1、设备RSTP功能启动时都认为自己是根桥切会向对方发送一份BPDU,其中的P位值会设置为1(提议),A位也是1(同意)
2、当B收到A发送的BPDU后与自己的“四个参数”作对比,如果选举失败就会向A发送一个A位为1的BPDU,且立即将自己端口中选举成功的一方(G0/0/1)设置为RP(根端口),选举失败的端口(G0/0/2)会暂时阻塞直到A收到同意消息后,才会继续向C发送提议消息
3、当C收到A发送的BPDU后与自己的“四个参数”作对比,如果选举失败就会向A发送一个A位为1的BPDU,且立即将自己端口中选举成功的一方(G0/0/1)设置为RP(根端口),选举失败的端口(G0/0/2)会暂时阻塞直到A收到同意消息后,才会继续向B发送提议消息
4、当A收到了BC的同意后,此时B和C会互相发送提议消息但是各自也都已经同意了A的提议不能在将对方认为是ROOT。此时BC之间的线路不会立即收敛,但并不会影响网络之间正常的通信
这里假设A的桥ID最大,B次之,C最小
以上可以解决拓扑变化后收敛速度慢的问题,但是还会出现一个问题:
如果此时C上连接了一个主机PC,C会向PC发送提议消息但是PC是没有回复功能的,所以会导致连接PC的接口收敛速度为30秒,如下图:

解决方法:
在C连接终端的接口G0/0/24上配置边缘端口,边缘端口会直接进入转发状态而不协商,但是也发送BPDU报文,需要管理员手动配置;
当边缘端口收到BPDU报文的时候就会放弃边缘端口的特性,重新进行生成树的计算。
边缘端口的配置:
全局下(推荐):
stp edged-port default
接口上:
int g0/0/1
stp edged-port enable
还有一种情况:

以上拓扑中各角色的选举过程:
1、A和B互相发送携带提议字段(P=1)的BPDU报文,由于A的桥ID大于B的,所以会忽略B的BPDU并向B发送同意消息且立即将G0/0/1接口设置为DP(指定接口)
2、B在发现A应该是根桥后发送同意消息并立即将自己的G0/0/1接口设置为RP(根接口)同时阻塞G0/0/2接口
3、当B收到A的同意消息后将G0/0/2接口打开向C发送A的提议消息
4、当C收到A的提议消息后向A发送同意消息同时立即将G0/0/2接口设置为RP(根接口)
这里假设A的桥ID最大,B次之,C最小
RSTP的端口角色划分:
STP的三种角色:根端口、指定端口和阻塞端口
RSTP定义了两种心的端口角色:备份端口(Backup Port)和预备端口(Alternate Port),其中备份端口是备份指定端口的,经常用在有集线器的拓扑上;而预备端口也叫替代端口,是用于替代根端口的,当根端口失效时,替代端口秒级替换上
RSTP中端口状态的重新划分:

以上可以分为两种情况:
1、有P/A机制的话端口会直接从Discarding状态到Forwarding状态;
2、如果没有P/A机制就会正常的经过两个周期才能转换到Forwarding状;
ensp模拟器BUG:
无法模拟设备的自动刷新MAC地址表,会导致网络中拓扑结构发生变化时无法及时更新MAC地址表而造成的网络中断,需要手动刷新或者从另一端重新PING一下进行MAC地址表的更新。
真机不会出现这个问题,因为真机会对拓扑的变化而做出相应的处理:Topology Change消息
Topology Change
当交换机发现某个端口发生故障而阻塞后,会将MAC地址表中相应的MAC与端口绑定的表项删除,且会向网络中发送一条TC消息(拓扑变化消息),当其他设备接受到后会触发MAC地址表的更新,会将除了接受TC消息以外的所有端口的MAC地址表项删除(边缘端口除外),完成后会将TC消息发送给下一个设备。

STP的安全设置:
BPDU保护:
当我们要求边缘端口只允许连接主机不能连接交换机时会进行配置BPDU保护(默认情况下边缘端口可以连接交换机,但会放弃边缘端口的特性),当启用BPDU保护的时候,如果边缘端口收到了BPDU消息,则会立即关闭该接口
配置方法:
stp bpdu-protection
BPDU保护的功能依赖于边缘端口的设置,输入以上命令后,所有边缘端口都会自动开启BPDU保护,收到BPDU消息后会关闭接口
注意:如果是边缘端口检测到BPDU后重新进行生成树计算的端口,也会被关闭,应该进入该接口下关闭边缘端口功能
BPDU过滤:
当收到BPDU消息后不会关闭接口,而是丢弃BPDU消息
配置方法:
stp bpdu-filter default
根保护:
当我们在原有的网络拓扑上新接入一台交换机且不希望它成为根桥时会配置根保护(一般在核心交换机或汇聚交换机上)
根保护功能会继续接收BPUD消息,但是不接受会抢占自己根位置的BPDU
注意:不能在根端口(RP)启用!!!
配置方法:
int g0/0/1
stp root-protection
此时,G0/0/1接口的另一端如果接入了优先级更高的交换机,会拒绝接受它的BPDU信息并把接口设置为丢弃状态,就相当于将其隔离在这个网络之外了,只能修改优先级比根桥小才能让其重新加入这个网络
TC-BPDU泛洪保护:
限制拓扑变化消息的发送次数,防止不断地恶意TC-BPDU消息,当TC-BPDU消息在两秒内(默认)的次数达到我们设置的上限时就会拒绝此类BPDU
stp tc-protection threshold
相关文章:
1、HCIP之RSTP协议与STP相关安全配置
目录 RSTP—快速生成树协议 STP STP的缺点: STP的选举(Listening状态中): RSTP P/A(提议/同意)机制 同步机制: 边缘端口的配置: RSTP的端口角色划分: ensp模拟…...
Linux云服务器docker使用教程
诸神缄默不语-个人CSDN博文目录 我用的是腾讯云服务器,操作系统是OpenCloudOS 9,基本上可以当特色版CentOS用。 docker安装跟各个系统关系太大了,我就不写了。OpenCloudOS 9安装docker见这篇博文:腾讯云服务器使用教程 文章目录 …...
如何从android的webview 取得页面上的数据
要从Android的WebView中获取页面上的数据,通常有几种常见的方法: JavaScript Interface:通过JavaScript和Android Interface进行通信。这种方法允许你在JavaScript中调用Android的方法,反之亦然。 Evaluate JavaScriptÿ…...
VTK知识学习(12)- 读取PNG图像
1、代码 private void ShowPngImage(){vtkPNGReader pngReader vtkPNGReader.New();pngReader.SetFileName("D:\\图像\\boxes\\cardboard_boxes_01.png");pngReader.Update();vtkImageActor imageActor vtkImageActor.New();imageActor.SetInputData(pngReader.Get…...
Springboot项目搭建(3)-更改用户信息与文件上传
1.概要 前一章节完成了用户信息的注册、登录、详细信息查询,以及线程池与拦截器技术。 这一章完善了用户信息更新/更改功能,包括昵称、邮箱、头像、密码等... 而后接触到了本地上传和云上传,其二者区别: 选择本地上传还是云上…...
Docker1:认识docker、在Linux中安装docker
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析
目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …...
android 如何获取当前 Activity 的类名和包名
其一:getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…...
Spring Boot 项目 myblog 整理
myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包: Spring Boot W…...
uniapp 城市选择插件
uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…...
测试工程师如何在面试中脱颖而出
目录 1.平时工作中是怎么去测的? 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测? 4.你为什么能够做测试这一行?(根据个人情况分析理解) 5.你认为测试的目的是什么? 6.软件测试的流程ÿ…...
Mesh路由组网
Mesh无线网格网络,多跳(multi-hop)网络,为解决全屋覆盖信号,一般用于家庭网络和小型企业 原理 网关路由器(主路由,连接光猫),Mesh路由器(子路由,…...
LeetCode131:分割回文串
题目链接:131. 分割回文串 - 力扣(LeetCode) 代码如下: class Solution { private:vector<vector<string>> result;vector<string> path; // 放已经回文的子串void backtracking (const string& s, int s…...
详细解析 devmem 命令:在 Linux 系统中直接访问内存的利器
目录 什么是 devmem?为什么需要 devmem?devmem 命令的基本语法devmem 在硬件调试中的应用安全性与风险devmem 的常见应用示例结论 在嵌入式系统开发和硬件调试中,开发者经常需要直接与硬件打交道,访问和修改内存中某些特定区域的内…...
[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时,突然发现它的一个接口,被另一个服务ip频繁的请求。 按理说,之前设置的是,每隔1分钟请求一次接口。但从日志来看,则是1秒钟请求一次ÿ…...
【前端知识】nodejs项目配置package.json深入解读
package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件,它位于项目的根目录下,并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...
XGBOOST算法Python实现(保姆级)
摘要 XGBoost算法(eXtreme Gradient Boosting)在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。 目录 0 绪论 一、材料准备 二、算法原理 三、算法Python实现 3…...
JDK、MAVEN与IDEA的安装与配置
1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境,使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载: MAVEN下载传送…...
输出比较简介
输出比较简介 主要是用来输出PWM波形,这个波形是驱动电机的(智能车和机器人等)必要条件 OC(Output Compare)输出比较,还有IC,全称是Input Capture,意为输入捕获,还有CC…...
什么是反向 DNS 查找以及它的作用是什么?
反向DNS查询(rDNS)是一种技术,用于确定与某个IP地址对应的域名。当我们对一个IP地址进行反向DNS查询时,实际上是向域名系统(DNS)的特殊部分请求信息,这部分被称为PTR记录。PTR记录会返回与这个I…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
