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

BGP路由反射器

原理概述
缺省情况下,路由器从它的一个 IBGP对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体,这个原则称为BGP水平分割原则,该原则的根本作用是防止 AS内部的BGP路由环路。因此,在AS内部,一般需要每台路由器都运行 BGP协议并建立全互联的IBGP对等体关系,这样才能避免BGP路由黑洞等问题。对于有n个BGP路由器的AS来说,全互联的IBGP对等体关系将有n×(n-1)÷2个。对于大型AS来说,数量众多的IBGP对等体关系将导致配置和维护的工作量都非常大,且人为出错的可能性也随之增加。
解决上述问题的方法之一就是使用BGP路由反射器。BGP路由反射器的使用,可以在很大程度上减少大型AS中 IBGP对等体关系的数量并简化相应的配置和维护工作。BGP路由反射器是AS内部 IBGP网络环境中的一种特殊角色,其他的角色还有反射器的客户端和非客户端。一个反射器和它所有的客户端一起被统称为一个Cluster;客户端与它的反射器建立的是IBGP对等体关系;客户端之间无需建立IBGP对等体关系;非客户端和反射器建立的是IBGP对等体关系;非客户端之间需要建立全互连的IBGP对等体关系;非客户端和客户端之间无需建立IBGP对等体关系;一个AS内部可以有多个Cluster;一个Cluster中可以有多台反射器。另外,EBGP对等体之间是不存在 BGP路由反射器的概念的。
BGP路由反射器在反射路由的时候遵循的原则是:从一个非客户端那里接收到的路由,反射器会将它只传递给所有的客户端;从一个客户端那里接收到的路由,反射器会将它传递给所有其他的客户端以及所有的非客户端;从EBGP对等体那里接收到的路由,反射器会将它传递给所有的客户端和非客户端。


实验目的
理解 BGP路由反射器的应用场景·理解 BGP路由反射器的工作原理

掌握BGP路由反射器的基本配置方法实验内容

本实验网络包含了两个AS,两个Cluster。R1、R2、R3属于Cluster 1,R4、R5、R6属于Cluster 2,R7不属于任何Cluster。在AS 100内部,所有路由器都运行OSPF协议作为IGP,并将各自的Loopback 0接口宣告进OSPF进程中,使得各路由器可以使用Loopback 0接口来建立全互联的IBGP对等体关系。然后,为了减少配置工作量,决定使用路由反射器,要求是:在 Cluster 1中,R1为路由反射器,R2和R3为其客户端;在Cluster 2中,R4为路由反射器,R5、R6为其客户端;R7为非客户端;R1与R8为 EBGP对等体关系。

 

1、基础配置
R1:
sys
sysname R1
int loop 0
ip add 10.0.1.1 32
int g0/0/1
ip add 10.0.12.1 24
int g0/0/2
ip add 10.0.13.1 24
int g0/0/3
ip add 10.0.18.1 24
int g0/0/0
ip add 10.0.14.1 24
q
bgp 100
router-id 10.0.1.1
peer 10.0.2.2 as-number 100
peer 10.0.2.2 connect-interface LoopBack 0
peer 10.0.2.2 next-hop-local
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack 0
peer 10.0.3.3 next-hop-local
peer 10.0.4.4 as-number 100
peer 10.0.4.4 connect-interface LoopBack 0
peer 10.0.4.4 next-hop-local
peer 10.0.5.5 as-number 100
peer 10.0.5.5 connect-interface LoopBack 0
peer 10.0.5.5 next-hop-local
peer 10.0.6.6 as-number 100
peer 10.0.6.6 connect-interface LoopBack 0
peer 10.0.6.6 next-hop-local
peer 10.0.7.7 as-number 100
peer 10.0.7.7 connect-interface LoopBack 0
peer 10.0.7.7 next-hop-local
network  10.0.1.1 32peer 10.0.18.8 as-number 200
ospf 1 router-id 10.0.1.1area 0.0.0.0network 10.0.1.1 0.0.0.0network 10.0.12.0 0.0.0.255network 10.0.13.0 0.0.0.255network 10.0.14.0 0.0.0.255R2:
sys
sysname R2
int loop 0
ip add 10.0.2.2 32
int loop 1
ip add 10.0.22.22 32
int g0/0/1
ip add 10.0.12.2 24
q
bgp 100
router-id 10.0.2.2
peer 10.0.1.1 as-number 100
peer 10.0.1.1 connect-interface LoopBack 0
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack 0
peer 10.0.4.4 as-number 100
peer 10.0.4.4 connect-interface LoopBack 0
peer 10.0.5.5 as-number 100
peer 10.0.5.5 connect-interface LoopBack 0
peer 10.0.6.6 as-number 100
peer 10.0.6.6 connect-interface LoopBack 0
peer 10.0.7.7 as-number 100
peer 10.0.7.7 connect-interface LoopBack 0
network 10.0.2.2  32
ospf 1 router-id 10.0.2.2area 0.0.0.0network 10.0.2.2 0.0.0.0network 10.0.12.0 0.0.0.255R3:
sys
sysname R3
int loop 0
ip add 10.0.3.3 32
int g0/0/2
ip add 10.0.13.3 24
q
bgp 100
router-id 10.0.3.3
peer 10.0.1.1 as-number 100
peer 10.0.1.1 connect-interface LoopBack 0
peer 10.0.2.2 as-number 100
peer 10.0.2.2 connect-interface LoopBack 0
peer 10.0.4.4 as-number 100
peer 10.0.4.4 connect-interface LoopBack 0
peer 10.0.5.5 as-number 100
peer 10.0.5.5 connect-interface LoopBack 0
peer 10.0.6.6 as-number 100
peer 10.0.6.6 connect-interface LoopBack 0
peer 10.0.7.7 as-number 100
peer 10.0.7.7 connect-interface LoopBack 0
network 10.0.3.3 32
ospf 1 router-id 10.0.3.3area 0.0.0.0network 10.0.3.3 0.0.0.0network 10.0.13.0 0.0.0.255R4:
sys
sysname R4
int loop 0
ip add 10.0.4.4 32
int g0/0/0
ip add 10.0.14.4 24
int g0/0/1
ip add 10.0.47.4 24
int g0/0/2
ip add 10.0.46.4 24
int g0/0/3
ip add 10.0.45.4 24
q
bgp 100
router-id 10.0.4.4
peer 10.0.1.1 as-number 100
peer 10.0.1.1 connect-interface LoopBack 0
peer 10.0.2.2 as-number 100
peer 10.0.2.2 connect-interface LoopBack 0
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack 0
peer 10.0.5.5 as-number 100
peer 10.0.5.5 connect-interface LoopBack 0
peer 10.0.6.6 as-number 100
peer 10.0.6.6 connect-interface LoopBack 0
peer 10.0.7.7 as-number 100
peer 10.0.7.7 connect-interface LoopBack 0
network 10.0.4.4  32
ospf 1 router-id 10.0.4.4area 0.0.0.0network 10.0.4.4 0.0.0.0network 10.0.14.0 0.0.0.255network 10.0.45.0 0.0.0.255network 10.0.46.0 0.0.0.255network 10.0.47.0 0.0.0.255R5:
sys
sysname R5
int loop 0
ip add 10.0.5.5 32
int g0/0/1
ip add 10.0.45.5 24
q
bgp 100
router-id 10.0.5.5
peer 10.0.1.1 as-number 100
peer 10.0.1.1 connect-interface LoopBack 0
peer 10.0.2.2 as-number 100
peer 10.0.2.2 connect-interface LoopBack 0
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack 0
peer 10.0.4.4 as-number 100
peer 10.0.4.4 connect-interface LoopBack 0
peer 10.0.6.6 as-number 100
peer 10.0.6.6 connect-interface LoopBack 0
peer 10.0.7.7 as-number 100
peer 10.0.7.7 connect-interface LoopBack 0
network 10.0.5.5  32
ospf 1 router-id 10.0.5.5area 0.0.0.0network 10.0.5.5 0.0.0.0network 10.0.45.0 0.0.0.255R6:
sys
sysname R6
int loop 0
ip add 10.0.6.6 32
int g0/0/2
ip add 10.0.46.6 24
qbgp 100
router-id 10.0.6.6
peer 10.0.1.1 as-number 100
peer 10.0.1.1 connect-interface LoopBack 0
peer 10.0.2.2 as-number 100
peer 10.0.2.2 connect-interface LoopBack 0
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack 0
peer 10.0.5.5 as-number 100
peer 10.0.5.5 connect-interface LoopBack 0
peer 10.0.4.4 as-number 100
peer 10.0.4.4 connect-interface LoopBack 0
peer 10.0.7.7 as-number 100
peer 10.0.7.7 connect-interface LoopBack 0
network 10.0.6.6  32
ospf 1 router-id 10.0.6.6area 0.0.0.0network 10.0.6.6 0.0.0.0network 10.0.46.0 0.0.0.255R7:
sys
sysname R7
int loop 0
ip add 10.0.7.7 32
int g0/0/0
ip add 10.0.47.7 24
q
bgp 100
router-id 10.0.7.7
peer 10.0.1.1 as-number 100
peer 10.0.1.1 connect-interface LoopBack 0
peer 10.0.2.2 as-number 100
peer 10.0.2.2 connect-interface LoopBack 0
peer 10.0.3.3 as-number 100
peer 10.0.3.3 connect-interface LoopBack 0
peer  10.0.4.4 as-number 100
peer 10.0.4.4 connect-interface LoopBack 0
peer 10.0.5.5 as-number 100
peer 10.0.5.5 connect-interface LoopBack 0
peer 10.0.6.6 as-number 100
peer 10.0.6.6 connect-interface LoopBack 0
network 10.0.7.7 32
ospf 1 router-id 10.0.7.7area 0.0.0.0network 10.0.7.7 0.0.0.0network 10.0.47.0 0.0.0.255R8:
sys
sysname R8
int loop 0
ip add 10.0.8.8 32
int g0/0/0
ip add 10.0.18.8 24
q
bgp 200router-id 10.0.8.8peer 10.0.18.1 as-number 100#ipv4-family unicastundo synchronizationnetwork 10.0.8.8 255.255.255.255peer 10.0.18.1 enable

 可以看到,AS 100内部的路由器都已经接收到了关于10.0.8.8/32的路由信息。R8只接收到了关于10.0.1.1/32的路由信息,而没有接收到关于AS 100内部其他路由器的Loopback 0 的路由信息,这是因为AS 100内部OSPF路由协议的优先级要高于BGP路由协议的优先级,于是R1就不会将除了本地起源(即下一跳为0.0.0.0)的路由之外的其他路由信息传递给R8。显然,这会导致R8与AS 100内部的路由器的互通问题。为了使R8能够与AS 100内部的所有路由器的Loopback 0接口所在的网络进行通信,可以在R8上配置一条聚合的静态路由,下一跳为10.0.18.1。
[R8]ip route-static 10.0.0.0 20 10.0.18.1
配置完成后,网络通信正常,但是整体配置工作量较大。

 对于大型网络来讲,使用路由反射器可以大大减少IBGP对等体关系的数量。路由反射器的使用,会明显减少配置工作量,人为出错的可能性也会大大降低。
下面将进行关于路由反射器的实验,首先清除之前各路由器上的BGP进程。在此需要提醒读者的是,在实际场景中如果这样操作,将会导致网络瘫痪一段时间。
以R1为例,清除原来的BGP进程。

undo bgp 100

R2和R3是路由反射器R1的客户端,它们只需和R1配置成IBGP对等体关系即可,R2和R3之间无需配置为IBGP对等体关系。另外,将R2的Loopback 1 (10.0.22.22/32)接口通告进 BGP进程。

配置R1为R2和R3的路由反射器,配置Cluster-ID为1,配置Rl与R4之间的IBGP对等体关系,配置RI与R8之间的EBGP对等体关系。

 

r1:bgp 100router-id 10.0.1.1peer 10.0.4.4 as-number 100peer 10.0.4.4 connect-interface LoopBack0peer 10.0.18.8 as-number 200group in1 internalpeer 10.0.2.2 as-number 100peer 10.0.2.2 group in1peer 10.0.3.3 as-number 100peer 10.0.3.3 group in1#ipv4-family unicastundo synchronizationreflector cluster-id 1peer 10.0.4.4 enablepeer 10.0.4.4 next-hop-localpeer 10.0.18.8 enablepeer in1 enablepeer in1 reflect-clientpeer in1 next-hop-localpeer 10.0.2.2 enablepeer 10.0.2.2 group in1peer 10.0.3.3 enablepeer 10.0.3.3 group in1r2:bgp 100router-id 10.0.2.2peer 10.0.1.1 as-number 100peer 10.0.1.1 connect-interface LoopBack0#ipv4-family unicastundo synchronizationnetwork 10.0.0.0network 10.0.2.2 255.255.255.255network 10.0.22.22 255.255.255.255peer 10.0.1.1 enabler3:bgp 100router-id 10.0.3.3peer 10.0.1.1 as-number 100peer 10.0.1.1 connect-interface LoopBack0#ipv4-family unicastundo synchronizationnetwork 10.0.3.3 255.255.255.255peer 10.0.1.1 enabler8:
bgp 200router-id 10.0.8.8peer 10.0.18.1 as-number 100#ipv4-family unicastundo synchronizationnetwork 10.0.8.8 255.255.255.255peer 10.0.18.1 enable

 R5和R6是路由反射器R4的客户端,它们只需和R4配置成IBGP对等体关系即可,R5和R6之间无需配置为IBGP对等体关系。

配置R4为R5 和R6的路由反射器,配置Cluster-ID为2,配置R4与R1之间的IBGP对等体关系,配置R4与R7之间的IBGP对等体关系。

r4:
bgp 100router-id 10.0.4.4peer 10.0.1.1 as-number 100peer 10.0.1.1 connect-interface LoopBack0peer 10.0.7.7 as-number 100peer 10.0.7.7 connect-interface LoopBack0group in2 internalpeer 10.0.5.5 as-number 100peer 10.0.5.5 group in2peer 10.0.6.6 as-number 100peer 10.0.6.6 group in2#ipv4-family unicastundo synchronizationreflector cluster-id 2peer 10.0.1.1 enablepeer 10.0.7.7 enablepeer in2 enablepeer in2 reflect-clientpeer 10.0.5.5 enablepeer 10.0.5.5 group in2peer 10.0.6.6 enablepeer 10.0.6.6 group in2r5:
bgp 100router-id 10.0.5.5peer 10.0.4.4 as-number 100peer 10.0.4.4 connect-interface LoopBack0#ipv4-family unicastundo synchronizationnetwork 10.0.5.5 255.255.255.255peer 10.0.4.4 enabler6:
bgp 100router-id 10.0.6.6peer 10.0.4.4 as-number 100peer 10.0.4.4 connect-interface LoopBack0#ipv4-family unicastundo synchronizationnetwork 10.0.6.6 255.255.255.255peer 10.0.4.4 enabler7:
bgp 100router-id 10.0.7.7peer 10.0.4.4 as-number 100peer 10.0.4.4 connect-interface LoopBack0#ipv4-family unicastundo synchronizationnetwork 10.0.7.7 255.255.255.255peer 10.0.4.4 enable

观察发现,R3、R4、R8的BGP路由表中都存在关于10.0.22.22/32的路由信息。由此可见,R1将10.0.22.22/32这条路由传递给了R3和R4,不再受BGP水平分割原则的限制,同时,这条路由也被R1传递给了EBGP对等体R8。实验表明,BGP路由反射器从它的一个客户端接收到路由之后,会将该路由反射给它的其他客户端、非客户端,以及EBGP对等体。


可以看到,R4将10.0.22.22/32这条路由传递给了R5和R6,但是没有传递给R7,说明路由反射器会把从非客户端收到的路由传递给客户端,但不会传递给其他非客户端。由于路由反射器认为非客户端之间应该是存在IBGP对等体关系的,所以路由反射器和非客户端之间依然遵循水平分割原则。
路由反射器R4认为R1与R7之间应该存在IBGP对等体关系,所以没有将从非客户端R1接收到的BGP路由传递给R7。

但实际上,R1与R7之间并没有被配置为IBGP对等体关系,这就导致了R7的 BGP路由表中并没有关于10.0.22.22/32的路由。解决此问题的办法就是将R1和R7配置为IBGP对等体关系。

r1:
bgp 100peer 10.0.7.7 as-number 100peer 10.0.7.7 connect-interface LoopBack0peer 10.0.7.7 next-hop-local
r7:
bgp 100peer 10.0.1.1as-number 100peer 10.0.1.1 connect-interface LoopBack0peer 10.0.1.1 next-hop-local

 可以看到,R7上的10.0.22.22/32这条路由信息是从R1 (10.0.1.1)传递过来的,而不是从R4传递过来的,这说明路由反射器和非客户端之间是遵循水平分割原则的。

可以看到,R1 从 EBGP对等体R8接收到关于10.0.8.8/32的路由之后,将这条路由传递给了R2、R3、R4,说明路由反射器会把从EBGP对等体接收到的路由传递给它的客户端和非客户端。

在前面的配置中,R1上使用了命令peer in_1 reflect-client。这条命令的含义是指定BGP对等体组in_1中的路由器(即R2和R3)为R1的客户端,从相反的角度来说,也就是R1被指定成为BGP对等体组in_1中的路由器(即R2和R3)的路由反射器。
在R1、R3、R4上查看10.0.22.22/32这条路由的具体属性。

 

 

可以观察到,在R1、R3、R4上关于10.0.22.22/32的路由的属性是有所区别的。在R3和R4上关于此路由多了Originator和 Cluster List这两个属性。Originator 属性的作用是防止路由在反射器和客户端/非客户端之间出现环路。路由第一次被反射的时候,反射器会将Originator 属性加入这条路由中,用 BGP Router-ID表示,用来标识这条路由的起源路由器。如果路由中已经存在Originator属性,则反射器不会创建新的Originator。当其他BGP对等体接收到这条路由时,将对收到的Originator和本地的BGP Router-ID进行比较,如果两者相同,BGP对等体将会忽略掉这条路由,不做处理。Originator属性可以传递给其他的Cluster,路由在AS内传递时该属性不会丢失。
Cluster List属性可用来防止 Cluster间的路由环路。当路由反射器在客户端之间或客户端与非客户端之间反射路由时,会将自己的Cluster-ID添加到Cluster List 中。路由反射器接收到BGP路由后会去检查其中的Cluster List,如果发现自己的Cluster-ID位于Cluster List 中,则表明出现了路由环路,因而会忽略该路由。AS内的每台路由反射器都采用了一个唯一的4个8位组来标识Cluster-ID,如果 Cluster中包含了多台路由反射器,则必须以手工的方式为每台路由反射器配置Cluster-ID。

相关文章:

BGP路由反射器

原理概述 缺省情况下,路由器从它的一个 IBGP对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体,这个原则称为BGP水平分割原则,该原则的根本作用是防止 AS内部的BGP路由环路。因此,在AS内部,一般需要每台…...

DolphinDB Web 端权限管理:可视化操作指南

在现代数据库管理中,高效和直观的权限管理对于用户的数据安全是至关重要的。过去 DolphinDB 用户需要依赖系统脚本来管理用户和权限,这对于缺乏技术背景的管理员来说既复杂又容易出错。 为了提升用户体验和操作效率,DolphinDB 目前在 Web 上…...

学习Vue2收藏这一篇就够了(如何创建Vue实例)

什么是Vue? Vue是什么:是一个用于构建用户界面的渐进式框架 什么是构建用户界面:基于数据动态渲染页面 什么是渐进式:循序渐进的学习 什么是框架:一整套完整的项目解决方案 创建Vue实例 核心步骤(4步…...

Mysql数据库第四次作业

mysql> create table student(sno int primary key auto_increment,sname varchar(30) not null unique,Ssex varchar(2) check (Ssex男 or Ssex女) not null,Sage int not null,Sdept varchar(10) default计算机 not null); mysql> create table Course(Con int primar…...

使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离

参考课程 尚硅谷ShardingSphere5实战教程(快速入门掌握核心)_哔哩哔哩_bilibili 主服务器 创建容器 docker run -d \ -p 3306:3306 \ -v /kira/mysql/master/conf:/etc/mysql/conf.d \ -v /kira/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT…...

数据结构:数据类型与抽象数据类型

数据类型与抽象数据类型 数据类型基本数据类型构造数据类型指针类型枚举类型 抽象数据类型(ADT)抽象数据类型的组成部分常见的抽象数据类型示例 数据类型与抽象数据类型的区别实现抽象数据类型的具体方式用数组实现栈用链表实现栈 总结 数据类型 数据类…...

西方逻辑史简介

西方逻辑史研究,对形式逻辑实现现代化,对加强西方哲学史研究,对开展科学方法论的研究都有重要意义。西方逻辑史一般被划分成古代、中世纪、现代三个历史时期。本文拟对这三个时期中的七个重要逻辑学家和逻辑学派:亚里士多德、斯多…...

【论文10】复现代码tips

一、准备工作 1.创建一个虚拟环境 conda create --name drgcnn38 python=3.8.18 2.激活虚拟环境 conda activate drgcnn38 注意事项 在Pycharm中终端(terminal)显示PS而不是虚拟环境base 问题如下所示 解决方法:shell路径改成cmd.exe 重启终端显示虚拟环境 3.安装torch …...

分布式缓存获取以及设置

1. 通用代码 public SysUser getCache(String sysUserId) {String cacheKey "litgery:warehouse:" sysUserId;// 尝试从缓存中获取数据CacheData cacheData redisUtils.get(cacheKey);if (null ! cacheData) {if (Boolean.TRUE.equals(cacheData.getExist())) {re…...

SMO算法,platt论文的原始算法及优化算法

platt论文:[PDF] Sequential Minimal Optimization : A Fast Algorithm for Training Support Vector Machines | Semantic Scholar 算法优化:[PDF] Improvements to Platts SMO Algorithm for SVM Classifier Design | Semantic Scholar 包含个人plat…...

2.3 openCv -- 对矩阵执行掩码操作

在矩阵上进行掩模操作相当简单。其基本思想是根据一个掩模矩阵(也称为核)来重新计算图像中每个像素的值。这个掩模矩阵包含的值决定了邻近像素(以及当前像素本身)对新的像素值产生多少影响。从数学角度来看,我们使用指定的值来做一个加权平均。 具体而言,掩模操作通常涉…...

【Django】 js实现动态赋值、显示show隐藏hide效果

文章目录 需要达到的前端效果预览&#xff1a;实现步骤复制bootstrp代码&#xff08;buttons&#xff09;复制bootstrp代码&#xff08;Alert警告框&#xff09;写js测试效果 需要达到的前端效果预览&#xff1a; {% load static %} <!DOCTYPE html> <html lang"…...

qt--做一个拷贝文件器

一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位&#xff08;自适应&#xff09; 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类&#xff0c;直接使用静态…...

Eclipse 搭建 C/C++ 开发环境以及eclipse的使用

一、下载、安装 MinGW 1、下载: 下载地址&#xff1a;MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 点击“Download Latest Version”即可 下载完成后&#xff0c;得到一个名为 mingw-get-setup.exe 的安装文件。双击运行&#xff0c;安装即可。 …...

【初阶数据结构】复杂度算法题篇

旋转数组 力扣原题 方案一 循环K次将数组所有元素向后移动⼀位&#xff08;代码不通过) 时间复杂度O(n2) 空间复杂度O(1) void rotate(int* nums, int numsSize, int k) {while (k--) {int end nums[numsSize - 1];for (int i numsSize - 1; i > 0; i--) {nums[i] num…...

20240725项目的maven环境报红-重新配置maven

1.在编辑器里面打开项目&#xff0c;导入源码 &#xff08;1&#xff09;找到项目的地址C:\Users\zzz\IdeaProjects\datasys&#xff0c;然后右击用idea编辑器打开。 &#xff08;2&#xff09;idea中上菜单栏打开open&#xff0c;然后输入file&#xff0c;选择源代码文件 2.…...

若依 ruoyi poi Excel合并行的导入

本文仅针对文字相关的合并做了处理 &#xff0c;图片合并及保存需要另做处理&#xff01;&#xff01; 目标&#xff1a;Excel合并行内容的导入 结果&#xff1a; 1. ExcelUtil.java 类&#xff0c;新增方法&#xff1a;判断是否是合并行 /*** 新增 合并行相关代码&#xff1a;…...

优化算法:1.遗传算法(GA)及Python实现

一、定义 遗传算法就像是在模拟“优胜劣汰”的进化过程&#xff0c;通过选择最优秀的个体&#xff0c;交配产生下一代&#xff0c;并引入一定的变异&#xff0c;逐步优化解决问题。 二、具体步骤 初始化种群(Initialization)&#xff1a; 假设你要找到一个迷宫的最佳出口路径。…...

企业化运维(8)Docker容器技术

###1.Docker介绍### 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间…...

Unity C#底层原理(二)

委托 方法的容器&#xff1a;委托可以存储一个或多个方法的引用。可以使用委托对象来调用这些方法。函数/方法的变量类型&#xff1a;委托类型可以像变量一样声明和使用&#xff0c;存储方法的引用。存储、传递方法&#xff1a;委托可以作为参数传递给方法&#xff0c;也可以作…...

计算机网络-配置路由器ACL(访问控制列表)

配置访问控制列表ACL 拓扑结构 拓扑结构如下&#xff1a; 要配置一个ACL&#xff0c;禁止PC0访问PC3&#xff0c;禁止PC4访问PC0&#xff0c;其它正常。 配置Router0 配置接口IP地址&#xff1a; interface fastethernet 0/0 ip address 192.168.1.1 255.255.255.0 no shu…...

51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计

STC89C52R基于C51嵌入式点阵广告屏的设计 1 概述2 LED点阵介绍2.1 特点和优势2.2 工作原理&#xff1a;2.3 使用方法&#xff1a; 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路3.3 74HC595 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 总结 配套示例程序 1…...

VLC输出NDI媒体流

目录 1. 下载安装VLC Play 2. 首先在电脑上安装NDI Tools 3. 运行VLC进行输出配置 4. 播放视频 5. 验证 (1)用Studio Monitor验证 (2)用OBS验证 NDI(Network Device Interface)即网络设备接口,是由美国 NewTek 公司开发的免费标准,它可使兼容的视频产品以高质量…...

WiFi 局域网通信 - 发现服务和解析

1. nsdManager nsdManager requireContext().getSystemService(Context.NSD_SERVICE) as NsdManager2. NsdManager.DiscoveryListener 注意&#xff1a;在onStartDiscoveryFailed 和 onStopDiscoveryFailed里不要调用nsdManager.stopServiceDiscovery(this) 方法&#xff0…...

ChatGPT建议前端学习计划

HTML&CSS基础 - 学习HTML标签、CSS属性、页面布局等基础知识 JavaScript基础 - 学习变量、数据类型、控制流、函数等基础知识 jQuery - 学习如何使用jQuery处理文档对象模型&#xff08;DOM&#xff09;、事件、动画等 Ajax - 全称为 Asynchronous JavaScript and XML&…...

YOLO5项目目录最强解析

YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构&#xff0c;以下是对每个目录和文件的解释&#xff1a; 目录 &#x1f4c1; .github: 存放 GitHub 相关配置和文件&#xff0c;如 GitHub Actions 工作流文件、Issue 模板等&#xff0c;用于自动化构建和持续集成等功…...

【python】sklearn基础教程及示例

【python】sklearn基础教程及示例 Scikit-learn&#xff08;简称sklearn&#xff09;是一个非常流行的Python机器学习库&#xff0c;提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述&#xff1a; 1. 安装scikit-learn 首先&#xff0c;确保你已经安装了Python和…...

Linux:传输层(2) -- TCP协议(2)

目录 1. 流量控制 2. 滑动窗口 3. 拥塞控制 4. 延迟应答 5. 捎带应答 6. 面向字节流 7. 粘包问题 8. TCP异常情况 1. 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快 , 导致接收端的缓冲区被打满 , 这个时候如果发送端继续发送 , 就会造成丢包, 继而引…...

AcWing 802. 区间和

var说明add存储了插入操作&#xff0c;在指定 x x x下标所在位置 a [ x ] c a[x]c a[x]cquery是求 [ L , R ] [L,R] [L,R]区间和用到的数组,最后才用到alls 是存储离散化之后的值 , 对于会访问到的每个下标&#xff0c;统统丢到 a l l s 里面 &#xff0c;会把 x 和 [ L , R …...

实验2-2-1 温度转换

#include<stdio.h> #include <math.h> int main(){int c,f150;c5*(f-32)/9;printf("fahr 150, celsius %d",c); }...

Spark实时(六):Output Sinks案例演示

文章目录 Output Sinks案例演示 一、​​​​​​​File sink 二、​​​​​​​​​​​​​​Memory Sink 三、​​​​​​​​​​​​​​Foreach Sink 1、​​​​​​​foreachBatch 2、​​​​​​​​​​​​​​foreach Output Sinks案例演示 当我们对流式…...

在SQL编程中DROP、DELETE和TRUNCATE的区别

在SQL编程中&#xff0c;DROP、DELETE和TRUNCATE都是用于删除数据的命令&#xff0c;但它们之间有着显著的区别&#xff0c;主要体现在它们删除数据的范围、操作的不可逆性、对表结构的影响、性能以及事务日志的影响上。 DROP: 作用&#xff1a;DROP命令用于删除整个表及其所有…...

【AI大模型】Prompt 提示词工程使用详解

目录 一、前言 二、Prompt 提示词工程介绍 2.1 Prompt提示词工程是什么 2.1.1 Prompt 构成要素 2.2 Prompt 提示词工程有什么作用 2.2.1 Prompt 提示词工程使用场景 2.3 为什么要学习Prompt 提示词工程 三、Prompt 提示词工程元素构成与操作实践 3.1 前置准备 3.2 Pro…...

学习记录day18——数据结构 算法

算法的相关概念 程序 数据结构 算法 算法是程序设计的灵魂&#xff0c;结构式程序设计的肉体 算法&#xff1a;计算机解决问题的方法护额步骤 算法的特性 1、确定性&#xff1a;算法中每一条语句都有确定的含义&#xff0c;不能模棱两可 2、有穷性&#xff1a;程序执行一…...

一篇文章带你学完Java所有的时间与日期类

目录 一、传统时间与日期类 1.Date类 构造方法 获取日期和时间信息的方法 设置日期和时间信息的方法 2.Calendar类 主要特点和功能 常用方法 1. 获取当前日历对象 2. 获取日历中的某个信息 3. 获取日期对象 4. 获取时间毫秒值 5. 修改日历的某个信息 6. 为某个信息增…...

利用GPT4o Captcha工具和AI技术全面识别验证码

利用GPT4o Captcha工具和AI技术全面识别验证码 &#x1f9e0;&#x1f680; 摘要 GPT4o Captcha工具是一款命令行工具&#xff0c;通过Python和Selenium测试各种类型的验证码&#xff0c;包括拼图、文本、复杂文本和reCAPTCHA&#xff0c;并使用OpenAI GPT-4帮助解决验证码问…...

大学生算法高等数学学习平台设计方案 (第一版)

目录 目标用户群体的精准定位 初阶探索者 进阶学习者 资深研究者 功能需求的深度拓展 个性化学习路径定制 概念图谱构建 公式推导展示 交互式问题解决系统 新功能和创新点的引入 虚拟教室环境 数学建模工具集成 算法可视化平台 学术论文资源库 技术实现的前瞻性…...

机器学习算法与Python实战 | 两行代码即可应用 40 个机器学习模型--lazypredict 库!

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;两行代码即可应用 40 个机器学习模型 今天和大家一起学习使用 lazypredict 库&#xff0c;我们可以用一行代码在我们的数据集上实现许多…...

使用WebSocket协议调用群发方法将消息返回客户端页面

目录 一.C/S架构&#xff1a; 二.Http协议与WebSocket协议的区别&#xff1a; 1.Http协议与WebSocket协议的区别&#xff1a; 2.WebSocket协议的使用场景&#xff1a; 三.项目实际操作&#xff1a; 1.导入依赖&#xff1a; 2.通过WebSocket实现页面与服务端保持长连接&a…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十七章 Linux中断实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

每日一题~961div2A+B+C(阅读题,思维,数学log)

A 题意&#xff1a;给你 n*n 的表格和k 个筹码。每个格子上至多放一个 问至少占据多少对角线。 显然&#xff0c;要先 格数的多的格子去放。 n n-1 n-2 …1 只有n 的是一个&#xff08;主对角线&#xff09;&#xff0c;其他的是两个。 #include <bits/stdc.h> using na…...

Fireflyrk3288 ubuntu18.04添加Qt开发环境、安装mysql-server

1、创建一台同版本的ubuntu18.04的虚拟机 2、下载rk3288_ubuntu_18.04_armhf_ext4_v2.04_20201125-1538_DESKTOP.img 3、创建空img镜像容器 dd if/dev/zero ofubuntu_rootfs.img bs1M count102404、将该容器格式化成ext4文件系统 mkfs.ext4 ubuntu_rootfs.img5、将该镜像文件…...

简化mybatis @Select IN条件的编写

最近从JPA切换到Mybatis&#xff0c;使用无XML配置&#xff0c;Select注解直接写到interface上&#xff0c;发现IN条件的编写相当麻烦。 一般得写成这样&#xff1a; Select({"<script>","SELECT *", "FROM blog","WHERE id IN&quo…...

Windows图形界面(GUI)-MFC-C/C++ - Control

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Control 资源编辑器 添加控件 设置控件属性 添加控件变量 添加消息处理 处理控件事件 控件焦点顺序 Control 资源编辑器 资源编辑器&#xff1a;用于可视化地编辑对话框和控件。…...

SQL Server数据库安全:策略制定与实践指南

SQL Server数据库安全&#xff1a;策略制定与实践指南 在当今数字化时代&#xff0c;数据安全是每个组织的核心关注点。SQL Server作为广泛使用的关系型数据库管理系统&#xff0c;提供了一套强大的安全特性来保护存储的数据。制定有效的数据库安全策略是确保数据完整性、可用…...

Spring Boot入门指南:留言板

一.留言板 1.输⼊留⾔信息,点击提交.后端把数据存储起来. 2.⻚⾯展⽰输⼊的表⽩墙的信息 规范&#xff1a; 1.写一个类MessageInfo对象&#xff0c;添加构造方法 虽然有快捷键&#xff0c;但是还是不够偷懒 项目添加Lombok。 Lombok是⼀个Java⼯具库&#xff0c;通过添加注…...

Docker 中安装和配置带用户名和密码保护的 Elasticsearch

在 Docker 中安装和配置带用户名和密码保护的 Elasticsearch 需要以下步骤。Elasticsearch 的安全功能&#xff08;包括基本身份验证&#xff09;在默认情况下是启用的&#xff0c;但在某些版本中可能需要手动配置。以下是详细步骤&#xff0c;包括如何设置用户名和密码。 1. …...

面试官:说说JVM内存调优及内存结构

1. JVM简介 JVM&#xff08;Java虚拟机&#xff09;是运行Java程序的平台&#xff0c;它使得Java能够跨平台运行。JVM负责内存的自动分配和回收&#xff0c;减轻了程序员的负担。 2. JVM内存结构 运行时数据区是JVM中最重要的部分&#xff0c;包含多个内存区域&#xff1a; …...

Ansible的脚本-----playbook剧本【下】

目录 实战演练六&#xff1a;tags 模块 实战演练七&#xff1a;Templates 模块 实战演练六&#xff1a;tags 模块 可以在一个playbook中为某个或某些任务定义“标签”&#xff0c;在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…...

Mysql开启远程控制简化版,亲测有效

首先关闭防火墙 改表法 打开上图的CMD&#xff0c;输入密码进入&#xff0c;然后输入一下指令 1.use mysql; 2.update user set host % where user root;//更新root用户的权限&#xff0c;允许任何主机连接 3.FLUSH PRIVILEGES;//刷新权限&#xff0c;使更改生效 具体参考…...