OSPF链路状态数据库

原理概述

OSPF是一种基于链路状态的动态路由协议,每台OSPF路由器都会生成相关的LSA,并将这些LSA通告出去。路由器收到LSA后,会将它们存放在链路状态数据库LSDB中。

LSA有多种不同的类型,不同类型的LSA的功能和作用是不同的,下面介绍几种常见的LSA。

Type-1 LSA(Router LSA):每台路由器都会产生,用来描述路由器的直连链路状态和开销值。Type-1 LSA 只能在所属区域内部泛洪,不能泛洪到其他区域。

Type-2 LSA(Network LSA):它是由DR产生的,主要用来描述该DR所在网段的网络掩码以及该网段内有哪些路由器。Type-2 LSA只能在所属区域内部泛洪,不能泛洪到其他区域。

Type -3 LSA ( Network Summary LSA ):它是由 ABR ( Area Boundary Router )产生的, ABR 路由器将所连区域的 Type-1和 Type-2 LSA 转换为 Type-3 LSA ,用来描述区域间的路由信息。 Type-3 LSA 可以泛洪到整个 AS ( Autonomous System ,自治域)内部,但不能泛洪到 Totally Stub 区域和 Totally NSSA ( Not-So-Stubby Area )区域。

Type -4 LSA ( ASBR Summary LSA ):它是由 ASBR ( Autonomous System Boundary Router )所在区域的 ABR 产生的,用来描述到 ASBR 的路由。 Type -4 LSA 可以泛洪到整个 AS 内部,但不能泛洪到 Stub 区域、 Totally Stub 区域、 NSSA 区域和 Totally NSSA 区域中。

Type -5 LSA ( AS External LSA ):它是由 ASBR 产生的,用来描述到 AS 外部网络的路由。 Type -5 LSA 可以泛洪到整个 AS 内部,但不能泛洪到 Stub区域、 Totally Stub 区域、 NSSA 区域和 Totally NSSA 区域中

 Type-6 LSA :用于 OSPF 组播。

 Type-7 LSA ( NSSA LSA ):它是由 NSSA 区域或 Totally NSSA 区域的 NSSA ASBR 产生的,用来描述到 AS 外部的路由。 Type-7 LSA 只能出现在所属 NSSA 区域或 Totally NSSA 区域内部

实验目的

理解 OSPF 中不同类型的 LSA 的作用
熟悉 OSPF 中不同类型的 LSA 的泛洪范围
熟悉 LSA 中重要字段的含义 

实验内容

实验拓扑如图所示。本实验模拟了一个企业总部与两个分支机构的网络场景,R2、R3、R5之间的链路属于区域0,R1与R2之间的链路属于区域1,R3与R4之间的链路属于区域2,R1和R4的 Loopback 1接口用来表示以后有合作伙伴加入时的网络。区域1为普通区域,区域2为 NSSA 区域。在区域0中,R5为 DR ,R2为 BDR ,R3为 DRother 。实验过程中会大量地展示和分析链路状态数据库,以加深对不同类型 LSA 的认识和理解。 

实验拓扑 

 

1.基本配置

根据拓扑图进行相应的基本配置,并使用ping命令检测R1与R2之间的连通性。 

 其余直连网段的连通性测试过程在此省略。

2.配置OSPF路由协议

在每台路由器上配置OSPF路由协议,R1与R2之间的链路属于区域1,R3与R4之间的链路属于区域2,R2、R3、R5之间的链路属于区域0,区域2是NSSA区域。

[R1]router id 10.0.1.1

[R1]ospf 10
[R1-ospf-10]area 1
[R1-ospf-10-area-0.0.0.1]net 10.0.12.0 0.0.0.255
[R1-ospf-10-area-0.0.0.1]net 10.0.1.1 0.0.0.0

 

[R2]router id 10.0.2.2
[R2]ospf 10
[R2-ospf-10]area 1
[R2-ospf-10-area-0.0.0.1]net 10.0.12.0 0.0.0.255
[R2-ospf-10-area-0.0.0.1]net 10.0.2.2 0.0.0.0
[R2-ospf-10-area-0.0.0.1]area 0
[R2-ospf-10-area-0.0.0.0]net 10.0.235.0 0.0.0.255

 

[R3]router id 10.0.3.3
[R3]ospf 10
[R3-ospf-10]area 2
[R3-ospf-10-area-0.0.0.2]nssa
[R3-ospf-10-area-0.0.0.2]net 10.0.34.0 0.0.0.255
[R3-ospf-10-area-0.0.0.2]net 10.0.3.3 0.0.0.0
[R3-ospf-10-area-0.0.0.2]area 0
[R3-ospf-10-area-0.0.0.0]net 10.0.235.0 0.0.0.255

 

[R4]router id 10.0.4.4
[R4]ospf 10
[R4-ospf-10]area 2
[R4-ospf-10-area-0.0.0.2]nssa 
[R4-ospf-10-area-0.0.0.2]net 10.0.34.0 0.0.0.255
[R4-ospf-10-area-0.0.0.2]net 10.0.4.4 0.0.0.0

 

[R5]router id 10.0.5.5
[R5]ospf 10

[R5-ospf-10]area 0
[R5-ospf-10-area-0.0.0.0]net 10.0.235.0 0.0.0.255
[R5-ospf-10-area-0.0.0.0]net 10.0.5.5 0.0.0.0

配置完成后,在R2、R5的G0/0/0接口上修改接口优先级的值,使R5成为DR,R2成为BDR。 

[R2-ospf-10]int g0/0/0
[R2-GigabitEthernet0/0/0]ospf dr-priority 50

[R5]int g0/0/0
[R5-GigabitEthernet0/0/0]ospf dr-priority 100 

在R2、R3、R5上重启OSPF进程,下面仅示意了R5的重启方法。

<R5>reset ospf process
Warning: The OSPF process will be reset. Continue? [Y/N]:y 

在R3上查看DR与BDR的选举情况。

 

可以看到,在R1、R3、R5组成的广播网络中,目前R5是DR,R2是BDR。接下来查看每台路由器上的路由表。

 

可以看到,每台路由器都已获得了非直连网络的路由条目。接下来使用ping命令检测连通性 。

 

可以看到,各个网段之间的通信是正常的。 

区域1是普通区域,区域2是NSSA区域,区域1的R1和区域2的R4都需要引入Loopback1接口所连接的外部网络路由。在R1和R4上使用Route-Policy精确匹配Loopback1接口的直连路由并引入OSPF进程。

[R1]acl 2000
[R1-acl-basic-2000]rule permit source 192.168.1.0 0.0.0.255
[R1-acl-basic-2000]route-policy 10 permit node 1
[R1-route-policy]if-match acl 2000
[R1-route-policy]ospf 10
[R1-ospf-10]import-route direct route-policy 10

 

[R4]acl 2000
[R4-acl-basic-2000]rule permit source 172.16.1.0 0.0.0.255
[R4-acl-basic-2000]route-policy 10 permit node 1
[R4-route-policy]if-match acl 2000
[R4-route-policy]ospf 10
[R4-ospf-10]import-route direct route-policy 10

 配置完成后,在R5上查看由R1和R4引入的两条路由。

可以看到,在R5的路由表中,这两条路由都显示为O_ASE,且优先级与开销也都相同,不同之处是这两条路由的下一跳,因为它们是由不同的路由器发送给R5的。

3.查看Type-1 LSA, Type-2 LSA,Type-3 LSA

在区域0的R5上查看LSDB

可以看到,R5的 LSDB 中共有5种 LSA ,它们分别是 Router LSA (或称 Type-1 LSA )、 Network LSA (或称 Type-2 LSA )、Sum-Net LSA (或称 Type-3 LSA , Network Summary LSA )、 Sum- Asbr LSA (或称 Type-4 LSA , ASBR Summary LSA )和 External LSA (或称 Type-5 LSA , AS External LSA )。 

在R5上查看 Router-ID 为10.0.2.2产生的 Router LSA 的详细信息。

 下面解释一下显示信息中的部分参数的含义。
 ①Type :显示信息中, Type 表示了 LSA 的类型,这里表示的是 Router LSA 。不同类型的 LSA 的作用和泛洪范围是不相同的。 Router LSA 描述了路由器的直连链路或接口,泛洪范围为所在区域的内部,以使本区域的其他路由器了解其直连链路或接口的状态信息。
 ②Ls id :对于 Router LSA , Ls id 就是产生该 Router LSA 的路由器的 Router-ID 。
 Adv rtr : Adv rtr 描述了 LSA 是由哪台路由器产生的。对于 Router LSA 来讲, Adv rtr 就是产生该 Router LSA 的路由器的 Router-ID 。
 ④Seq #:每一条 LSA 都会维护一个 Seq #(序列号),产生这条 LSA 的路由器默认会以30s的周期泛洪这条 LSA ,每次泛洪时,序列号就加1LSA 的序列号越大,表明这条 LSA 越新。
 ⑤Chksum : chksum (校验和)用来校验 LSA 的完整性。所有的 LSA 都保存在路由器的 LSDB 中,每5min会计算一次。如果路由器收到了同一条 LSA ,且序列号相同,则会比较它们的校验和,校验和越大就被认为相应的 LSA 越新
 Ls age : Ls age 是指 LSA 的老化时间,用来表示 LSA 已经存活了多长时间,最大值为3600s。当一台路由器产生一条 LSA 的时候,路由器会将 LSA 的老化时间设置为0。 LSA 在产生之后,无论是停留在路由器的 LSDB 内,还是在传递过程之中,老化时间都会不断增加。为了防止因 LSA 的过期而造成路由回馈,路由器会每隔30min泛洪自己产生的 LSA 。若序列号与校验和的比较都不能确定出最新的 LSA 时,则会比较老化时间。在 LSDB 中,如果老化时间相差大于15min以上,则 Ls age 的值越小,说明 LSA 越新;如果相差在15min内,则认为两条 LSA 是一样的

在上面的显示信息中, Link count 以上的参数信息通常被称为 LSA 头部信息 Link count 及以下部分为具体的链路描述信息。 Link count 标识了这条 LSA 描述的链路信息的数量,对于 P-2-P 链路类型, Link ID 是指链路上邻居接口的 IP 地址;对于 TransNet 链路类型, Link ID 是指 DR 接口的 IP 地址。 Data 是指自身接口的 IP 地址, Link Type 是指接口的链路类型, Metric 是指路由器自己到达这条链路的 Cost 值。需要说明的是, OSPF 协议会把 Broadcast 和 NBMA 这两种具有多路访问能力的网络都认为是 TransNet 网络。

从上得知,R2的 Router LSA 描述了自己连接到了某个 TransNet 网络,网络的 DR 接口的 IP 地址为10.0.235.5(R5),自己使用10.0.235.2连接到该网络中,且到达这个网络的 Cost 值为1

Network LSA 是由 DR 产生的,它的主要作用是描述 TransNet 网络的掩码信息和连接到 TransNet 网络的路由器的信息。在多路访问网络中,每台路由器都产生 Network LSA 是没有必要的,因为这会导致 Network LSA 的重复。
R5是 TransNet 网络的 DR ,在R5上查看它产生和发送的 Network LSA 的详细信息。 

可以看到,这条 Network LSA 说明了 TransNet 网络的掩码为255.255.255.0,连接到这个 TransNet 网络的路由器有10.0.5.5(R5)、10.0.2.2(R2)、10.0.3.3(R3)。 Network LSA 中没有携带路径的开销,原因是 Router LSA 已经描述了自己到 TransNet 网络的 Cost 值。

在R2、R3、R5上查看区域0的 LSDB 。

 

可以发现,R2、R3、R5的 LSDB 中区域0的 Router LSA 和 Network LSA 是完全一样的。

Router LSA 和 Network LSA 可以完全描述本区域的网络拓扑,但这些 LSA 不能泛洪到其他区域。当 OSPF 网络包含多个区域时,通过 Router LSA 和 Network LSA 就无法进行区域间路由的计算了。区域间路由的计算需要利用 Sum-Net LSA 来实现, ABR 路由器会将自己相连区域的 Router LSA 和 Network LSA 转换为 Sum-Net LSA ,然后泛洪到其他区域。

R2同时连接了区域0和区域1,所以是一台 ABR 路由器。查看R2的 LSDB 。

可以看到,R2的区域0中有一条 LinkState ID 为10.0.12.0的 Sum-Net LSA ,它的 AdvRouter 为10.0.2.2。网段10.0.12.0/24本是属于区域1的网络,现在被 ABR 路由器R2转换为 Sum-Net LSA 并泛洪到了区域0中。10.0.235.0/24本是属于区域0的网络,现在被 ABR 路由器R2转换为 Sum- Net LSA 并泛洪到了区域1中。实际上, Sum-Net LSA 是 ABR 利用自己相连区域的 Router-LSA 和 Network-LSA 来计算得到的路由信息的。

在R2上查看 LinkState ID 为10.0.12.0的这条 Sum-Net LSA 的详细信息。

可以看到,这条 LSA 的 Type 为 Sum-Net , Ls id 表明了目的网络地址为10.0.12.0,Net mask 表明了目的网络的掩码为255.255.255.0, Metric 表明了 ABR 路由器R2去往目的网络的 Cost 值为1。

在R5上查看 LSDB ,并查看路由表中关于10.0.12.0/24的路由信息。 

可以看到, R5 的 LSDB 中存在10.0.12.0这条 Sum-Net LSA ,R5的路由表中关于10.0.12.0/24的这条路由信息表明R5去往10.0.12.0/24Cost 为2。R5通过这条 Sum-Net LSA 得知网络中存在10.0.12.0/24网段,这个网段的 AdvRouter 为10.0.2.2(R2),R2自已到达10.0.12.0/24 Cost 为1。R5和R2同属于区域0,所以R5可以通过 Router LSA 和 Nerwork LSA 计算出自己到R2Cost 为1,因此,R5可以计算出自己到10.0.12.0/24 Cost 值为1+1=2。

区域间的路由是根据 Sum-Net LSA 并结合 Router LSA 及 Network-LSA 计算出来的。对于某个区域的一台 OSPF 路由器来说,它无需了解其他区域的链路状态信息,但可以通过 Sum-Net LSA 并结合 Router LSA 及 Network-LSA 计算出区域间路由;计算区域间路由时,采用的不再是链路状态算法,而是距离矢量算法。 

在R2上查看 LinkStateID 为10.0.34.0/24这条 LSA 的信息。 

可以看到,10.0.34.0/24是属于区域2的网络, ABR 路由器R3将关于10.0.34.0/24的路由信息以 Sum-Net LSA 的方式通告进了区域0, Cost 为1。然后, ABR 路由器R2又继续将此信息以 Sum- Net LSA 的方式通告进了区域0。
对于 ABR 来说,如果在自己相连的某个区域的 LSDB 中存在某条 Sum-Net LSA ,并且该 Sum-Net LSA 的 AdvRouter 不是自己的 Router-ID 时,就会将这条 Sum-Net LSA 的 AdvRouter 修改为自己的 Router-ID ,并重新计算自己到达这条 Sum-Net LSA 的 Cost 值,然后将之泛洪到与自己相连的其他区域中。

4.查看 Type-4 LSA 和 Type-5 LSA 

路由器可以通过 Router LSA 和 Network LSA 计算区域内的路由,可以通过 Sum-Net LSA 并结合 Router LSA 和 Network LSA 计算区域间的路由,可以通过 Sum-Asbr LSA 和 External LSA 计算 AS 外部的路由

R1的 Loopback 1是外部路由,被 ASBR 路由器R1引入到了 OSPF 网络中。查看R1的 LSDB 。

 可以看到,R1的 LSDB 中存在一条 Type 为 External , LinkState ID 为192.168.1.0,
 AdvRouter 为10.0.1.1的 LSA 。在R1上查看这条 LSA 的具体信息。

可以看到,这条 LSA 的 Type 是 External , AdvRouter 为10.0.1.1(R1),这条 LSA 实际上是一条目的网络为192.168.1.0/24的 AS 外部路由,显示信息中的 E Type ( External Type )的值为2
 External LSA 可以在整个 AS 内部泛洪(但不能泛洪到 Stub 区域、 Totally Stub 区域、 NSSA 区域和 Totally NSSA 区域中),在泛洪过程中其各个参数不会被改变。

查看R2、R3、R4、R5的 LSDB 中是否也存在这条 LSA 。

 

 

从上面的显示信息可以看到,R2、R3、R5的 LSDB 中都存在这条 External LSA ,而且 AdvRouter (10.0.1.1)等参数信息没有任何变化。需要注意的是,R4的 LSDB 中没有这条 External LSA ,这是因为R4处于 NSSA 区域中而 External LSA 是不允许进入 NSSA 区域的

R5通过 Link id 为192.168.1.0的 External LSA 得知,从自己去往192.168.1.0/24是可以通过10.0.1.1(R1)到达的,并且知道从R1去往192.168.1.0/24的 Cost 为1。然而,R5并不知道从自己去往 ASBR 路由器R1的路由及 Cost ,所以R5还无法计算出从自己到达外部网络192.168.1.0/24的路由及 Cost 。在 OSPF 协议中, Sum - Asbr LSA 是用来描述去往 ASBR 的路由信息的
查看R5的 LSDB 中 LinkState ID 为10.0.1.1的 Sum- Asbr LSA 的具体信息。 

可以看到,这条 Sum - Asbr LSA 的 AdvRouter 是 ABR 路由器R2(10.0.2.2),并且表明了从 ABR 路由器R2到 ASBR 路由器R1(10.0.1.1)的 Cost 值为1。

在R5上使用 display ospf abr-asbr 命令查看到达 ABR 和 ASBR 的 Cost 值。 

可以看到,从R5到达 ABR 路由器R2的 Cost 值为1,从R5到达 ASBR 路由器R1的 Cost 值为2。由此可见,R5其实是通过 Router LSA 和 Network LSA 先计算出到达 ABR 路由器R2的 Cost 值,然后加上 Sum-Asbr LSA 所表示的从 ABR 路由器R2到达 ASBR 路由器 RI 的 Cost 值,最终得出从自己到达 ASBR 路由器R1的 Cost 值。 

Sum-Net LSA 和 Sum-Asbr LSA 的相同点是它们都由 ABR 产生,并且其 AdvRouter 在泛洪过程中会作相应的改变,不同点在于 Sum-Net LSA 是用来计算区域间的路由的,而 Sum-Asbr LSA 是用来计算到达 ASBR 的路由的。如果网络中不存在 ASBR ,那就不会产生 Sum- Asbr LSA ,这也说明有 External LSA 存在时,才会有 Sum- Asbr LSA
 

在 RI 上使用 undo import-route 取消路由的引入。 

[R1]ospf 10
[R1-ospf-10]undo import-route direct

在R5上查看 LSDB 。 

可以看到, LinkStateID 为192.168.1.0的 External LSA 消失了, LinkState ID 为10.0.1.1的 Sum- Asbr LSA 也随之消失了。

5.查看Type-7 LSA

NSSA 区域是不允许 External LSA 存在的,但 NSSA 区域允许通过 import - route 命令引入外部路由,那么如何来描述在 NSSA 区域中的 AS 外部路由呢? NSSA 区域引入的外部路由不能以 External LSA 的形式出现,取而代之的是使用 NSSA LSA 来描述 NSSA 区域中的 AS 外部路由,且 NSSA LSA 只能出现在 NSSA 区域中。 NSSA LSA 由 NSSA 区域的 NSSA ASBR 产生。

R4为 NSSA 区域的 ASBR ,查看R4的 LSDB 。

可以看到,R4为外部路由172.16.1.0产生了相应的 NSSA LSA 。

在R4上查看这条LSA 的详细信息。

可以注意到, NSSA LSA 的参数信息基本上和 External LSA 相同。
NSSA  LSA是特殊类型的 LSA ,只会出现在 NSSA 区域中,不能泛洪到其他任何区域,那么其他区域的路由器又是如何计算去往 NSSA LSA 所表示的外部网络的路由呢?原来, NSSA 区域的 ABR 会将 NSSA LSA 转换为 External LSA ,并泛洪到其他区域。
R3为 NSSA 区域的 ABR 路由器,在R3上查看 LSDB 信息。

可以看到,由10.0.4.4产生的 NSSA LSA 被R3转换成了 External LSA ,并泛洪到其他区域。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/610529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LearnOpenGL(十一)之光源

一、投光物 将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 二、平行光 当一个光源处于很远的地方时&#xff0c;来自光源的每条光线就会近似于互相平行&#xff0c;我们可以称这些光为平行光。当我们使用一个假设光源处于无限远处的模型时&#xff0c;它就被称为定向…

django显示网页步骤

显示网页步骤 小白的django学习笔记 2024/5/6 8:30 文章目录 显示网页步骤创建输入框&#xff08;文本、单选、多选&#xff09;效果如何在django中显示网页写函数配置地址运行&#xff0c;要选择这个工程名的&#xff0c;使用socket复制ip&#xff0c;后面在加上名字,成功&…

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说&#xff0c;一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…

react+antd --- 日期选择器,动态生成日期表格表头

先看一下效果---有当前月的日期 技术: 1: react 2:antd-UI库 -- table 3:moment--时间处理库 代码效果: import { Button, DatePicker, Table } from antd; import { useEffect, useState } from react; import moment from moment;function Club() {const [selecte…

Vue3自定义封装音频播放组件(带拖拽进度条)

Vue3自定义封装音频播放组件&#xff08;带拖拽进度条&#xff09; 描述 该款自定义组件可作为音频、视频播放的进度条&#xff0c;用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。 实现效果 具体效果可以根据自定义内容进行位置调整 项目需求 有播放暂停…

特征融合篇 | YOLOv8改进之利用ASF-YOLO重构特征融合层 | 助力小目标检测

前言:Hello大家好,我是小哥谈。ASF-YOLO是一个目标检测模型,它基于YOLOv3算法,并引入了ASF(Anchor-Free Spatial Attention)模块。ASF模块可以自适应地学习特征图上每个位置的不同感受野,提高了模型对于小目标的检测能力。相比于YOLOv3,ASF-YOLO在保持准确率的同时大大…

3d里如何做螺旋状模型?---模大狮模型网

螺旋状模型在3D设计中常常被运用&#xff0c;不仅可以用于创造独特的装饰品和艺术品&#xff0c;还可以用于建筑设计、工程模拟等领域。然而&#xff0c;对于初学者而言&#xff0c;如何在3D软件中创建螺旋状模型可能是一个挑战。在本文中&#xff0c;我们将分享几种简单而有效…

Linux diff命令(比较两个文件或目录的内容差异)

文章目录 Linux diff 命令详解教程基本用法比较文件输出解释 递归比较&#xff08;-r&#xff09;示例代码 控制输出格式统一格式&#xff08;-u&#xff09;上下文格式&#xff08;-c&#xff09; 高级选项忽略所有空白差异&#xff08;-w&#xff09;仅报告文件是否不同 Linu…

【Web】CTFSHOW 单身杯 题解

目录 web签到 easyPHP 姻缘测试 web签到 用data协议包含php标签闭合 payload: filedata://text/plain,<?php system($_GET[1]);?>>?;)]1[TEG_$(metsys php?<,nialp/txet//:atadeasyPHP 一眼awk命令执行 payload: cmdawk&param{system("ta…

MySQL数据库连接 提示错误 10060

错误现象 Cant connect to server on (10060) 有3个原因&#xff1a; 1、防火墙没有关闭 &#xff08;注意如果配置开放了3306端口&#xff0c;则不可以关闭防火墙&#xff0c;需删除规则以后才能关闭&#xff09; 关闭防火墙&#xff08;1次&#xff09;systemctl stop fir…

数据结构_顺序表中基本操作的实现_代码

学习笔记&#xff0c;仅供参考 1.头文件 2.初始化 3.增加值 4.根据下标取值 5.查找 6.插入 7.删除 8.动态增加数组的长度 9.所有代码 10.运行结果 1.头文件 //顺序表的实现——动态分配 #include<stdio.h> #include<stdlib.h> #define InitSize 10 type…

Arduino-点亮TFT触摸屏一

Arduino-点亮TFT触摸屏一 1.概述 这篇文章主要介绍Arduino操作TFT触摸屏入门操作&#xff0c;通过SPI通信协议方式点亮TFT触摸屏。 2.硬件电路 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻5面包板1杜邦线…

ICode国际青少年编程竞赛- Python-3级训练场-if语句入门

ICode国际青少年编程竞赛- Python-3级训练场-if语句入门 1、 for i in range(5):Spaceship.step(i 1)Spaceship.turnRight()if i 1:Dev.step(1)Dev.step(-1)2、 for i in range(4):Dev.step(2)if i ! 1:Dev.turnLeft()Dev.step(3)Dev.step(-3)Dev.turnRight()3、 for i…

springboot3项目练习详细步骤(第三部分:文章管理模块)

目录 发布文章 接口文档 业务实现 自定义参数校验 项目参数要求 实现思路 实现步骤 文章列表(条件分页) 接口文档 业务实现 mapper映射 更新文章 接口文档 业务实现 获取文章详情 接口文档 业务实现 删除文章 接口文档 业务实现 文章管理业务表结构…

OpenHarmony实战开发——WLAN驱动框架介绍及适配方法

1. WLAN 驱动框架概述 WLAN 是基于 HDF(Hardware Driver Foundation)驱动框架开发的模块&#xff0c;该模块可实现跨操作系统迁移、自适应器件差异、模块化拼装编译等功能。从而降低 WLAN 驱动开发的难度&#xff0c;减少 WLAN 驱动移植和开发的工作量。 本文主要分析 WLAN 驱…

gif压缩大小但不改变画质怎么做?分享5个压缩GIF原理~

GIF&#xff08;图形互换格式&#xff09;是网络上广泛使用的一种图像格式&#xff0c;因其支持动画而备受欢迎。然而&#xff0c;随着动画越来越复杂和高分辨率&#xff0c;GIF 文件大小也随之增加&#xff0c;可能导致加载速度变慢和带宽消耗增加。在这篇文章中&#xff0c;我…

easypoi动态表头导出数据

需求&#xff1a;动态导出某年某月用户和用户评分数据信息&#xff0c;表头(序号、姓名、用户姓名)&#xff0c;数据(所有用户对应的评分以及平均分)&#xff1b; 分析&#xff1a;1、表头除过序号、姓名&#xff0c;用户姓名要动态生成&#xff1b; 2、用户评分信息要和表头中…

Nginx+GateWay

目录 Nginx nginx如何配置负载均衡 负载均衡有哪些策略 1、轮询&#xff08;默认&#xff09; 2、指定权重 3、ip_hash&#xff08;客户端ip绑定&#xff09; 4、least_conn&#xff08;最少连接&#xff09; 5、fair 6、url_hash Nginx为什么效率高 gateway 使用gat…

Lobe Chat–在线AI对话聊天机器人,一键部署,免费开源

Lobe Chat 现代化设计的开源 ChatGPT/LLMs 聊天应用与开发框架 支持语音合成、多模态、可扩展的&#xff08;function call&#xff09;插件系统 一键免费拥有你自己的 ChatGPT/Gemini/Claude/Ollama 应用 项目演示 支持多种模型接口 支持语音输入输出 支持云端同步 丰富多彩非…

1013: 哈希表(开放定址法处理冲突)

解法&#xff1a; 线性探测是一种解决哈希冲突的方法&#xff0c;当发生哈希冲突时&#xff0c;它会依次往后查找空的槽位&#xff0c;直到找到一个空的槽位或者达到数组的末尾。 下面是处理哈希冲突的线性探测的步骤&#xff1a; 创建一个哈希表&#xff0c;里面包含一定数量的…
最新文章