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

网络安全之OSPF进阶

该文针对OSPF进行一个全面的认识。建议了解OSPF的基础后进行本文的一个阅读能较好理解本文。

OSPF基础的内容请查看:网络安全之动态路由OSPF基础-CSDN博客

OSPF中更新方式中的触发更新+30分钟的链路状态刷新。是因为其算法决定的,距离矢量型协议是边算边传,边传边算的方式,好处就是网络结构经常改变的话,不管怎么改变都能判断出最新的网络状态。不管触发更新多少次只学习最后学习的一次。OSPF是先传递后运算,需要把所有的LSA收集起来再计算,无法判断哪个是最新的哪个是旧的,链路状态型协议就有一个很大的问题新旧LSA比较,为了比较新旧LSA,OSPF就有一个直线型序列空间,序列号最大的最新,但有个问题,序列号空间是有限的,只有32bit。后面又有一个循环序列空间,循环使用序列号,但又无法判断新旧,故此又有了个循环序列空间+直线型序列空间,棒棒糖型序列空间,棒位直线型序列空间,糖为循环序列空间……但都不是永久的是暂时的,所以就有了30分钟的链路状态刷新。

OSPF为了适用于较大型网络中就要划分区域,划分区域都是为了减少LSA数量和减少LSA的传播区域。也就是OSPF的优化为了提高性能。真正的OSPF单个区域是链路状态型协议(要传拓扑信息),区域与区域之间就是距离矢量型协议(不传拓扑信息),不然也会出环。

OSPF是基于接口划分,也就是OSPF要工作,链路两端的接口必须在一个区域,所以也可以说是基于链路划分的。

其角色中骨干路由器、非骨干路由器很好理解,ABR区域边界路由器与ASBR自治系统边界路由器更准确的区分方式就是ABR是能够产生3类LSA的路由器,ASBR是能够产生5类或7类LSA的路由器。

在实际中设备选择ABR与ASBR设备的性能是最高的。其次是骨干路由器,接着才是非骨干路由器。

OSPF邻居状态机制与OSPF的状态数据包:

OSPF消息数据包:Hello打招呼的, DBD数据库的描述报文, LSR 链路状态请求,LSU链路状态更新, LSACK链路状态确认。

OSPF数据包是基于IP封装,传递不可靠,OSPF没有选择周期更新而是触发更新所以通过确认重传保证可靠性。

Hello包:

环境如下:

对R1进行抓包发现状态包都有了;

现在我们查看hello包。

Hello包的目的是建立并维持OSPF邻居关系(邻居关系建立之后充当保活包功能)。

Init:初始化状态,一旦开始发送hello报文,进入初始化状态。

two-way:双向通信状态(邻居状态),接收到包含自己router-id的对方hello报文。

邻居关系建立条件:

1.router-id必须不同。

2、area ID相同。

3、认证:认证类型(不认证=0 明文认证=1 MD5=2)认证数据。

4、hello时间,dead时间必须一致。

5、特殊区域标识一致(E(外部路由位)=1;N(NSSA外部路由位)=0;P=0).

6、MA网络中,网络掩码必须一致。

7、必须同时使用单播或组播更新。

8、更新源检测(双方的IP地址必须在同一网段)。

在AR1发送hello包后就进入Init初始化状态,AR2发现AR1发来的hello包含自己的router-id则进入two-way community双向通信状态(AR1同理)。

two-way状态下MA的网络进行选举DR(指定路由器)和BDR(备份指定路由器);

DR选举:1、比较优先级(范围0~255,默认优先级为1,越大越优)。2、比较各自的router-id,越大越优。(注意:1.DR抢占式关闭的。2、DR是一个接口概念。3、优先级范围0~255,数字0代表不参与选举。4、先选举BDR,再升级为DR)如上图中就可以看到BR是12.1.1.2,BDR是12.1.1.1。

exstart预启动状态:(邻居状态建立了,LSA还没有发送),在R1,R2正式发送LSA信息前会互相先发送一个LSA目录,只针对自己不知道的LSA进行请求(查重LSA信息)。发送的是BDB报文进行主从选举。一旦发送DBD就进入预启动。

exchange预交换:主从选举完成,发送LSA目录,发送LSR就进入exchange。

loading加载:学习LSA的状态,即发送LSU报文

接着就是LSACK包:

以上OSPF消息数据包一共有五个,hello,DBD,LSR,LSU,LSACK。

其中需要确认的除hello包都需要确认来保证可靠性,因为hello周期性发送保证了可靠性。DBD是使用DD序列号确认,LSR需要LSU将LSR请求的LSA名称信息发送回去确认,LSU需要LSACK将LSU包含的的LSA名称发送回去确认,LSACK使用隐式确认。

full邻接状态:自己判断,LSA同步,R1将R2的LSA全部学完,R2同理。怎么判断学完了,比如R1要学习R2LSA,在开始时R2给R1发送了一个LSA目录,R1从中查找自己没有的LSA生成一个请求列表为自己要学习的LSA,针对请求列表里的LSA进行LSR请求,R2中生成一个重传列表,将R1要学习的LSA放进重传列表,R2发送一个LSA给R1,R1收到了将其对应的LSA冲请求目录中删除,由隐式确认,R2收到ACK则从重传列表删除。R2请求R1LSA同理,都有一个重传列表和一个请求列表,当两张表清空时变为full状态。

由上可知链路状态一共有六种状态(以下状态是双向的):

1、init——初始化(一旦发送hello包进入该状态)

2、two-way community——双向通信状态(邻居)(收到对方的hello包中包含自己的router-id和activity number则进入该状态)

3、exstart——预启动(进入two-way后判断自己需不需要选举DR和BDR,不需要则立即发送DBD报文进入该状态,若需要则需要等待一个死亡计时器40S或120S,到时之后发送DBD进行主从选举)

4、exchange——预交换(主从选举完成立即进入该状态,并互相发送LSA目录,立即发送LSR接收对方的LSU)

5、loading——加载(一旦收到LSU就进入该状态)

6、full——邻接状态(请求列表和重传列表清空进入该状态)

扩展:

down状态:一般是看不到的,以前建立过邻居邻接状态,突然有个邻居建立条件不匹配则出现down。

卡在init状态在一个dead时间没有进入下一个状态会退到down状态。

卡在two-way状态有可能是在选DR和BDR的网络中一直没有选出DR就会持续卡在该状态。

卡在exstart状态是因为mtu不一致问题,一方mtu大一方小,则大的一方会进入exchange状态,而小的一方会一直在extart状态,所以,卡在exchange状态也是mtu问题导致的。

卡在loading状态是因为LSA无法同步,1、设备性能弱无法接收完LSA,会导致设备一直崩溃重启。2、弱性能设备上限制了LSA的学习数量,导致无法学习完LSA(这一个原因是更常见的原因)。

正常持续稳定的停留的状态为two-way和full。停留在two-way时是两个Dother与Dother之间会永远停留在该状态。

还有一个attempt尝试/过度状态只有在NBMA网络中可能出现,因为其不能主动建立连接,只有我们手动配置peer(不能主动建立OSPF邻居的网络中可能出现)。

———————————————————————————————————————————

OSPF router-id选举规则:1、手工指定最优先。2、选举所有逻辑中IP地址最大的。3、选举所有物理接口IP地址最大的。

华为中若以上三点不满足,则可以创建router-id为0.0.0.0:在使用逻辑或物理接口IP地址时,接口可以时关闭状态;若一台路由器启用了多个OSPF进程,不同进程可以使用相同的router-id(不推荐)。

思科中若以上三点不满足,则无法启用OSPF:在使用逻辑或物理接口时,接口必须双up,该接口可以不通告进入OSPF中:同一路由器上多个OSPF进程的router-id必须不同。

 OSPFv2——LSA:1、2、3、4、5、7类

环境如下(其中R2与R4的loop back接口宣告在area0中):

在R2与R4中查看OSPF邻居情况:

邻接建立成功,LSA完全同步,现在查看LSA种类。

怎么描述一条LSA:1、LSA类型。2、link-id链路标识符。3、ADVrouter 产生路由器

查看链路状态数据库表,但dis ospf 100 lsdb查看的是一个LSA的目录表并不是一个完整的。我们要看详细的表就需要分别去查看详细的LSA1、2、3、4、5、7,才能查看出完整的LSA。

以上link-id中有的是router-id,有的不是router-id。ADVRouter是产生该LSA是哪个路由器的router-id。这三个信息标识同一个LSA。如果另一个LSA的标识符与这三个不同就是不同LSA,相同则是同种LSA。

一类LSA:router-LSA。

功能:本路由器针对某个区域产生的路由信息和拓扑信息(因为OSPF是一个状态型路由协议),比如该拓扑中R1的所有都在area 1中,所以R1针对area 1中只产生一条LSA而这条LSA包含了R1在该区域的路由信息和拓扑信息,R2针对area 1区域产生一条LSA,在area 0中也产生一条一类LSA,但这两条一类LSA不一样,area1中是R2在area1中的路由信息与拓扑信息,area0中是R2在area0中的路由信息与拓扑信息,所以在area1中有两条一类LSA。所以在R1中查看链路状态数据库中R1与R2产生的一类LSA都只有1条。

在R2中查看链路状态数据库,则R2在area 1与area 0中都产生了一条一类LSA,所以R2一共产生了两条一类LSA。

传播范围:只在本区域内传输(终止于ABR)。

link-ID:产生者的router-id。

ADV router:产生者的router-id。

特性:在单个区域中分别产生一条一类LSA,若存在MA网络,1类LSA不完整,需要配合二类LSA生成路由信息以及拓扑信息。

一类LSA的详细信息:

在R2中查看一类LSA。

若要查看准确的一类LSA信息,则需要在dis ospf lsdb后跟上链路状态标识符(即link-id)。

一类LSA内容类型:

1、stubnet(末节网络)——路由信息

2、transnet(传输网络,仅限于MA网络)——拓扑信息

3、point-to-point——拓扑信息

4、virtual link(虚链路)——拓扑信息

综上,一类LSA的特性为在单个区域中分别产生一条一类LSA,若存在MA网络,1类LSA不完整,需要配合二类LSA生成路由信息以及拓扑信息。

二类LSA:network LSA,网络LSA。

功能:用于在MA网络中,描述本网络路由器的数量以及本MA网络的网络掩码。

传播范围:只能在本区域之内传输,终止于ABR。

link-id:DR接口的IP地址(只能由MA网络中的AR产生)。

ADV router:DR所在路由的router-id。

特性:只会出现在MA网络,用于补充一类LSA(1、MA网络的掩码。2、MA网络路由器的数量)。

若我们不知道这个网络拓扑图,只能登录R2设备,我们可以通过查看其收集到的一类LSA和二类LSA就可以知道这个网络拓扑。

上图中初步知道了R2为area 1与area 0的ABR和其对方的接口IP为MA网络类型,然后再查看12.1.1.1与23.1.1.2发现它们路由器的router-id为91.1.1.1与93.3.3.3网络掩码为255.255.255.0.

接着再查看91.1.1.1与93.3.3.3的链路状态数据库:

以上知道了91.1.1.1与93.3.3.3的环回路由信息,还知道了93.3.3.3还通过34.1.1.1这个接口连接到了其他路由器。接着就查看34.1.1.1。

发现到了area 0区域中还有个94.4.4.4的路由器,得知93.3.3.3这个路由器为骨干路由器接着继续查看94.4.4.4。

以上我们就通过在R2上查看一类LSA和二类LSA就发现了以下的一个路由结构:

但area1学不到area0和area2中的路由信息,area0和area2同理。学不到其他区域的路由信息,此时就需要三类LSA。

三类LSA:summary LSA 汇总LSA。

功能:用于在区域之间传递路由信息。

link-id:传递路由的网络号。

ADV router:(可能有多个)默认为所在区域ABR的router-id。

area1中的ADVroute为R2的route-id,area2为R4的router-id,area0中的ADVrouter进入area1中为R2的router-id,进入area2的为R4的router-id。

特性:在穿越不同区域时,由其他的ABR重新产生(ADV router是变化的!!!)

在R2上查看链路数据库就可以发现在area0中ADVrouter为link-id所在区域的ABR的router-id,以及其他区域的进入到另一个区域的ADV router为另一区域的路由的router-id,就如同该拓扑中area0和area1中的路由拓扑信息进入area1,则这些信息的ADVrouter在area1中就是R2的router-id。

在骨干区域中的路由器查看就可以发现其他区域进入该区域的路由拓扑信息的ADVrouter就是其他区域的ABR的router-id。

比如我们要在R2上具体查看12.1.1.0的三类LSA:

R3收到12.1.1.0这个网段时,开销值为R3到area1的ABR的开销值加上该ABR到这个网段的开销值,R4同理,但R5不是,因为跨区域了。

当R2针对area1中的路由传递到area0中没有任何问题,但当传给area2中时,要由area2的ABR要重新产生,即当路由传给R5时,R5只需找R4就行。即R5到12.1.1.0的开销值为R5到area2的ABR的开销值加上R4到R2再加上R2到12.1.1.0的开销值。因为area2区域中的路由器除了ABR知道92.2.2.2的存在,其余路由器都不知道,所以学习了跨区域的路由也不知道其ABR是谁,所以需要由不同区域的ABR产生新的ABR传给自己区域中的路由器进行学习该路由。

五类LSA:外部LSA。

功能:用于在整个OSPF中传递外部路由(原本不属于OSPF域)。

五类LSA有两种类型:类型1 类型2(区别:类型1开销值在OSPF中传播是增加的,类型2开销值传播时不变 )。

link-id:传递外部路由的网络号。

ADV router:产生该LSA的router-id(产生本LSA的router-id)。

传播范围:在整个OSPF域中传播。

如下,在R5下面又运行了一个RIP,RIP配置请查看RIP小实验配置及缺省路由下发-CSDN博客:

做完RIP还得在R5上将rip路由引入OSPF:

然后在R1上查看就可以查看到学习到了R6的路由:

能学习到这个路由是靠的五类LSA,是在R5上产生的。

查看R5上的链路数据库就发现多了类型为External的LSA,这就是五类LSA(外部LSA)。

查看五类LSA,里面有俩个路由信息,6.6.6.0和56.1.1.0的。我们再单独查看6.6.6.0的五类LSA路由信息。

其中不管在R1还是R4上查看这个五类LSA的开销值都为1。二类型的五类LSA在链路中传播时开销值不变,现在我们将五类LSA类型改为1并查看6.6.6.0,开销值不变,类型变为了类型1,开销值R4上查看变为了2,R3上变为了3,R2上变为了4,R1上变为了5。所以类型1的五类LSA,在整个OSPF中传播时,其开销值是增加的,默认值为1。这就是五类LSA类型1与类型2的区别。

其中的forwarding address为转发地址,正常的大部分的五类LSA为0.0.0.0。如果转发地址中有地址就需要注意了。

tag为路由标识,没有属性意义。

五类LSA在使用时会出现问题,如图中,五类LSA的ADVrouter为R5。当R5将这个LSA传给R4时,R4要找到6.6.6.0就要先找到R5,所以R4要计算到6.6.6.0的开销值就将R5到达6.6.6.0的开销值与自己到R5的开销值相加就行。当R3要查找6.6.6.0就要找到R5,但找不到R5,所以无法加表,R2,R1同理,都找不到95.5.5.5在哪,但是实际上又加表了,这就是靠的四类LSA。

四类LSA:summary ASBR LSA

功能:除了ASBR所在区域外,用于通告ASBR位置。

link-id:ASBR的router-id

ADV router:默认ASBR所在区域的ABR的router-id。

特点:在穿越不同区域时,由新的ABR重新产生。(与三类LSA一致)

例如在R4上查看四类LSA。

查看四类LSA,里面开销值为1,这个开销值由ABR到达ASBR的开销值决定。

R3要到6.6.6.0,就得找到R4,R2也得找到R4,而R1要到6.6.6.0得找到94.4.4.4,找不到R4,所以在跨区域时要由新的ABR重新产生,R2上就有两条LSA,一条学习的,一条自己产生的。

R1要到6.6.6.0就得先找95.5.5.5,找95.5.5.5就得先找到R2,R2再找到R5,开销值就是这三者之和再加R5到6.6.6.0的开销值。所以该拓扑中开销值为5

扩展:

———————————————————————————————————————————

某一个路由器网络不稳定,进行了几次的触发更新,每次更新都产生了LSA,其他路由器收到了好几条LSA,所以需要比较出谁是最新的。

LSA的新旧比较:

LSA中存在3个参数用于LSA的新旧比较;LSA age为3600秒的LSA都是最优的因为到时间就消失了,实际上在真实环境中真正消失的时间是3600零几秒。

1、序列号:

直线型序列空间——ISIS

循环型序列空间

棒棒糖型(直线型+循环性)迪杰斯特拉型序列空间

2、校验和:若是LSA序列号相同,就比较校验和,每次的age不一样,校验和就不一样,校验和越大越优。

3、LSA老化时间(若以上相同,LSA age之差小于15分钟,越小越优。若大于15分钟,则无法比较认为都是最新的):若序列号和校验和都一样则比较LSA老化时间。

———————————————————————————————————————————

因为七类LSA只在特殊区域中产生,所以关于七类LSA的演示在本文后面的特殊区域中会讲解。目前先提及以一下。

7类LSA : NSSA LSA

功能:在NSSA区域中,传递外部路由。

Link id :传递路由网络号

ADV router:产生该LSA的router-id

特性:默认为类型2 ,度量值为1 。携带了FA地址(转发地址)

FA: 转发地址,当5类或7类LSA中携带了FA地址,则计算路径开销值时计算的是 当前路由器到达FA地址的开销值之和+种子度量值。(若FA地址不可达,则路 由不能加表)

FA 地址: 1、默认7类LSA 产生FA地址,5类LSA不产生的(7转5 的5类LSA 携带FA地址) 2、7类LSA

产生规则:默认产生的FA地址为产生7类LSA 的ASBR 最大的环回接口地址;若连接其他协议的接口也运行了OSPF协议,网络类型为BMA,则产生 的7类LSA中FA地址为连接其他接口对应的下一跳地址;若网络类型为P2P,则 FA地址依然为环回接口中IP地址最大的 3.5类LSA FA地址规则:默认不产生,若连接其他协议的接口运行了OSPF 协议 并且网络类型为BMA,则FA地址为重发布之前路由的下一跳地址,若网络类型 为P2P,则不会产生FA地址。

OSPF中的计时器:

1、hello时间:默认为10秒或30秒,dead时间,默认为40秒或120秒。

修改hello时间,dead时间变化,修改dead时间,hello时间不变,hello时间或dead时间不同都会影响邻居关系建立。

2、waiting time:等到DR或BDR的选举时间,永远保持与dead时间一致。

修改hello时间并再次查看:可以发现修改hello时间,dead时间也会被自动的修改为hello的四倍时间。

再查看接口状态发现只有一个接口连接,另一个接口断开,因为hello时间dead时间不一致了。然后我们再次修改hello时间为10秒,另一个接口邻居关系也回来了。

修改dead时间:发现hello时间没有被影响,邻接关系也断开了。

综上,修改hello时间和dead时间都会影响邻接关系的建立,修改hello时间,dead时间会自动改为四倍hello时间,修改dead时间,hello时间不受影响。

在思科厂商的设备中里面还有个wait时间,这个wait时间不能修改,会永远随着dead时间变化(wait时间是等待DR,BDR的选举时间)dead时间是多少,wait时间就是多少。

其中的pull时间(轮询时间):当邻居关系进入down状态时,不能再去发送高速(hello时间10秒去发送)的hello包,而是采用pull时间去发送hello包建立邻居关系。

retransmit为重传时间:默认为5秒,在OSPF中发送数据包,需要进行确认没有收到确认时就重传,重传时间为5秒,重传到邻接关系断掉为止。重传时间也能修改:

transmit delay :传输延时,默认为1秒。比如,R2产生了一个LSA,刚产生LSA时有一个LSA age,R2就与其他路由器在一段时间内建立邻接关系,在给对方传递LSA时,这个LSA也有个age,比如为50秒,在传的时候,传递的LSA里面显示的就是50秒,也就是说,发出这个LSA那一时刻起这条LSA活了50秒,将这条LSA从链路数据库中提取出来放在接口传递给对方,对方接收再查看链到LSA时,如果还是50秒,这中间就有个时间差,所以OSPF所有接口都有一个传输延时。可以修改;

以上就是OSPF中常见的几个计时器。

OSPF网络类型:OSPF针对不同物理接口的特性,它的OSPF协议工作模式有所不同,导致了OSPF不同的接口有了不同的工作方式(有的可以自动建立邻居,有的不能自动建立邻居,有的靠组播,有的靠单播,有的DR建立邻居,有的BDR建立邻居等)。

loopback:在OSPF中,我们看不到一个接口网络类型为环回网络类型。我们将环回接口通告到了OSPF网络的某个区域中,OSPF识别到是环回接口,就以三十二位主机路由通告到路由协议中,这其实就是环回网络类型的体现。其他网络类型没有这样的东西。但是在华为的设备中我们是看不到的,在接口里面我们只配置了环回IP没有做任何东西,按理来说其默认网络类型为环回网络类型,在思科设备中我们查看接口网络类型为loopback,而在华为中显示为P2P类型。环回网络类型体现在几点上;1、Type(类型)为loopback。2、这个接口路由在向外传递时通告时是以三十二位主机路由的形式传递。3、环回网络类型是没有hello时间dead时间的(因为OSPF都识别到是环回接口,只有自己一个用户,不需要与其他路由建立邻居)。在华为中显示的为P2P形式,虽然是显示的P2P形式,但是环回网络特点是直接执行的,只是没有说而已,直观的就是学到的环回路由是以三十二位主机路由学习。环回接口的网络类型我们是不能把一个正常的接口网络类型修改为环回网络类型,思科中就算有环回网络类型也只能是环回接口成为环回网络类型。华为中没有loopback的命令。也就是说,一个正常接口网络类型除了不能修改为环回网络类型,其他的网络类型都能修改(思科中有,华为是没有环回网络类型)。

注意:loopback接口默认OSPF网络类型为P2P,但是生成路由的网络掩码默认为32位(还原真实网络掩码,思科中修改类型为P2P,华为中修改为BMA类型(改为broadcast类型)),并且cost为0(cost不会因为参考带宽或者接口带宽变化而变化)。

将接口网络类型修改为broadcast类型,后还原为真实的24位网络掩码。其传递的LSA也会改变。

如果我们在环回接口中要还原真实的网络掩码,就要都修改为broadcast类型,在华为中只能修改为broadcast类型。正常接口开销值为参考带宽除以真实带宽,华为环回接口开销值默认为0(与接口带宽与参考带宽没有任何关系,也就是不管去修改环回的接口带宽还是调整参考带宽环回默认cost值为1,这个默认cost值是可以修改的,但是不能去修改接口带宽或参考带宽去变化,而其他物理接口是可以的)。

1、P2P——点对点:

物理接口:HDLC(高级数据链路控制协议,默认为P2P) PPP(点对点协议) GRE MGRE FR点对点子接口

hello时间:10S

是否选举DR:不选举

是否自动建立邻居:自动建立

特性:无(因为只需要一类LSA)

2、BMA——广播多路访问网络:

物理接口:以太网(默认为BMA)。

hello时间:10S

是否选举DR:选举DR

是否自动建立邻居:是

特性:产生的一类LSA不完整,需要二类LSA补充

3、NBMA——非广播型多路访问网络:

物理接口:FR-帧中继(物理接口,多点子接口) ATM-异步传输网络 (思科中的MGRE)

hello时间:30S

是否选举DR:选举DR

是否自动建立邻居:否(建立邻居需要手工指定peer,思科中单边指定就可以,华为需要双方同时指定)

网络部署类型:1、full-mesh 2、part-mesh 3、hub-spoke

在hub-spoke网络中,若默认网络类型为NBMA:1手工指定peer。2、控制DR位置,不得出现BDR。3、spoke之间互相映射(PVC)

4、P2MP:

物理接口:无

hello时间:30S

是否选举DR:不选举

是否自动建立邻居:自动

特点:将物理接口IP地址以32位主机路由的形式传递进入OSPF。

5、V-link

……未完待续

相关文章:

网络安全之OSPF进阶

该文针对OSPF进行一个全面的认识。建议了解OSPF的基础后进行本文的一个阅读能较好理解本文。 OSPF基础的内容请查看:网络安全之动态路由OSPF基础-CSDN博客 OSPF中更新方式中的触发更新30分钟的链路状态刷新。是因为其算法决定的,距离矢量型协议是边算边…...

Ubuntu虚拟机上推荐一款免费好用的git版本管理工具

工具叫: gitg 软件界面如下: FR:徐海涛(hunkxu)...

python下载及安装

1、python下载地址: Python Releases for Windows | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/windows/ 2、python安装 (1) 直接点击下载后的可执行文件.exe (2&…...

visual studio2022 JNI极简开发流程

文章目录 1 创建java类2 生成JNI头文件3 使用visual studio2022创建DLL项目3.1 选择模板中(Windows桌面向导)3.2 为项目命名3.3 选择应用程序类型为动态链接库3.4 项目概览 4 导入需要的头文件4.1 导入需要的头文件4.2 修改头文件 5 编写C实现6 生成dll文…...

Linux 第三十章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...

Linux网络——自定义序列化与反序列化

前言 之前我们学习过socket之tcp通信,知道了使用tcp建立连接的一系列操作,并通过write与read函数能让客户端与服务端进行通信,但是tcp是面向字节流的,有可能我们write时只写入了部分数据,此时另一端就来read了&#x…...

大模型介绍

大模型通常指的是参数量超过亿级别,甚至千亿级别的深度学习模型。这类模型能够处理更加复杂的任务,并在各项基准测试中取得了优异的成绩。大模型在自然语言处理、计算机视觉、推荐系统等领域都取得了显著的成果。 大模型的主要优势在于其强大的表征能力&…...

【思维】根号分治

写在前面的话: 个人理解 根号分治本身就是一种卡着评测机过题的做法,所以非必要不要写 #define int long long !!! 本篇博客参考:暴力美学——浅谈根号分治 做到过两三题根号分治了,来总结一下…...

Linux线程(三)死锁与线程同步

目录 一、什么是死锁 死锁的四个必要条件 如何避免死锁 避免死锁算法 二、Linux线程同步 三 、条件变量 1、条件变量基本原理 2、条件变量的使用 3、条件变量使用示例 为什么 pthread_cond_wait 需要互斥量? 一、什么是死锁 死锁是计算机科学中的一个概念,…...

SpringAMQP 发布订阅-TopicExchange

根据这个模型编写代码: RabbitListener(bindings QueueBinding(value Queue(name "topic.queue1"),exchange Exchange(name "itcast.topic",type ExchangeTypes.TOPIC),key {"china.#"}))public void listenTopicQueue1(String msg){Syst…...

uniapp h5 配置代理服务器

"devServer": {"disableHostCheck": true,"proxy": {"/api": {// 需要被代理的后台地址"target": "http://自己的地址","changeOrigin": true,"secure": false,"pathRewrite": {&q…...

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移 在本文中,将介绍如何构建一个实时数据pipeline,从MySQL数据库读取数据,通过Kafka传输数据,最终将数据存储到HDFS中。我们将使用Apache Spark的结构化流处理和流处理功能&#…...

一篇文章拿下Redis 通用命令

文章目录 Redis数据结构介绍Redis 通用命令命令演示KEYSDELEXISTSEXPIRE RedisTemplate 中的通用命令 本篇文章介绍 Redis 的通用命令, 通用命令在 Redis 的所有数据类型下都使用, 学好通用命令可以让我们更好的使用 Redis. Redis数据结构介绍 Redis 是一个key-value的数据库&…...

锂电池充电充放电曲线分析

前言 锂电池的充电曲线通常包括三个阶段:恒流充电阶段、恒压充电阶段和滞后充电阶段。在恒流充电阶段,电流保持恒定,电压逐渐增加;在恒压充电阶段,电压保持恒定,电流逐渐减小;在滞后充电阶段,电流进一步减小,电池开始充满。通过监测这些阶段的电流和电压变化,可以评…...

vue3 第二十九节 (vue3 事件循环之nextTick)

引言 vue 项目中为什么要使用 nextTick 这个函数,是做什么用的,解决了哪些问题 1、nextTick 作用 用于处理DOM更新完成之后,执行回调函数的方法; 2、实现方案 vue2 中 nextTick() 是基于浏览器的 异步队列和微任务队列而执行…...

使用Flask-SocketIO构建实时Web应用

文章目录 准备工作编写代码编写HTML模板运行应用 随着互联网的发展,实时性成为了许多Web应用的重要需求之一。传统的HTTP协议虽然可以实现实时通信,但是其长轮询等机制效率低下,无法满足高并发、低延迟的需求。为了解决这一问题,诞…...

可重构柔性装配产线:为工业制造领域注入了新的活力

随着科技的飞速发展,智能制造正逐渐成为引领工业革新的重要力量。在这一浪潮中,可重构柔性装配产线以其独特的技术优势和创新理念,为工业制造领域注入了新的活力,开启了创新驱动的智能制造新篇章。 可重构柔性装配产线是基于富唯智…...

懒人网址导航源码v3.9

测试环境 宝塔Nginx -Tengine2.2.3的PHP5.6 MySQL5.6.44 为防止调试错误,建议使用测试环境运行的php与mysql版本 首先用phpMyAdmin导入数据库文件db/db.sql 如果导入不行,请直接复制数据库内容运行sql语句也可以 再修改config.php来进行数据库配置…...

springboot 开启缓存 @EnableCaching(使用redis)

添加依赖 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>application.yml 配置redis连参数 spring:# redis 配置redis:# 地址host: 127.0.0.…...

Adobe After Effects AE v24.3.0 解锁版 (视频合成及视频特效制作)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中&#xff0c;其实有很多站点&#xff0c;比如企业门户网站&#xff0c;产品手册&#xff0c;知识帮助手册等&#xff0c;因此会需要多个站点&#xff0c;甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...