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

【网络协议】开放式最短路径优先协议OSPF详解(一)

OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。

文章目录

    • 链路状态路由协议
    • OSPF 的工作原理
      • OSPF 数据包类型
      • Dijkstra算法、管理距离与度量值
      • OSPF的管理距离
      • OSPF的度量值
    • 链路状态路由协议的优势
    • 拓扑结构
      • 路由器OSPF命令
        • **关于Process-ID**
      • 网络命令
      • Wildcard Mask(通配符掩码)
      • 回到配置
      • OSPF路由器ID(Router-ID)
      • 配置路由器ID
      • 配置回环接口
    • 验证OSPF操作
      • show ip ospf neighbor
      • show ip route
      • show ip ospf interface
      • show ip protocols
      • show ip ospf
      • show ip ospf database
    • 验证连接性
      • 第1部分结束

链路状态路由协议

内部路由协议分为两类:距离向量路由协议和链路状态路由协议。OSPF 属于链路状态路由协议类别。

链路状态协议通过计算从源网络到目标网络路径的“代价”来工作,并使用 Edsger Dijkstra 开发的 SPF(Shortest Path First)算法。以下是链路状态路由协议(如 OSPF)的工作步骤:

1、所有配置了链路状态路由协议的路由器会学习其直接连接的网络。
2、共享链路的路由器会识别出相邻路由器,并建立关系。
3、建立关系后,路由器会与彼此共享其直接连接的路由。这是通过发送包含路由信息的数据包实现的。
4、接收到这些信息的邻居会将其传播给其他邻居。
5、当所有邻居都掌握了所有路由信息后,每个路由器会利用这些信息创建一张通往所有网络目标的“地图”。
6、在这张地图生成后,会运行 SPF(Shortest Path First)算法,以确定到特定远程网络的最佳路径。

这是链路状态路由协议(如 OSPF 和 IS-IS)的基本工作原理。我们将在 OSPF 学习中更详细地探讨这些步骤。

OSPF 的工作原理

在 OSPF 中,上述过程被遵循,但使用了不同的术语,以下是 OSPF 的关键概念。

OSPF 数据包类型

OSPF 有 5 种不同类型的数据包需要理解:

1.Hello 数据包

这些是配置了 OSPF 的路由器发送的第一类消息,使用专门为 OSPF 保留的多播 IP 地址 224.0.0.5。Hello 数据包用于发现邻居并维护与邻居的关系(邻接关系)。

注意:Hello 数据包在多播和点对点网络中每 10 秒发送一次,而在非广播多路访问(NBMA)网络中每 30 秒发送一次。我们稍后会进一步探讨。

在 OSPF 中,Hello 数据包主要有以下三个任务:

  • 发现和建立邻居邻接关系。
  • 广播建立邻居关系所需的 OSPF 参数。
  • 在多访问网络中选举 DR(指定路由器)和 BDR(备份指定路由器)。

2.DBD(数据库描述)数据包

这是一份包含特定路由器在路由域中学习到的路由摘要的列表。接收此数据包的路由器会将其与自身的链路状态数据库进行比较,以发现缺失的路由。

3.LSR(链路状态请求)数据包

当路由器发现自己缺少某些路由信息时,会根据收到的 DBD 数据包发送此数据包,向通知其缺失信息的路由器请求更详细的信息,以更新自身的链路状态数据库。

4.LSU(链路状态更新)数据包

包含特定路由的详细信息,包括下一跳信息和到达该路由的代价。收到 LSR 的路由器会通过此数据包回复详细信息。

5.LSAck(链路状态确认)数据包

用于确认路由器已收到 LSU 数据包。

目前我们不需要完全理解这些概念,我们将在本章后续内容中更深入地探讨它们。

Dijkstra算法、管理距离与度量值

如前所述,OSPF使用SPF(Shortest Path First)算法。路由器的OSPF链路状态数据库中包含的信息就像一张“地图”,用于计算到远程网络的最佳路径。然而,OSPF不会为路由保留备用路径。如果某条通往网络的路径失效,SPF算法会重新运行以确定备用或替代路径。

OSPF的管理距离

OSPF的管理距离为110。这意味着它比RIP等其他路由协议更优先,但其可信度不如EIGRP、静态路由或直接连接的路由。

OSPF的度量值

OSPF使用的度量值是成本(Cost)。成本可以根据链路上的带宽或管理员通过 ip ospf cost 命令配置的成本值来确定。更多细节将在后续讨论。

链路状态路由协议的优势

使用链路状态路由协议有以下几个主要优势:

1.拓扑图
如前所述,链路状态数据库中存储了一张包含整个域中所有路由的拓扑图。这是一个显著优势,因为找到冗余路径非常简单。路由器只需查阅“地图”中的备用路径,并使用SPF算法计算到达的成本。

2.快速收敛
与距离矢量路由协议不同,后者需要在将路由信息传递给其他路由器之前先计算路由信息,而链路状态路由协议会将接收到的路由信息泛洪到除接收接口以外的所有其他接口。域中的每台路由器都可以自行决定这些信息是否相关。

3.事件驱动的更新
与EIGRP类似,OSPF中的路由器不会定期向其他路由器发送更新,而是当网络发生变化时才发送更新。而且,发送的信息仅与该变化相关。

4.分层设计
使用区域(Area)是链路状态路由协议的一个巨大优势。区域的使用使得可以创建分层的IP地址格式。然而,这也意味着只能在区域边界上进行路由汇总。

现在我们已经了解了一些OSPF的基础概念,可以开始进行配置了。

拓扑结构

以下展示了本节OSPF配置的实验拓扑结构。

在这里插入图片描述

该网络由4台路由器组成,分别标记为R1至R4。此外,还有3个局域网(LAN)段分别连接到R1、R3和R4。使用的IP子网显示在拓扑图中,具体的IP地址方案如下所示。DCE接口的时钟速率设置为64,000。

在这里插入图片描述

在开始OSPFv2配置之前,设计上方的网络并完成以下配置:

  1. 为所有设备配置适当的主机名
  2. 为控制台线路和Telnet线路配置适当的密码
  3. 设置横幅信息
  4. 禁用IP域名查找功能
  5. 为接口分配IP地址、子网掩码、默认网关,并在需要的接口上设置时钟速率
  6. 启用设备并确保直接连接的网络之间的连通性
  7. 完成基本的OSPF配置

读者应自行完成基础配置,我们不会过多地停留在此部分,而是直接进入OSPF的基础配置。

路由器OSPF命令

要在路由器上启用OSPF,需要在全局配置模式下使用以下命令:

router ospf <process-ID>
关于Process-ID

1、Process-ID是一个逻辑上的标识号,范围为1到65535。
2、这个号码仅在本地路由器上有意义,用于标识路由器上运行的OSPF进程。
3、OSPF的邻居路由器无需此号码匹配即可形成邻接关系。

为了保持一致性,建议在拓扑中所有路由器上使用相同的Process-ID。在本拓扑中,我们将所有路由器的Process-ID设为10

例如,在R1上执行以下命令:

R1(config)#router ospf 10

该命令使我们进入OSPF特定配置模式,在此模式中可以配置OSPF的大多数选项。

网络命令

OSPF使用network命令来公布路由,但格式略有不同:

router(config-router)#network <network_address> <wildcard_mask> area <area_ID>

Wildcard Mask为通配符掩码、Area ID为区域ID。

  • OSPF使用区域将网络划分。区域内的所有路由器共享相同的拓扑映射。
  • 在本章中,我们只涉及骨干区域area 0,这意味着所有路由器都将处于area 0
  • 随着网络规模的增长,为了减少拓扑映射的规模,可以引入多区域的使用,这将在后续章节中讨论。

注意:必须在所有网络声明和路由器上将区域配置为area 0

Wildcard Mask(通配符掩码)

通配符掩码(或反码)是一种特殊的IP地址,用于OSPF判断要公布的特定子网。

计算方法

  1. 写下全1子网掩码:255.255.255.255(广播地址)
  2. 写下子网的掩码,例如255.255.255.224
  3. 相减得到通配符掩码:255.255.255.255 - 255.255.255.224 = 0.0.0.31

对于网络192.168.1.0/27,我们将进行如下配置:

  • 子网掩码:255.255.255.224
  • 通配符掩码:0.0.0.31

在OSPF配置模式下执行:

router ospf 10
network 192.168.1.0 0.0.0.31 area 0

对于所有路由器,类似地替换对应的网络地址和通配符掩码完成配置。

在这里插入图片描述

因此,网络 192.168.1.0/27 的反掩码(或通配符掩码)为 0.0.0.31

当路由器决定要公布的网络时,通配符掩码中的“0”表示需要匹配的部分,而任何高于0的值将被忽略。因此,在上述例子中,当在OSPF中公布网络 192.168.1.0/27 时,前三个八位组将被匹配,而第四个八位组只会部分匹配。

这意味着,当公布路由 192.168.1.0/27 时,路由器仅公布前三个八位组匹配的路由,而忽略第四个八位组。

注意:在OSPF中可以使用的最具体的通配符掩码是 0.0.0.0,这表示路由器只会公布特定的IP地址,而不是一个网络地址。

在OSPF中,我们需要公布希望参与OSPF的直接连接网络。

例如,要在OSPF中公布网络 192.168.1.0/28,我们需要在R1上输入以下命令:

R1(config-router)#network 192.168.1.0 0.0.0.15 area 0

回到配置

在本拓扑中,我们将在每个路由器上使用下表中的命令,公布所有直接连接的网络。

在这里插入图片描述

注意:在进行这些配置时,请确保计算所有的通配符掩码,以便清楚地理解这一概念。

在所有路由器上完成这些配置后,应该能够看到如下输出:

在这里插入图片描述

这表明OSPF正在正常工作,所有路由都已学习到。请注意,这一过程发生得非常快,这正是OSPF收敛的速度之快。

OSPF路由器ID(Router-ID)

在OSPF中,路由器ID是用于命名路由域中每个路由器的一种方式。它本质上是一个特殊选择的IP地址,用于标识OSPF中的路由器。在CISCO路由器中,路由器ID的选择基于以下标准:

1.使用OSPF配置模式下的命令 router-ID <IP_ADDRESS> 配置的IP地址。
2.如果未配置,则使用任何配置的回环接口(loopback interface)中最高的IP地址。
3.如果没有回环接口,则路由器使用任何活动物理接口中最高的IP地址。

注意:最高的活动物理接口是指能够转发数据包的接口。

关于路由器ID的用途及重要性将在后续讨论中进行介绍。

配置路由器ID

路由器ID在OSPF配置模式中配置,其提示符如下所示:

Router(config-router)#

用于配置路由器ID的命令如下:

router(config-router)#router-id <unique_ip_address>

例如,在R1上,我们将使用IP地址1.1.1.1作为路由器ID,配置命令如下所示:

R1(config-router)#router-id 1.1.1.1

执行上述命令后,路由器将设置一个手动配置的路由器ID为1.1.1.1

对于四个路由器,我们将使用如下表格中的IP地址作为路由器ID:

在这里插入图片描述

配置回环接口

正如我们之前提到的,回环接口可以用作路由器ID。

回环接口是一个虚拟接口——这意味着它仅存在于路由器中,并未连接到网络中的任何其他物理设备。一旦配置,回环接口会自动转为UP状态。配置回环接口所需的命令是:

Router(config)#interface <loopback> <Loopback_interface_number>

执行此命令后,我们将进入接口配置模式,在这里我们可以配置其他选项,例如IP地址。

要在R1上配置一个IP地址为172.16.1.1/24的回环接口,可以输入以下命令:

在这里插入图片描述

注意:执行这些命令后,新的接口将在“show ip interface brief”命令的输出中显示。回环接口始终处于UP状态,并像物理接口一样工作。

在配置OSPF并保存后,使用中的路由器ID仍然是我们使用的最高活动物理接口,而使用router-id命令配置的路由器ID仍然不会生效,如下所示的输出所示。

在这里插入图片描述

我们需要通过重新启动OSPF进程来使路由器ID生效,为此,我们必须在特权exec模式下输入命令“clear ip ospf process”,如下所示。

执行此命令后,系统会提示我们确认此命令,我们应该回答“YES”。

在这里插入图片描述

执行此命令后,所有路由器的新路由器ID将生效。

验证OSPF操作

配置完OSPF后,我们需要验证所有路由器上的配置是否正常工作。要验证OSPF,我们将使用以下命令:

  • Show ip ospf neighbor
  • Show ip ospf database
  • Show ip route
  • Show ip ospf interface
  • Show ip protocols
  • Show ip ospf
  • Debug ip ospf adj
  • Debug ip ospf hello
  • Show ip ospf neighbor

show ip ospf neighbor

“show ip ospf neighbor”是验证和排除OSPF邻居关系故障时最常用的命令之一。使用该命令显示的一些信息如下所示:

  • 邻居的路由器ID
  • Pri – OSPF优先级
  • State – LSA类型
  • Dead time – 这表示OSPF等待的时间,直到它认为邻居因为缺失hello包而被认为是死亡。
  • Address – 邻居的IP地址(共享链路的地址)
  • Interface – 路由器与邻居连接的物理接口

在OSPF中,要形成邻接关系,邻居路由器必须满足以下条件:

  • 链路上的子网掩码必须相同,即链路必须处于同一子网
  • OSPF hello和dead定时器必须匹配
  • OSPF网络类型必须匹配
  • 网络声明必须正确

在我们的场景中,执行“show ip ospf neighbor”命令后的输出将在所有路由器上显示如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

show ip route

在配置了OSPF的路由器上,show ip route命令将显示路由器已学习到的所有路由、下一跳、行政距离、度量值以及路由的年龄。在R1上执行此命令的输出将如下所示。

注意:通过OSPF学习到的路由在前面会标记为“O”。

在这里插入图片描述

show ip ospf interface

此命令用于验证参与OSPF的接口,以及hello和dead定时器的间隔。通过指定接口的名称和编号,还可以显示特定接口的统计信息。在R2上执行此命令的输出如下所示。

在这里插入图片描述

OSPF的hello和dead定时器在上面输出中的红色框中突出显示。此外,网络类型显示为点对点,成本为64。

show ip protocols

“show ip protocols”命令可用于验证正在使用的路由协议。在本实例中,它将显示OSPF的进程ID、路由器ID、广告的网络、邻居、区域和区域类型,以及OSPF的管理距离。

此命令在R3上的输出如下所示。

在这里插入图片描述

show ip ospf

“show ip ospf”命令也是验证进程ID、路由器ID、区域、SPF统计信息以及其他在故障排除OSPF时有用信息的好方法。

此命令在R1上的输出如下所示,部分输出被省略。

在这里插入图片描述

show ip ospf database

此命令将显示在OSPF中所有具有相同OSPF数据库或“映射”的路由器。

此命令在R1上的输出如下所示。

在这里插入图片描述

其他可以用来验证和排除OSPF故障的命令是调试命令。这些命令将显示OSPF发生时的统计信息,因此可能会消耗大量的处理能力。

如Debug ip ospf adj、Debug ip ospf hello。

验证连接性

在我们配置了所有四台路由器的OSPF并验证所有路由器已收敛并获取到所有路由后,需要通过ping命令验证连接性:

  • 从PC_A到PC_B的ping
  • 从PC_B到PC_C的ping
  • 从PC_A到PC_C的ping

如果所有的ping都成功,说明我们已成功配置OSPF;如果没有成功,请按照上述步骤排查并解决问题。

第1部分结束

至此,我们完成了OSPF的第一部分。我们学习了链路状态路由协议的概念,特别是OSPF,了解了OSPF的工作原理及其优点。我们还配置并验证了OSPF的基本操作。在下一部分,我们将学习更多OSPF的概念并进行更多配置。

相关文章:

【网络协议】开放式最短路径优先协议OSPF详解(一)

OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议&#xff0c;它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...

嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)

基本概念之什么是驱动程序()&#xff1f; 驱动程序本质上是代码逻辑的集合&#xff0c;通常用于管理、驱动多个设备实例。某个设备要想使用驱动程序&#xff0c;需要实例化相应的驱动程序的结构体&#xff0c;并在系统中注册&#xff0c;获得主设备号、次设备号&#xff0c;并…...

爱死机第四季(秘密关卡)4KHDR国语字幕

通过网盘分享的文件&#xff1a;love_death_robot 链接: https://pan.baidu.com/s/1bG3Xtdopenil2O_y93hY_g?pwd8kib 提取码: 8kib...

kubelet状态错误报错

journalctl -xeu kubelet 执行后的日志如下: -- -- The process exit code is exited and its exit status is 1. Jan 02 14:20:06 iv-ydipyqxfr4wuxjsij0bd systemd[1]: kubelet.service: Failed with result exit-code. -- Subject: Unit failed -- Defined-By: system…...

<div>{{ $t(“collectionPlan“) }}</div> 中的$t是什么

$t是Vue I18n插件提供的一种方法&#xff0c;用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例&#xff0c;展示如何在Vue I18n中定义消息&#xff1a; const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...

[C++刷题] 求回文素数

求回文素数 题目 素数回文数的个数 题目描述 求 11 11 11 到 n n n 之间&#xff08;包括 n n n&#xff09;&#xff0c;既是素数又是回文数的整数有多少个。 输入格式 一个大于 11 11 11 小于 10000 10000 10000 的整数 n n n。 输出格式 11 11 11 到 n n n 之…...

SQLALchemy如何将SQL语句编译为特定数据库方言

最近在一个使用fastapitortoise-orm的项目中&#xff0c;需要将orm的语句编译成特定数据库方言&#xff0c;但是查询了官方文档及一些资料却找不到合适的方法论&#x1f614;&#xff0c;于是乎我就把目光放到了sqlalchemy身上&#xff0c;东找西找给我找着了。话不多说&#x…...

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析

目录 [卫星遥感] 解密卫星目标跟踪&#xff1a;挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波&#xff08;Kalman …...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...

scrapy 教程

Scrapy Tutorial In this tutorial, we’ll assume that Scrapy is already installed on your system. If that’s not the case, see Installation guide. We are going to scrape quotes.toscrape.com, a website that lists quotes from famous authors. This tutorial …...

2025元旦源码免费送

我们常常在当下感到时间慢&#xff0c;觉得未来遥远&#xff0c;但一旦回头看&#xff0c;时间已经悄然流逝。对于未来&#xff0c;尽管如此&#xff0c;也应该保持一种从容的态度&#xff0c;相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…...

高级架构五 设计模式

一 设计模式七大原则 1.1. 设计模式目的 编写软件过程中&#xff0c;程序员面临着来自 耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性 等多方面的挑战&#xff0c;设计模式是为了让程序(软件)&#xff0c;具有更好的&#…...

RFID手持机与RFID工业平板在仓储物流管理系统中的选型

概述 随着物联网技术在仓储物流管理系统中的普及&#xff0c;RFID手持机与RFID工业平板作为基于RFID技术手持式读写器的两种重要终端设备形态&#xff0c;得到了广泛应用。尽管RFID手持机与RFID工业平板都具备读写 RFID标签的基本功能&#xff0c;使用场景较为类似&#xff0c…...

IoC设计模式详解:控制反转的核心思想

前言&#xff1a;在软件开发中&#xff0c;设计模式是一种经过验证的、在特定场景下能有效解决问题的解决方案。控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09; 作为一种设计模式&#xff0c;通过让程序的控制流和对象管理反转&#xff0c;从而使得代码…...

《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具

在本节课程中&#xff0c;我们来了解一下K8s集群的安全配置&#xff0c;通过对CIS安全基准和kube-bench工具的介绍&#xff0c;可以快速发现K8s集群中不符合最佳实践的配置项&#xff0c;及时进行修复&#xff0c;从而来提高集群的安全性。 在这个课程中&#xff0c;我们将学习…...

LINUX下载编译gtk

下载 选择自己合适的版本 GNOME / gtk GitLab 下载meson GNOME / gtk GitLab 编译 BUILD_DIRbuilddir INSTALL_DIR${HOME}/gtk-resultMESON_PATHpwd/meson-1.6.1/meson.py${MESON_PATH} setup \--prefix ${INSTALL_DIR} \${BUILD_DIR}cd builddir${MESON_PATH} compile…...

基于VSCode软件框架的RISC-V IDE MRS2正式上线发布

基于VSCode软件框架的RISC-V IDE MRS2正式上线发布 一、概述 MounRiver Studio Ⅱ(MRS2)为MounRiver Studio的换代版本&#xff0c;从V2.1开始&#xff0c;框架更换至更现代的VSCode&#xff0c;并深度定制开发。在工程管理、代码编辑、编译、调试等方面均兼容之前版本&#…...

AWS re:Invent 2024 - Dr. Werner Vogels 主题演讲

今年&#xff0c;我有幸亲临现场参加了所有的 keynote&#xff0c;每一场都让我感受到深深的震撼。无论是全新的功能发布&#xff0c;还是令人眼前一亮的新特性展示&#xff0c;每一场 keynote 都精彩纷呈&#xff0c;充满干货&#xff0c;值得反复学习和回味。 恰好&#xff…...

前端小案例——520表白信封

前言&#xff1a;我们在学习完了HTML和CSS之后&#xff0c;就会想着使用这两个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...

FPGA随记——过约束

什么是过约束&#xff1f; 从字面意思来看&#xff0c;所谓过约束是指约束过紧了。这个“过”体现在setup requirement变小了&#xff0c;对于单周期路径&#xff0c;这个值通常与时钟周期一致&#xff0c;但在过约束情况下&#xff0c;等效于这个值变小了&#xff0c;也就是时…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...