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

STP(生成树协议)

STP的基本概念

概述

  • STP是一个用于局域网中消除环路的协议。
  • 运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。
  • STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动响应,从而使得网络状态适应新的拓扑结构,保证网络可靠性
  • 由于局域网规模的不断增长,生成树协议已经成为了当前最重要的局域网协议之一。

桥ID

  • STP中,每一台交换机都有一个标示符,叫做Bridge ID或者IDID16位的桥优先级(Bridge Priority)和48位的MAC地址构成。在STP网络中,桥优先级是可以配置的,取值范围是065535,默认值为32768,可以修改但是修改值必须为4096的倍数。优先级最高的设备(数值越小越优先)会被选举为根桥。如果优先级相同,则会比较MAC地址,MAC地址越小则越优先。
  • 如图,需要在该网络中选举根桥,首先比较三台交换机的桥优先级,桥优先级都为4096,再比较三台交换机的MAC地址,谁小谁优先,最终选择SW1为根桥。

根桥

  • STP的主要作用之一是在整个交换网络中计算出一棵无环的“树”(STP)。
  • 根桥是一个STP交换网络中的“树根”。
  • STP开始工作后,会在交换网络中选举一个根桥,根桥是生成树进行拓扑计算的重要“参考点”,是STP计算得出的无环拓扑的“树根”。
  • STP网络中,桥ID最小的设备会被选举为根桥
  • BID的比较过程中,首先比较桥优先级,优先级的值越小,则越优先,拥有最小优先级值的交换机会成为根桥;如果优先级相等,那么再比较MAC地址,拥有最小MAC地址的交换机会成为根桥。

Cost

  • 交换机的每个端口都有一个端口开销(Port Cost)参数,此参数表示该端口在STP中的开销值。默认情况下端口的开销和端口的带宽有关,带宽越高,开销越小
  • 华为交换机支持多种STP的路径开销计算标准,提供多厂商场景下最大程度的兼容性。缺省情况下,华为交换机使用IEEE 802.1t标准来计算路径开销。
  • 用户也可以根据需要通过命令调整接口的Cost

RPC(根路径开销)

  • STP的拓扑计算过程中,一个非常重要的环节就是“丈量”交换机某个接口到根桥的“成本”,也即RPC
  • 一台设备从某个接口到达根桥的RPC等于从根桥到该设备沿途所有入方向接口的Cost累加
  • 在本例中,SW3GE0/0/1接口到达根桥的RPC等于接口1Cost加上接口2Cost

Port ID

运行STP交换机的每个端口都有一个端口ID端口ID由高4 bit端口优先级和低12 bit端口号构成。端口优先级取值范围是0到240,步长为16,即取值必须为16的整数倍。缺省情况下,端口优先级是128。端口ID可以用来确定端口角色。

BPDU

  • 为了计算生成树,交换机之间需要交换相关的信息和参数,这些信息和参数被封装在BPDU中。
  • BPDU有两种类型:配置BPDUTCN BPDU
  • 配置BPDU包含了桥ID、路径开销和端口ID等参数。STP协议通过在交换机之间传递配置BPDU来选举根交换机,以及确定每个交换机端口的角色和状态在初始化过程中,每个桥都主动发送配置BPDU。在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他交换机在收到上游传来的配置BPDU后,才会发送自己的配置BPDU
  • TCN BPDU是指下游交换机感知到拓扑发生变化时向上游发送的拓扑变化通知。

配置BPDU报文格式

配置BPDU比较原则

STP的计算过程

STP 中定义了三种端口角色:指定端口,根端口和预备端口。
  • 指定端口是交换机向所连网段转发配置BPDU的端口,每个网段有且只能有一个指定端口。一般情况下,根桥的每个端口总是指定端口。
  • 根端口是非根交换机去往根桥路径最优的端口。在一个运行STP协议的交换机上最多只有一个根端口,但根桥上没有根端口。
  • 如果一个端口既不是指定端口也不是根端口,则此端口为预备端口。预备端口将被阻塞。

选举根桥

  • STP在交换网络中开始工作后,每个交换机都会向网络中发送BPDU。配置BPDU中包含交换机自己的桥ID
  • 网络中拥有最小桥ID的交换机成为根桥。
  • 在一个连续的STP交换网络中只会存在一个根桥。
  • 桥的角色是可抢占的。
  • 为了确保交换网络的稳定,建议提前规划STP组网,并将规划为根桥的交换机的桥优先级设置为最小值0

选举根端口

  • 每一台非根桥交换机都会在自己的接口中选举出一个根接口。
  • 非根桥交换机上有且只会有一个根接口。
  • 当非根桥交换机有多个接口接入网络中时,根接口是其收到最优配置BPDU的接口。
  • 可以形象地理解为,根接口是每台非根桥上“朝向”根桥的接口。

根端口选举规则:

  1. 选择RPC(根路径开销)最低的端口。
  2. 若有多个端口的RPC相等,选择对端桥ID最低的端口。
  3. 若有多个端口的对端桥ID相等,选择对端端口ID最低的端口。
  4. 若有多个端口的对端端口相等,选择本端端口ID最低的端口。

选举指定端口

网络中的每个链路与根桥之间的工作路径必须是唯一的且最优的。当一个链路有两条及以上的路径通往根桥时(该链路连接了不同的交换机,或者该链路连接了同一台交换机的不同端口),与该链路相连的交换机(可能不止一台)就必须确定出一个唯一的指定端口。因此,每个链路(Link)选举一个指定端口,用于向这个链路发送BPDU,一般情况下,根桥的所有接口都是指定接口。

指定端口的选举规则:

  1. 选择RPC(根路径开销)最低的端口。
  2. 若有多个端口的RPC相等,选择桥ID最低的端口。
  3. 若有多个端口的桥ID相等,选择端口ID最低的端口。

堵塞预备端口

  • 一台交换机上,既不是根接口,又不是指定接口的接口被称为预备接口。
  • STP操作的最后一步是阻塞网络中的预备接口。这一步完成后,网络中的二层环路就此消除。

STP端口状态机

1.禁用(Disable)   :不收发BPDU、不学习MAC地址、不转发业务数据。

2.阻塞(Blocking)  :收BPDU、不发BPDU、不学习MAC地址、不转发业务数据。

3.侦听(Listening) :收发BPDU、不学习MAC地址、不转发业务数据。

                        就是进行端口角色的选举,需要等待一个转发延迟的时间(15s)

4.学习(Learning)  :收发BPDU、学习MAC地址、不转发业务数据。

                        就是防止大量未知单播数据帧的泛洪,需要等待一个转发延迟的时间(15s)

5.转发(Forwarding):收发BPDU、学习MAC地址、转发业务数据。

STP拓扑变化

根桥故障

根桥故障:
在稳定的 STP 网络,非根桥会定期收到来自根桥的 BPDU 报文。
如果根桥发生了故障,停止发送 BPDU ,下游交换机就无法收到来自根桥的 BPDU 报文。
如果下游交换机一直收不到 BPDU 报文, Max Age 计时器(缺省 : 20s )就会超时,从而导致已经收到的 BPDU 报文失效,此时,非根桥会互相发送配置 BPDU ,重新选举新的根桥。
端口状态:
SW3 的预备端口, 20s 后会从 Blocking 状态进入到 Listening 状态,再进入 Learning 状态,最终进入到 Forwarding 状态,进行用户流量的转发。
收敛时间:
根桥故障会导致50s左右的恢复时间 ,等于 Max Age 加上 2 倍的 Forward Delay 收敛时间。

直连链路故障

直连链路故障:
当两台交换机间用两条链路互连时,其中一条是主用链路,另一条为备用链路。
当网络稳定时,交换机 SW2 检测到根端口的链路发生故障,则其备用端口会进入用户流量转发状态。
端口状态:
备用端口会从 Blocking 状态,迁移到 Listening-Learning-Forwarding 状态。
收敛时间:
直连链路故障,备用端口会经过30s后恢复转发状态

非直连链路故障

非直连故障
在稳定的 STP 网络,非根桥会定期收到来自根桥的 BPDU 报文。
SW1 SW2 之间的链路发生了某种故障(非物理故障),因此 SW2 一直收不到来自根桥 SW1 BPDU 报文, Max Age 计时器(缺省 : 20 s )就会超时,从而导致已经收到的 BPDU 报文失效。
此时,非根桥 SW2 会认为根桥失效,并且认为自己是根桥,从而发送自己的配置 BPDU SW3 ,通知 SW3 自己是新的根桥。
在此期间, SW3 预备 端口一直收不到包含根桥 ID BPDU Max Age 计时器超时后,端口进入到 Listening 状态,开始向 SW2 “转发”从上游发来的包含根桥 ID BPDU
因此, Max Age 定时器超时后, SW2 SW3 几乎同时收到对方发来的 BPDU ,再进行 STP 重新计算, SW2 发现 SW3 发来的 BPDU 更优,就放弃宣称自己是根桥并重新确定端口角色。
端口状态:
SW3 预备 端口 20s 后会从 Blocking 状态进入到 Listening 状态,再进入 Learning 状态,最终进入到 Forwarding 状态,进行用户流量的转发。
收敛时间:

非直连故障会导致50s左右的恢复时间,等于Max Age加上2倍的Forward Delay收敛时间。

拓扑改变导致MAC地址表错误

在交换网络中,交换机依赖 MAC 地址表转发数据帧。缺省情况下, MAC 地址表项的老化时间是 300 秒。如果生成树拓扑发生变化,交换机转发数据的路径也会随着发生改变,此时 MAC 地址表中未及时老化掉的表项会导致数据转发错误,因此在拓扑发生变化后需要及时更新 MAC 地址表项
本例中, SW2 中的 MAC 地址表项定义了通过端口 GigabitEthernet 0/0/1 可以到达主机 A ,通过端口 GigabitEthernet 0/0/3 可以到达主机 B 。由于 SW3 的根端口产生故障,导致生成树拓扑重新收敛,在生成树拓扑完成收敛之后,从主机 A 到主机 B 的帧仍然不能到达目的地。这是因为 MAC 地址表项老化时间是 300 秒,主机 A 发往主机 B 的帧到达 SW2 后, SW2 会继续通过端口 GigabitEthernet 0/0/3 转发该数据帧。
拓扑变化过程中,根桥通过 TCN BPDU 报文获知生成树拓扑里发生了故障。根桥生成 TC 用来通知其他交换机加速老化现有的 MAC 地址表项。
拓扑变更以及 MAC 地址表项更新的具体过程如下:
SW3 感知到网络拓扑发生变化后, 会不间断地向SW2发送TCN BPDU报文
SW2 收到 SW3 发来的 TCN BPDU 报文后, 会把配置BPDU报文中的Flags的TCA位设置1,然后发送给SW3,告知SW3停止发送TCN BPDU报文
SW2 根桥转发 TCN BPDU 报文
SW1 把配置 BPDU 报文中的 Flags TC 位设置为 1 后发送, 通知下游设备把MAC地址表项的老化时间由默认的300 s修改为Forward Delay的时间(默认为15 s)
最多等待 15 s 之后, SW2 中的错误 MAC 地址表项会被自动清除。此后, SW2 就能重新开始 MAC 表项的学习及转发操作。

相关文章:

STP(生成树协议)

STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动…...

【前端面试】随机、结构赋值、博弈题

解构赋值(Destructuring Assignment)是 JavaScript ES6 引入的一项非常有用的特性,它允许我们快速地从数组或对象中提取值,并将它们赋给变量。这种方式使得代码更加简洁、易读,并且能够减少重复的访问和赋值操作。 1.…...

Volta——开箱即用的Node.js 版本管理工具

Volta volta 是一个较新的 Node.js 版本管理器,旨在简化 Node.js 和其他工具的安装和管理,在 2019 年出世,仍在积极开发中。Volta 采用了与 nvm 不同的方法:它不是管理 Node.js 的多个版本,而是管理项目及其依赖项。当…...

ubuntu 磁盘空间满,找不到占用文件的目录

解决方法: 检查磁盘空间: 执行 df -h 查看各分区磁盘使用情况。 查找大文件或目录: 执行 du -sh /* 2>/dev/null 查找根目录下的大文件或目录,再逐一进入子目录使用相同命令查找。 清理缓存和临时文件: 清理 /t…...

1. 机器学习基本知识(5)——练习题(参考答案)

20.🔗本章代码笔记📓链接(需要🪜):(01_the_machine_learning_landscape.ipynb - Colab (google.com)) 如果你不想通过上面的官方网址下载本章的笔记,还可以在本篇博文的…...

spark-sql 备忘录

wordcount sc.textFile("../data/data.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(__).collect 读取json 文件 并通过sql 执行 join 查询 public static void main(String[] args) {SparkSession session SparkSession.builder().master(&qu…...

基于softmax回归的多分类

基于softmax回归的多分类任务是机器学习领域中的一种常见应用。softmax回归,又称多项逻辑回归或多类逻辑回归,是逻辑回归在多分类问题上的推广。以下是对基于softmax回归的多分类任务的详细解释: 一、softmax回归的原理 softmax回归的核心思想是通过softmax函数将输入数据…...

bs4基本运用

1. bs4基本使用 1.1. 简介 bs4的全称为 BeautifulSoup。和lxml一样,是一个html的解析器,主要功能也是解析数据和提取数据 。 本模块作为了解模块,实际开发中很少用这个模块去解析数据,大家可能会想为什么这个模块会逐渐被淘汰&…...

MySQL 时区参数 time_zone 详解

文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用?修改它有什么影响?如何设置该参数,本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CUR…...

Redis - 消息队列 Stream

一、概述 消息队列 定义 消息队列模型:一种分布式系统中的消息传递方案,由消息队列、生产者和消费者组成消息队列:负责存储和管理消息的中间件,也称为消息代理(Message Broker)生产者:负责 产…...

Docker:国内加速源

阿里云docker加速云&#xff1a; sudo tee /etc/docker/daemon.json <<EOF { “registry-mirrors”: [“https://euf11uji.mirror.aliyuncs.com”] } EOFhttps://docker.mozhu.dev/ sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": [&qu…...

Android Studio更改项目使用的JDK

一、吐槽 过去&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 原本可以在这修改JDK: 但大家都知道&#xff0c;Android Studio的狗屎性能&#xff0c;再加…...

ubuntu+ros新手笔记(四):gazebo无法加载

以下为ChatGPT 的解决方案&#xff0c;对我来说是可行的&#xff01;&#xff01; 我按照第2步操作就解决辣&#xff01;&#xff01; 我的提问&#xff1a; 在ubuntu 22.04 和ros2 humble环境下&#xff0c;gazebo加载不了 ChatGPT 回答&#xff1a; 在 Ubuntu 22.04 和 …...

vue季度选择器(antd2.0 版本无此控件,单独写一个)

vue季度选择器 效果显示 效果显示 <template><div><a-popoverplacement"bottom"overlayClassName"season-picker"trigger"click"v-model"showSeason"><template #content><div class"season-picker-b…...

C/C++代码性能优化技巧的书籍及资料

使用C/C开发的场景&#xff0c;大多对代码的执行的速度&#xff0c;实时性有较高的要求&#xff0c;像嵌入式系统的开发&#xff0c;资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距&#xff0c;会反映在产品的性…...

通俗易懂的 Nginx 反向代理 配置

通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif &#xff0c;/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…...

docker设置容器自动启动

说起开机自动启动应该很多人都遇到过&#xff0c;我们公司做的系统很多的中间件都没有设置开机自动启动然后中间修改问题又设置了一些临时生效的文件&#xff0c;开始的时候大家都不以为意&#xff0c;知道公司陆续有人离职入职管理交接一塌糊涂&#xff0c;项目成了历史遗留问…...

蓝桥杯刷题——day1

蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。本题中&#xff0c;将空字符串定义为有效的 回文串 。 题目链接&a…...

Leetcode 面试150题 399.除法求值

系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图&#xff1a;给定图中的一些点&#xff08;点即变量&#xff09;&#xff0c;以及某些边的权值&#xff08;权值即两个变量的比值&#xff09;&#xff0c;试…...

活动预告 |【Part2】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识

课程介绍 通过参加“Microsoft 安全在线技术公开课&#xff1a;安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中&#xff0c;你将获得所需的安全技能和培训&#xff0c;以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知…...

深度解析AzurLaneAutoScript:基于图像识别与智能调度的自动化引擎架构设计

深度解析AzurLaneAutoScript&#xff1a;基于图像识别与智能调度的自动化引擎架构设计 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoSc…...

机器人仿真终极指南:使用WPR系列从零构建ROS虚拟测试环境 [特殊字符]

机器人仿真终极指南&#xff1a;使用WPR系列从零构建ROS虚拟测试环境 &#x1f680; 【免费下载链接】wpr_simulation 项目地址: https://gitcode.com/gh_mirrors/wp/wpr_simulation 在机器人开发领域&#xff0c;硬件成本高昂、测试周期漫长是每个开发者面临的现实挑战…...

QueryExcel:高效批量Excel数据查询的终极开源解决方案

QueryExcel&#xff1a;高效批量Excel数据查询的终极开源解决方案 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 面对海量Excel文件中的数据查询需求&#xff0c;你是否还在重复着CtrlF、CtrlC、Ctrl…...

构建智能交易系统:高效掌握缠论量化实战技巧

构建智能交易系统&#xff1a;高效掌握缠论量化实战技巧 【免费下载链接】chan.py 开放式的缠论python实现框架&#xff0c;支持形态学/动力学买卖点分析计算&#xff0c;多级别K线联立&#xff0c;区间套策略&#xff0c;可视化绘图&#xff0c;多种数据接入&#xff0c;策略开…...

安全视角:AI Agent Harness Engineering 权限控制体系

安全视角:AI Agent Harness Engineering 权限控制体系 本文作者:资深云原生安全工程师、AI Agent落地技术专家,累计帮助12家企业完成AI Agent安全体系搭建,避免了超过5000万的潜在安全损失 一、引言 (Introduction) 钩子 (The Hook) 你是否见过这样的场景:公司花了上百万…...

原子制造:从单原子操控到新材料创制的技术原理与应用

1. 原子制造&#xff1a;从宏观“锤子”到微观“镊子”的范式革命我们常说&#xff0c;人类文明史是一部材料史。从打磨石器的旧石器时代&#xff0c;到熔铸青铜的青铜时代&#xff0c;再到锻造钢铁的工业时代&#xff0c;每一次文明的跃迁&#xff0c;都伴随着我们对物质操控能…...

2026年5款专业气象数据可视化软件大盘点

在科技飞速发展的今天&#xff0c;气象可视化作为一种将复杂气象数据转化为直观图像的技术&#xff0c;正发挥着越来越重要的作用。它不仅为气象工作者提供了便捷的数据分析手段&#xff0c;也让普通大众能够轻松理解天气变化。接下来&#xff0c;让我们一起深入了解气象可视化…...

【Redis | 第一篇】Redis常见命令

目录 一、Redis数据结构介绍 二、Redis的通用命令 三、String类型 3.1 key的层级结构 四、Hash类型 五、List类型 六、Set类型 一、Redis数据结构介绍 Redis是一个key-value的数据库&#xff0c;key一般是字符串类型&#xff0c;不过value的类型多种多样。 二、Redis的…...

UnityPackage Extractor终极指南:快速免费提取Unity资源包

UnityPackage Extractor终极指南&#xff1a;快速免费提取Unity资源包 【免费下载链接】unitypackage_extractor Extract a .unitypackage, with or without Python 项目地址: https://gitcode.com/gh_mirrors/un/unitypackage_extractor UnityPackage Extractor是一款简…...

Python-json-logger集成指南:Django、Flask等框架中的终极使用教程

Python-json-logger集成指南&#xff1a;Django、Flask等框架中的终极使用教程 【免费下载链接】python-json-logger Json Formatter for the standard python logger 项目地址: https://gitcode.com/gh_mirrors/py/python-json-logger Python-json-logger是一个强大的J…...