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

网络基础:OSPF 协议

OSPF(Open Shortest Path First)是一种广泛使用的链路状态路由协议,用于IP网络中的内部网关协议(IGP)。OSPF通过在网络中的所有路由器之间交换路由信息,选择从源到目的地的最优路径。OSPF工作在OSI模型的第三层,即网络层。OSPF使用IP协议号89进行通信;所有OSPF路由器发送和接收的OSPF报文都封装在IP数据包中,并使用协议号89来标识这些数据包是OSPF报文,OSPF负责在IP网络中进行路由信息的交换和路径计算。

链路状态路由协议和距离矢量路由协议
①链路状态路由协议:链路状态路由协议通告的是链路状态而不是路由表;运行链路状态路由协议的路由器之间首先会建立一个协议的邻居关系,然后彼此之间开始交互 LSA(Link State Advertisement,链路状态通告)。(如OSPF)
​
②距离矢量路由协议:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表;通过路由的交互,每台路由 器都从相邻的路由器学习到路由,并且加载进自己的路由表中;对于网络中的所有路由器而言,路由器并不清楚网络的拓扑,只是简单的知道要去往某个 目的方向在哪里,距离有多远。(如RIP)

OSPF正是一种链路状态路由协议,如上述,运行OSPF路由协议的路由器在交换路由信息时并不是单纯向邻居发送自己的路由表,邻居之间交换路由信息时是彼此交互链路状态通告(LSA)信息。LSA也分成不同类型,不同类型的LSA包含的信息也不一样;用的比较多的Router-LSA中包含的信息有:通告生成该LSA的路由器的链路状态,包括路由器的所有接口、接口状态、链路类型(如点到点、广播、多点等)及其邻居。

OSPF基础术语:
Router-ID(Router Identifier,路由器标识符):用于在一个OSPF域中唯一地标识一台路由器;Router-ID的设定可以通过手工配置的方式,或使用系统自动配置的方式。
度量值:OSPF使用路径开销作为度量;路径开销是通往目标的路径上所有链路的累积开销。
OSPF三大表项:
1.邻居表:

OSPF在传递链路状态信息之前,需先建立OSPF邻居关系;OSPF的邻居关系通过交互Hello报文建立,OSPF邻居表显示了OSPF路由器之间的邻居状态。在思科(Cisco)、华为(Huawei)和华三(H3C)网络设备上,可以通过命令行接口(CLI)来查看OSPF邻居表。以下是各个设备上的具体命令:

思科(Cisco)

在思科设备上,可以使用以下命令查看OSPF邻居表:

show ip ospf neighbor

此命令将显示所有OSPF邻居的详细信息,包括邻居ID、状态、邻居IP地址和接口信息。

示例输出:
Router# show ip ospf neighbor
​
Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.1.1       1   FULL/DR         00:00:39    10.1.1.1        GigabitEthernet0/1
192.168.1.2       1   FULL/BDR        00:00:36    10.1.1.2        GigabitEthernet0/1
华为(Huawei)

在华为设备上,可以使用以下命令查看OSPF邻居表:

display ospf peer

此命令将显示所有OSPF邻居的详细信息,包括邻居ID、状态、邻居IP地址和接口信息。

输出示例;

<Huawei> display ospf peer
​OSPF Process 1 with Router ID 192.168.1.1Neighbor Brief Information
​Area 0.0.0.0 interface 10.1.1.1 (GigabitEthernet0/1)'s neighbors
-------------------------------------------------------------------------------
Router ID       Address         Pri    State         Dead Time   Neighbor Area
192.168.1.2     10.1.1.2        1      Full/BDR      00:00:36    0.0.0.0
192.168.1.3     10.1.1.3        1      Full/DR       00:00:39    0.0.0.0
​
华三(H3C)

在华为设备上,可以使用以下命令查看OSPF邻居表:

display ospf peer

输出示例:

<H3C> display ospf peer
​OSPF Process 1 with Router ID 192.168.1.1Neighbor Brief Information
​Area 0.0.0.0 interface 10.1.1.1 (GigabitEthernet0/1)'s neighbors
-------------------------------------------------------------------------------
Router ID       Address         Pri    State         Dead Time   Neighbor Area
192.168.1.2     10.1.1.2        1      Full/BDR      00:00:36    0.0.0.0
192.168.1.3     10.1.1.3        1      Full/DR       00:00:39    0.0.0.0
​

通过这些命令,可以方便地查看设备上所有OSPF邻居的详细信息,帮助网络管理员了解OSPF的工作状态和邻居关系。

2.LSDB表

LSDB会保存自己产生的及从邻居收到的LSA信息;LSDB(Link-State Database,链路状态数据库)是OSPF(Open Shortest Path First)协议中存储网络拓扑信息的核心组件。每个OSPF路由器都维护一个LSDB,用于存储从其他路由器接收到的所有链路状态通告(LSA)。这些LSA共同描述了整个网络的拓扑结构,使得路由器能够计算出最优路径。在不同厂商的网络设备上,可以使用相应的命令来查看LSDB的内容。以下是思科(Cisco)、华为(Huawei)和华三(H3C)网络设备上的具体命令:

思科(Cisco)
show ip ospf database
华为(Huawei)
display ospf lsdb
华三(H3C)
display ospf lsdb

3.OSPF路由表

OSPF(Open Shortest Path First)路由表(Routing Table)是OSPF路由器根据其链路状态数据库(LSDB)和最短路径优先(SPF)算法计算出的最优路径的集合。这些路由条目用于决定数据包的转发路径。在不同厂商的网络设备上,可以使用相应的命令来查看OSPF路由表的内容。

思科(Cisco)设备
show ip route ospf
华为(Huawei)
display ospf routing
华三(H3C)
display ospf routing

OSPF工作流程
  1. 邻居发现:

    OSPF路由器通过定期发送Hello包来发现和维护邻居关系。Hello包包含以下信息:

    路由器ID
    Hello间隔时间
    死亡间隔时间
    网络掩码
    路由器优先级
    邻居列表

    路由器在收到Hello包后,会检查各项参数是否匹配,如果匹配,则在自己的邻居列表中添加该路由器。

  2. 建立邻接关系:

    当邻居关系建立后,OSPF路由器之间会进一步建立邻接关系。这个过程包括:

    ①Database Description (DBD) 包交换:DBD包包含链路状态数据库(LSDB)的摘要信息;LSDB(Link-State Database,链路状态数据库)是OSPF(Open Shortest Path First)路由协议中存储网络拓扑信息的数据库。邻居路由器交换DBD包,以确认彼此的LSDB的状态和内容。
    ②Link State Acknowledgment (LSAck) 包交换:每当一个路由器收到新的LSA时,它会发送LSAck包来确认已收到这些信息。
    ③Link State Request (LSR) 包交换:如果一个路由器发现自己的LSDB中缺少某些LSA(Link State Advertisement),它会发送LSR包请求这些特定的LSA。
    ④Link State Update (LSU) 包交换:路由器收到LSR包后,会回应LSU包,其中包含请求的LSA信息。
    ⑤Link State Acknowledgment (LSAck) 包交换:每当一个路由器收到新的LSA时,它会发送LSAck包来确认已收到这些信息。

    OSPF邻接关系

    OSPF完成邻接关系的建立有四个步骤,建立邻居关系、协商主/从、交互LSDB信息,同步LSDB

    这些步骤我们主要说一下协商主/从,在OSPF(Open Shortest Path First)协议中,建立邻接关系时协商主/从关系的主要目的是确保数据库描述(DBD)包的有序交换。如果没有主/从关系的协商,两个路由器可能会同时发送DBD包,导致包的冲突和乱序。这会引起邻接关系的不稳定,甚至中断;主/从关系确保了只有一个路由器(主)负责启动DBD包的发送,另一个路由器(从)按照顺序进行回应,从而避免了冲突和混乱。

    主/从关系的选举过程
    主从关系的选举基于路由器的Router ID。Router ID较大的路由器被选为主(Master),Router ID较小的被选为从(Slave)。
    主路由器(Master)首先发送一个DBD包,包含其LSDB的摘要信息。
    从路由器(Slave)接收到这个DBD包后,确认并回应一个包含自己LSDB摘要信息的DBD包。

    示例说明

    R1和R2进入Exstart状态,开始协商主从关系。
    比较Router ID,2.2.2.2大于1.1.1.1,因此R2被选为主(Master),R1被选为从(Slave)。
    R2(主)首先发送一个DBD包。
    R1(从)接收到这个DBD包后,确认并回应一个DBD包。
    完成初始DBD包交换后,R2和R1状态从Exstart转移到Exchange,继续交换DBD包,最终同步LSDB。
  3. LSA 交换:

    一旦邻接关系建立,路由器会开始交换LSA来更新彼此的LSDB,确保LSDB同步;LSA是OSPF中的基本信息单位,包含网络拓扑信息。主要的LSA类型有:

    Router-LSA (类型1):描述路由器的链路。
    Network-LSA (类型2):由DR生成,描述广播网络。
    Summary-LSA (类型3):由ABR生成,描述区域间的网络。
    ASBR-Summary-LSA (类型4):描述ASBR的可达性。
    AS-External-LSA (类型5):由ASBR生成,描述外部自治系统的路由。
  4. 运行SPF算法

    当路由器的LSDB更新后,它会运行Dijkstra的最短路径优先(SPF)算法来计算最短路径树(SPT)。通过SPF算法,路由器可以生成从自己到所有目的地的最优路径。

  5. 路由表更新

    SPF算法计算完成后,路由器会根据SPT更新自己的路由表,选择最优路径转发数据包。

  6. 维护和更新

    OSPF路由器需要定期发送Hello包来维持邻居关系,确保链路状态数据库的同步。当网络拓扑发生变化时(如链路断开、新增路由器),路由器会生成新的LSA并传播这些变化,确保所有路由器能够快速收敛到最新的拓扑状态。(每10s发送一次Hello包,若40s都没有收到邻居的Hello包就自动认为邻居Down掉了)

在OSPF的工作流程中,第二步的LSA交换主要是为了同步邻居之间的链路状态数据库(LSDB),确保它们拥有一致的网络拓扑视图,而第三步的LSA交换则是一个持续的过程,用于维护和更新整个网络的拓扑信息。

DR和BDR选举

在OSPF(Open Shortest Path First)协议中,DR(Designated Router,指定路由器)和BDR(Backup Designated Router,备用指定路由器)在多访问网络(如以太网和非广播多访问网络)中扮演着重要角色。它们的主要目的是减少OSPF路由器之间的LSA(链路状态通告)泛洪次数,提高网络效率。

以正常方式建立邻接关系:

以DR/BDR方式建立邻接关系:

以下是关于DR和BDR的详细解释:

指定路由器(DR):DR负责在多访问网络中作为中央点来进行LSA的泛洪。所有其他路由器(非DR和非BDR)只需与DR交换LSA,而不需要与所有其他路由器直接交换。这减少了网络中的LSA泛洪量。DR从所有路由器收集LSA,并向所有路由器泛洪这些信息,确保所有路由器都能获得最新的链路状态信息。

备用指定路由器(BDR):BDR是DR的备份。当DR失效时,BDR会自动成为新的DR,确保网络拓扑信息的持续传播。BDR在DR正常工作时,也会接收所有路由器的LSA,但它不会主动泛洪这些信息,除非DR失效。

我们可以通过ospf邻居表来查看当前ospf网络中的DR和BDR分别是哪些设备。

DR和BDR的选举过程

  1. Hello包交换

    • 在多访问网络中,所有OSPF路由器通过Hello包来发现彼此并进行DR/BDR的选举。

    • Hello包中包含了路由器的优先级(Priority)和Router ID等信息。

  2. 路由器优先级

    • 每个路由器在Hello包中宣布自己的优先级。优先级值可以在0到255之间。

    • 优先级最高的路由器被选为DR。如果优先级相同,则Router ID较大的路由器被选为DR。

  3. 选举过程

    • 初始选举时,所有路由器都会发送Hello包,包含自己认为的当前DR和BDR。

    • 经过多次Hello包交换后,所有路由器会达成一致,选举出优先级最高的路由器作为DR,次高优先级的路由器作为BDR。

    • 如果路由器的优先级为0,则它不会参与DR/BDR选举,只能作为普通路由器。

示例说明

假设在一个以太网网络中有四个OSPF路由器,R1, R2, R3和R4,它们的优先级和Router ID如下:

R1:优先级1,Router ID 1.1.1.1
R2:优先级2,Router ID 2.2.2.2
R3:优先级1,Router ID 3.3.3.3
R4:优先级0,Router ID 4.4.4.4

1.确定优先级最高的路由器:优先级最高的是R2(优先级2),因此R2被选为DR。其次是R1和R3(优先级1),Router ID较大的R3被选为BDR。选举完成,其他路由器则都是普通路由器。

选举后DR和BDR的位置是不可抢占的;若是抢占DR则需要重置DR中的OSPF进程。

OSPF区域结构

OSPF(Open Shortest Path First)的区域结构是为了优化路由信息的管理和传播,通过将大型网络划分为多个区域来减少路由开销、提高稳定性和可扩展性。以下是关于OSPF区域结构的详细介绍:

区域(Area):区域是OSPF网络的一个逻辑分段,每个区域都有一个唯一的32位标识符,通常以IP地址格式表示(例如0.0.0.0);每个区域内部的路由器都共享同一个链路状态数据库(LSDB),但不同区域之间的LSDB是独立的。

骨干区域(Area 0):OSPF网络的核心部分,所有其他区域都必须直接或间接地连接到骨干区域;骨干区域负责汇总和分发来自不同区域的路由信息,确保整个OSPF域的连通性。

非骨干区域:除了骨干区域之外的其他区域,用于进一步划分网络,减少单个区域内的路由器数量。非骨干区域必须通过骨干区域进行通信,不能直接与其他非骨干区域通信。

ospf配置

在OSPF配置过程中,涉及到多个步骤,包括定义OSPF进程、配置区域、指定接口以及调整相关参数。以下是OSPF配置的详细步骤和示例,分别以思科(Cisco)、华为(Huawei)和华三(H3C)设备为例。

思科(Cisco)
  1. 启用OSPF进程

    router ospf 1

  2. 配置路由器ID(可选)

    router-id 1.1.1.1

  3. 将接口划分到区域

    network 192.168.1.0 0.0.0.255 area 0
    network 192.168.2.0 0.0.0.255 area 1

  4. 配置接口OSPF参数(可选)

    interface GigabitEthernet0/1ip ospf cost 10ip ospf hello-interval 10

华为(Huawei)
  1. 启用OSPF进程(并配置route-id)

    ospf 1 route-id 3.3.3.3

  2. 将接口划分到区域

    area 0network 192.168.1.0 0.0.0.255
    area 1network 192.168.2.0 0.0.0.255

  3. 配置接口OSPF参数(可选)

    interface GigabitEthernet0/0/1ospf cost 10ospf hello-interval 10

华三(H3C)
  1. 启用OSPF进程(并配置route-id)

    ospf 1 router-id 1.1.1.1
  2. 将接口划分到区域

    area 0network 192.168.1.0 0.0.0.255
    area 1network 192.168.2.0 0.0.0.255
  3. 配置接口OSPF参数(可选)

    interface GigabitEthernet1/0/1ospf cost 10ospf hello-interval 10

通用配置步骤
  1. 定义OSPF进程:启动OSPF进程,并分配进程ID。

  2. 配置路由器ID:每个OSPF路由器需要一个唯一的路由器ID。

  3. 划分区域:将接口分配到指定的OSPF区域。

  4. 配置接口参数(可选):可以根据需要配置接口的OSPF特定参数,如开销(cost)、Hello间隔等。

验证配置

在配置完成后,可以使用以下命令来验证OSPF配置和邻居状态。

思科
show ip ospf            //显示与OSPF相关的各种信息
show ip ospf neighbor  //显示邻居表
show ip route ospf    //显示ospf路由表
华为
display ospf             //显示与OSPF相关的各种信息
display ospf peer       //显示邻居表
display ospf routing   //显示ospf路由表
华三
display ospf            //显示与OSPF相关的各种信息
display ospf peer       //显示邻居表
display ospf routing    //显示ospf路由表
ospf相关的两个组播地址

OSPF(Open Shortest Path First)使用两个特定的组播地址来发送和接收OSPF协议消息。这两个组播地址是224.0.0.5和224.0.0.6。

1.组播地址224.0.0.5(AllSPFRouters)

该组播地址用于发送OSPF Hello消息、Link State Request消息、Link State Update消息和Link State Acknowledgment消息到所有运行OSPF的路由器;任何运行OSPF的路由器接口都会监听这个组播地址,以便接收OSPF邻居的各种消息。这是用来建立和维护邻居关系的关键通信方式。

2.组播地址224.0.0.6(AllDRouters)

该组播地址用于发送OSPF Link State Update消息和Link State Acknowledgment消息到指定的DR(Designated Router)和BDR(Backup Designated Router);仅DR和BDR会监听这个组播地址。非DR和非BDR的OSPF路由器会将Link State Update消息发送到224.0.0.6地址,以便DR和BDR可以接收并传播这些消息,从而减少组播的冗余。

相关文章:

网络基础:OSPF 协议

OSPF&#xff08;Open Shortest Path First&#xff09;是一种广泛使用的链路状态路由协议&#xff0c;用于IP网络中的内部网关协议&#xff08;IGP&#xff09;。OSPF通过在网络中的所有路由器之间交换路由信息&#xff0c;选择从源到目的地的最优路径。OSPF工作在OSI模型的第…...

1456.定长子串中元音的最大数目

思路&#xff1a; 首次是滑动窗口&#xff0c; 然后遍历子字符串&#xff0c;这样复杂度太高&#xff0c;没过测试 改进&#xff0c;滑动窗口先求出第一个窗口中元音数量&#xff0c; 然后利用滑动式&#xff0c;一进一出方式判断首尾是否是原因即可 给你字符串 s 和整数 k 。 …...

基于xilinx FPGA的GTX/GTH/GTY位置信息查看方式(如X0Y0在bank几)

目录 1 概述2 参考文档3 查看方式4查询总结&#xff1a; 1 概述 本文用于介绍如何查看xilinx fpga GTX得位置信息&#xff08;如X0Y0在哪个BANK/Quad&#xff09;。 2 参考文档 《ug476_7Series_Transceivers》 《pg156-ultrascale-pcie-gen3-en-us-4.4》 3 查看方式 通过…...

JAVA小知识30:JAVA多线程篇1,认识多线程与线程安全问题以及解决方案。(万字解析)

来 多线程&#xff0c;一个学起来挺难但是实际应用不难的一个知识点&#xff0c;甚至在很多情况下都不需要考虑&#xff0c;最多就是写测试类的时候模拟一下并发&#xff0c;现在我们就来讲讲基础的多线程知识。 一、线程和进程、并发与并行 1.1、线程和进程 线程&am…...

Python数据分析案例47——笔记本电脑价格影响因素分析

案例背景 博主对电脑的价格和配置一直略有研究&#xff0c;正好最近也有笔记本电脑相关的数据&#xff0c;想着来做点分析吧&#xff0c;写成一个案例。基本上描述性统计&#xff0c;画图&#xff0c;分组聚合&#xff0c;机器学习&#xff0c;交叉验证&#xff0c;搜索超参数…...

【加密与解密】【09】GPG Client签名流程

什么是GPG客户端 GPG客户端是实现PGP加密协议的一套客户端程序&#xff0c;可用于加密或签名 下载GPG客户端 建议安装命令行工具&#xff0c;图形工具一般不具备完整功能 https://gnupg.org/download/index.html生成私钥 此时会要求你输入名称&#xff0c;邮箱&#xff0c…...

“2024软博会” 为软件企业提供集展示、交流、合作一站式平台

随着全球科技浪潮的涌动&#xff0c;软件行业正迎来前所未有的发展机遇&#xff0c;成为了全球新一轮竞争的“制高点”&#xff0c;以及未来经济发展的“增长点”。在当前互联网、大数据、云计算、人工智能、区块链等技术加速创新的背景下&#xff0c;数字经济已经渗透到经济社…...

【Zoom安全解析】深入Zoom的端到端加密机制

标题&#xff1a;【Zoom安全解析】深入Zoom的端到端加密机制 在远程工作和在线会议变得越来越普及的今天&#xff0c;视频会议平台的安全性成为了用户关注的焦点。Zoom作为全球领先的视频会议软件&#xff0c;其端到端加密&#xff08;E2EE&#xff09;功能保证了通话的安全性…...

7 动态规划

下面的例子不错&#xff1a; 对于动态规划&#xff0c;能学到不少东西&#xff1b; 你要清楚每一步都在做什么&#xff0c;划分细致就能够拆解清楚&#xff01; xk​​​​​​​. - 力扣&#xff08;LeetCode&#xff09; labuladong的算法笔记-动态规划-CSDN博客 动态规划是…...

.net 快速开发框架开源

DF.OpenAPI开源系统 前后端分离&#xff0c;开箱即用&#xff0c;java经典功能.net也具备 系统介绍 DF.OpenAPI是基于Admin.NET二开的&#xff0c;是一个开源的多租户后台管理系统。采用前后端分离技术&#xff08;前端使用vue.js&#xff0c;后端使用.net 3~.net6&#xff…...

《昇思25天学习打卡营第06天|网络构建》

网络构建 神经网络模型由神经网络层和Tensor操作构成 #实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.…...

【链表】- 两两交换链表中的节点

1. 对应力扣题目连接 两两交换链表中的节点 2. 实现案例代码 public class ExchangeLinkedListsPairwise {public static void main(String[] args) {// 示例链表&#xff1a;[1, 2, 3, 4]ListNode head new ListNode(1);head.next new ListNode(2);head.next.next new L…...

java设计模式(四)——抽象工厂模式

一、模式介绍 改善在工厂方法模式中,扩展时新增产品类、工厂类,导致项目中类巨多的场面,减少系统的维护成本,且一个工厂可以生成多种产品,而不是同一种的产品,比如一个工厂既可以生产鞋子又可以衣服,而不是只能生产鞋子。 二、工厂方法模式 1、实现步骤 第一步: 定义…...

动物检测yolo格式数据集(水牛 、大象 、犀牛 、斑马四类)

动物检测数据集 1、下载地址&#xff1a; https://download.csdn.net/download/qq_15060477/89512588?spm1001.2101.3001.9500 2、数据集介绍 本数据集含有四种动物可以检测&#xff0c;分别是水牛 、大象 、犀牛 、斑马四类&#xff0c;数据集格式为yolo格式&#xff0c;…...

昇思25天学习打卡营第05天 | 数据变换 Transforms

昇思25天学习打卡营第05天 | 数据变换 Transforms 文章目录 昇思25天学习打卡营第05天 | 数据变换 TransformsCommon TransformsCompose Vision TransformsText TransformPythonTokenizerLookup Lambda Transforms数据处理模式Pipeline模式Eager模式 总结打卡 通常情况下的原始…...

Springboot+MySQL 公寓报修管理系统源码

功能结构图 效果图&#xff1a;...

jenkins 发布服务到linux服务器

1.环境准备 1.1 需要一台已经部署了jenkins的服务器&#xff0c;上面已经集成好了&#xff0c;jdk、maven、nodejs、git等基础的服务。 1.2 需要安装插件 pusblish over ssh 1.3 准备一台额外的linux服务器&#xff0c;安装好jdk 2.流程描述 2.1 配置jenkins&#xff0c;包括p…...

Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。由于时间的关系&#xff0c;宏哥这里用代码给小伙伴演示两个模块&#xff1a;注册和登录。 2.业务模块封装 因为现在各种APP的层出不群&#xff0c;各式各样的。但是其大多数都有注册、登录。为…...

防止跨站脚本攻击XSS之Antisamy

目录 一、什么是跨站脚本攻击&#xff08;XSS&#xff09; 二、通常有哪些解决方案 三、常见的XSS攻击例子有哪些 3.1 存储型XSS攻击&#xff08;黑产恶意截流&#xff0c;跳转不法网站&#xff09; 3.2反射型XSS攻击&#xff1a; 四、什么是跨站请求伪造&#xff1f; 五…...

Python爬虫实战案例——王者荣耀皮肤抓取

大家好&#xff0c;我是你们的老朋友——南枫&#xff0c;今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩&#xff0c;直接上代码&#xff1a; 导入我们需要使用到的&#xff0c;也是唯一用到的库&#xff1a; 我们要抓取皮肤其…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...