【网络协议】开放式最短路径优先协议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配置之前,设计上方的网络并完成以下配置:
- 为所有设备配置适当的主机名
- 为控制台线路和Telnet线路配置适当的密码
- 设置横幅信息
- 禁用IP域名查找功能
- 为接口分配IP地址、子网掩码、默认网关,并在需要的接口上设置时钟速率
- 启用设备并确保直接连接的网络之间的连通性
- 完成基本的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子网掩码:
255.255.255.255
(广播地址) - 写下子网的掩码,例如
255.255.255.224
- 相减得到通配符掩码:
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 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...

嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)
基本概念之什么是驱动程序()? 驱动程序本质上是代码逻辑的集合,通常用于管理、驱动多个设备实例。某个设备要想使用驱动程序,需要实例化相应的驱动程序的结构体,并在系统中注册,获得主设备号、次设备号,并…...

爱死机第四季(秘密关卡)4KHDR国语字幕
通过网盘分享的文件: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插件提供的一种方法,用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例,展示如何在Vue I18n中定义消息: const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...

[C++刷题] 求回文素数
求回文素数 题目 素数回文数的个数 题目描述 求 11 11 11 到 n n n 之间(包括 n n n),既是素数又是回文数的整数有多少个。 输入格式 一个大于 11 11 11 小于 10000 10000 10000 的整数 n n n。 输出格式 11 11 11 到 n n n 之…...

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

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

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据
存储器模式:在HAL库中,I2C有专门对存储器外设设置的库函数 I2C(一):存储器模式的使用 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元旦源码免费送
我们常常在当下感到时间慢,觉得未来遥远,但一旦回头看,时间已经悄然流逝。对于未来,尽管如此,也应该保持一种从容的态度,相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…...

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

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

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

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

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的换代版本,从V2.1开始,框架更换至更现代的VSCode,并深度定制开发。在工程管理、代码编辑、编译、调试等方面均兼容之前版本&#…...

AWS re:Invent 2024 - Dr. Werner Vogels 主题演讲
今年,我有幸亲临现场参加了所有的 keynote,每一场都让我感受到深深的震撼。无论是全新的功能发布,还是令人眼前一亮的新特性展示,每一场 keynote 都精彩纷呈,充满干货,值得反复学习和回味。 恰好ÿ…...

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

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

如何利用云计算进行灾难恢复?
云计算环境下的灾难恢复实践指南 天有不测风云,企业的IT系统也一样,我见过太多因为没有做好灾备而吃大亏的案例。今天就和大家聊聊如何用云计算来做灾难恢复。 一个惊心动魄的真实案例:某电商平台的主数据中心因为市政施工不小心挖断了光纤…...

【华为OD-E卷 - 九宫格按键输入 100分(python、java、c++、js、c)】
【华为OD-E卷 - 九宫格按键输入 100分(python、java、c、js、c)】 题目 九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母…...

基于AI大模型的医院SOP优化:架构、实践与展望
一、引言 1.1 研究背景与意义 近年来,人工智能(AI)技术取得了迅猛发展,尤其是大模型的出现,为各个领域带来了革命性的变化。在医疗领域,AI 医疗大模型正逐渐崭露头角,展现出巨大的应用潜力。随着医疗数据的海量积累以及计算能力的大幅提升,AI 医疗大模型能够对复杂的…...

Linux快速入门-一道简单shell编程题目
编写一个 Shell 程序。 功能:在用户家目录下创建一个文件夹myshell;进入此文件夹;在文件中创建文件aa.sh,如果文件夹或文件存在,则提示对象已存在,不创建。 代码编写 #!/bin/bash#获取用户家目录:方便后…...

Hive如何创建自定义函数(UDF)?
目录 1 自定义UDF函数基础 2 自定义UDF函数案例 3 创建临时函数 4 创建永久函数 1 自定义UDF函数基础 1. 内置函数:Hive 自带了一些函数...

聊聊前端框架中的process.env,env的来源及优先级(next.js、vue-cli、vite)
在平时开发中,常常使用vue、react相关脚手架创建项目,在项目根目录可以创建.env、.env.[mode](mode为development、production、test)、.env.local等文件,然后在项目中就可以通过process.env来访问相关的环境变量了。 下面针对如下…...

linux shell脚本 【分支结构case...in 、循环结构、函数】内附练习
1.思维导图 2.练习 1.定义一个find函数,查找ubuntu和root的gid 2.定义一个数组,写一个函数完成对数组的冒泡排序 bubble() {n${#arr[*]}for((i0;i<n-1;i));dofor((j0;j<n-1-i;j));doif ((arr[j]>arr[j1]));thentemp${arr[j]}arr[j]${arr[j1]}a…...

VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”
VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”解决方案: 1.用get-ExecutionP…...

Android ActionBar 技术深度解析
Android ActionBar 技术深度解析 概述 ActionBar 是 Android 应用中的一个核心 UI 组件,用于提供导航、操作和品牌展示。它通常位于应用窗口的顶部,包含应用的标题、导航按钮、操作项等。ActionBar 自 Android 3.0(API 11)引入,并在 Android 5.0(API 21)后被 Toolbar …...

matlab-数字滤波器设计与实战
文章目录 数字滤波器设计FIR 滤波器设计IIR 滤波器设计巴特沃斯滤波器切比雪夫 I 型滤波器切比雪夫II型椭圆滤波器线性相位与非线性相位零相位响应数字滤波器实战数字滤波器产生延迟的主要原因补偿滤波引入的延迟补偿常量滤波器延迟补偿与频率有关的延迟从信号中除去不需要的频…...