专题十五:动态路由——BGP
一、BGP的基本概念
BGP(Border Gateway Protocol,边界网关协议)是一种用于在不同自治系统(AS)之间交换路由信息的外部网关协议(EGP)。通过TCP179端口建立连接。目前采用BGP4版本,IPv6协议中采用BGP4+。
BGP类型:
EBGP:运行在不同AS之间的BGP成为EBGP,为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。
IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。

1.自治系统(AS)
-
AS1使用RIP作为内部网关协议(IGP)。
-
AS2使用OSPF作为内部网关协议(IGP)。
AS是指在一个实体管辖下的拥有相同选路策略的IP网络。BGP网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。
公有 AS 号:公有 AS 号用于在互联网上可被路由的自治系统,这些 AS 号是全球唯一的,范围从 1 到 64511。
私有 AS 号:私有 AS 号范围是从 64512 到 65535,实际一般做实验或者大内网中使用AS 65535。
2.网部网关协议
AS1和AS2之间通过BGP(属于EGP)交换跨自治系统的路由信息。
3.协议分层逻辑
-
内部网络:自治系统内部使用轻量级IGP(如RIP、OSPF)实现高效路由。
-
外部互联:不同自治系统之间使用EGP(如BGP)实现策略控制和大规模路由交换。
二、BGP报文

如上图所示,BGP存在5种类型的报文,分别为Open、Update、Notification、Keepalive、Route-refresh,不同类型的报文拥有相同的头部(header)。5种报文各自起到作用及发送时间见下表:
| 报文名称 | 作用 | 发送时间 |
| Open | 协商BGP对等体参数,建立对等体关系 | BGP TCP连接建立成功之后 |
| Update | 发送BGP路由更新 | BGP对等体关系建立之后有路由需要发送或路由变化时向对等体发送Update报文 |
| Notification | 报文错误信息,中止对等体关系 | 当BGP在运行中发现错误时,发送Notification报文将错误通过给BGP对等体 |
| Keepalive | 标志对等体建立,维持BGP对等体关系 | BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送Keepalive报文用于保持连接 |
| Route-refresh | 用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的BGP设备会发送和响应此报文 | 当路由策略发生变化时,触发请求对等体重新通告路由 |
-
Open消息:是 TCP 连接建立后发送的第一个消息,用于建立 BGP 对等体之间的连接关系。对等体在接收到 Open 消息并协商成功后,将发送 Keepalive 消息确认并保持连接的有效性。确认后,对等体间可以进行 Update、Notification、Keepalive和 Route-Refresh 消息的交换。
应用:通过 TCP 建立 BGP 连接时,发送 OPEN 消息。 -
Update消息:用于在对等体之间交换路由信息。
-
Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
应用:连接建立后,如果有路由需要发送或路由变化时,发送UPDATE消息通告对端。 -
Keepalive消息:BGP 会周期性的向对等体发出 Keepalive消 息,用来保持连接的有效性。
- 应用:稳定后要定时发送 KEEPALIVE 消息以保持 BGP 连接的有效性。
-
Notification消息:当 BGP 检测到错误状态时,就向对等体发出 Notification 消息,之后 BGP 连接会立即中断。
- 应用:当本地 BGP 在运行中发现错误时,要发送 NOTIFICATION 消息通告 BGP 对等体。
-
Route-Refresh消息:通过 OPEN 消息告知 BGP peer 本地支持路由刷新能力(Route-Refresh capability)。
- 应用:ROUTE-REFRESH 消息用来通知对等体自己支持路由刷新。
三、BGP状态机
1.BGP六种状态
BGP的状态有idle、connect、active、opensent、openconfirm、established六种状态。
| Peer状态名称 | 用途 |
| ldle | 开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源 |
| Connect | 正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Active状态,反复尝试连接 |
| Active | TCP连接没建立成功,反复尝试TCP连接 |
| OpenSent | TCP连接已经建立成功,开始发送Open包,Open包携带参数协商对等体的建立 |
| OpenConfirm | 参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包 |
| Established | 已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息 |
2.BGP状态变换
BGP的状态有idle、connect、active、opensent、openconfirm、established六种状态。

(1)Idle状态是BGP初始状态。
在Idle状态下,BGP拒绝对等体发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。
Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。
任何状态中收到Notification报文或TCP拆链通知等Error事件后,BGP都会转至Idle状态。
(2)Connect状态
在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。
如果TCP连接失败,那么BGP转至Active状态。
如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。
(3)Active状态
在Active状态下,BGP总是在试图建立TCP连接。
如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。
如果TCP连接失败,那么BGP停留在Active状态。
如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。
(4)Opensent状态、openconfirm状态
TCP三次握手建立成功后,发送open报文建立对等体关系,此时的状态为
opensent状态,当收到对端回应的open报文,并且参数检查无误,在发送keepalive报文后进入openconfirm状态。
(5)established状态
进入openconfirm状态后,收到对端的keepalive报文后进入established状态。
四、BGP对等体
1.BGP对等体的概念
BGP发言者:运行BGP路由协议的路由器称为BGP发言者(BGP路由器);

BGP对等体:两个建立BGP会话(BGP的会话是基于TCP建立的)的路由器互为BGP对等体,BGP对等体之间可以交换路由表;

2.BGP对等体分类
BGP对等体可以按照两个路由器是否AS相同,分为EBGP对等体和IBGP对等体。

(1)IBGP:位于相同的AS的BGP路由器互为IBGP对等体关系;

(2)EBGP:位于不同的AS的BGP路由器互为EBGP对等体关系;

能够建立对等体的条件:
两个路由器指定建立对等体的地址必需可达;
TCP连接能够建立;
3.BGP对等体的建立
(1)TCP连接建立

假设BGP路由器R1先启动,则R1先发起建立TCP连接,通过3次握手完成TCP的连接建立。
(2)BGP路由器发送OPEN报文协商参数

三次握手建立完成后,R1和R2之间相互发送OPEN报文,用于建立对等体的参数协商。
OPEN报文参数:
-
自身AS号;
-
hold time:用于协商后续keepalive报文发送时间;
-
BGP identifier:自身router id;
(3)BGP路由器发送keepalive报文完成对等体建立

参数协商正常后双方相互发送keepalive报文,收到对方的keepalive报文后对等体建立成功,同时后续定期发送keepalive报文用于保持连接。
(4)BGP路由器发送UPDATE报文通告路由

BGP对等体关系建立好了,就可以通过BGP update 报文通告路由到对等体。收到对方的keepalive报文后对等体建立成功,同时后续定期发送keepalive报文用于保持连接。
4.BGP对等体建立使用源地址
BGP默认使用出接口的IP地址建立对等体。
(1)在建立IBGP对等体关系时,建议使用loopback地址建立IBGP对等体。因为loopback地址稳定,可以借助内部IGP冗余保证可靠性。

例如上图:
R1和R2通过loopback地址建立IBGP对等体,如果R1和R2之间的物理链路断了,loopback地址的连通性也不会受影响,可以通过R3实现R1和R2的loopback地址的互通,那么R1和R2之间的对等体关系依然可以保持建立。如果通过接口建立的话,就会导致BGP对等体关系中断。
(2)在建立EBGP对等体关系时,建议使用直连地址建立EBGP对等体。如果使用loopback,需要注意EBGP多跳的问题。
五、BGP路由表
1.BGP对等体表
可以通过dis bgp peer 查看BGP对等体表;

(1)peer:对等体地址
(2)V:版本号
(3)AS:对等体AS号
(4)UP/DOWN:对等体存在up或者down的时间
(5)state:对等体状态
(6)prefRce:从该对等体收到的路由前缀数目
2.BGP路由表
可以通过display bgp routing-table 查看BGP路由表;

如果到达同一个目的地存在多条路由,则将路由都进行罗列,但每个目的地只会优选一条路由。

通过display bgp routing-table ipv4-address { mask | mask-length } 可以显示指定IP地址/掩码长度的路由信息,在其中有关于该BGP路由的详细信息,如:路由始发者、下一跳地址、路由的路径属性等
六、BGP选路原则
当到达同一目的地存在多条路由时, BGP 依次对比下列属性来选择路由:
1.优选协议首选值(PrefVal)最高的路由。协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。
2.优选本地优先级(Local_Pref)最高的路由。如果路由没有本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。
3.依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、从对等体学习的路由。
4.优选AS路径(AS_Path)最短的路由。当AS_Path为空时,会优选AS_Path为空的路由。
5.依次优选Origin类型为IGP、EGP、Incomplete的路由。
6.对于来自同一AS的路由,优选MED值最低的路由。
7.依次优选EBGP路由、IBGP路由、LocalCross路由、RemoteCross路由。
8.优选到BGP下一跳IGP度量值(metric)最小的路由。
9.优选Cluster_List最短的路由。
10.优选Router ID最小的设备发布的路由。如果路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小(不再比较Router ID),并优选Originator_ID最小的路由。
11.优选从具有最小IP Address的对等体学来的路由。
当到达同一目的地址存在多条等价路由时,可以通过 BGP 等价负载分担实现均衡流量的目的。形成 BGP 等价负载分担的条件是“BGP 选择路由的策略”的 1 至 8 条规则中需要比较的属性完全相同。
七、BGP路由生成
BGP路由是通过BGP命令通告而成的,而通告BGP路由的方法有两种:network和Import。
(1)network方式:
使用network命令可以将当前设备路由表中的路由(非BGP)发布到BGP路由表中并通告给邻居,和OSPF中使用network命令的方式大同小异,只不过在BGP宣告时,只需要宣告网段+掩码数即可,如:network 12.12.0.0 16。
(2)Import方式:
使用Import命令可以将该路由器学到的路由信息重分发到BGP路由表中,是BGP宣告路由的一种方式,可以引入BGP的路由包括:直连路由、静态路由及动态路由协议学到的路由。其命令格式与在RIP中重分发OSPF差不多。
八、BGP的配置
1.基本配置

需要在所有Router间运行BGP协议,RouterA、RouterB之间建立EBGP连接,RouterB、RouterC和RouterD之间建立IBGP全连接。
配置思路:
采用如下的思路配置BGP的基本功能:
(1)在RouterB、RouterC和RouterD间配置IBGP连接。
(2)在RouterA和RouterB之间配置EBGP连接。
配置步骤:
(1)配置各接口的IP地址
# 配置RouterA。
<Huawei> system-view
[Huawei] sysname RouterA
[RouterA] interface gigabitethernet 1/0/0
[RouterA-GigabitEthernet1/0/0] ip address 10.1.1.1 8
[RouterA-GigabitEthernet1/0/0] quit
其他路由器各接口的IP地址与此配置一致(略)。
(2)配置IBGP连接
# 配置RouterB。
[RouterB] bgp 65009 //配置as号
[RouterB-bgp] router-id 2.2.2.2
[RouterB-bgp] peer 172.16.1.2 as-number 65009 //配置对等体的IP地址及其所属的AS编号
[RouterB-bgp] peer 172.16.3.2 as-number 65009 //配置对等体的IP地址及其所属的AS编号
指定对等体的IP地址可以是以下三种:
直连对等体的接口IP地址。
直连对等体的子接口IP地址。
路由可达的对等体的Loopback接口地址。
# 配置RouterC。
[RouterC] bgp 65009
[RouterC-bgp] router-id 3.3.3.3
[RouterC-bgp] peer 172.16.3.1 as-number 65009
[RouterC-bgp] peer 172.16.2.2 as-number 65009
[RouterC-bgp] quit
# 配置RouterD。
[RouterD] bgp 65009
[RouterD-bgp] router-id 4.4.4.4
[RouterD-bgp] peer 172.16.1.1 as-number 65009
[RouterD-bgp] peer 172.16.2.1 as-number 65009
[RouterD-bgp] quit
(3)配置EBGP连接
# 配置RouterA。
[RouterA] bgp 65008
[RouterA-bgp] router-id 1.1.1.1
[RouterA-bgp] peer 192.168.1.1 as-number 65009
# 配置RouterB。
[RouterB-bgp] peer 192.168.1.2 as-number 65008
# 查看BGP对等体的连接状态。
[RouterB-bgp] display bgp peer
(4)配置RouterA发布路由10.1.0.0/8
# 配置RouterA发布路由。
[RouterA-bgp] ipv4-family unicast //使能BGP的IPv4单播地址族视图
[RouterA-bgp-af-ipv4] network 10.1.0.0 255.0.0.0
[RouterA-bgp-af-ipv4] quit
# 查看RouterA路由表信息。
[RouterA-bgp] display bgp routing-table
(5)配置BGP引入直连路由
# 配置RouterB。
[RouterB-bgp] ipv4-family unicast
[RouterB-bgp-af-ipv4] import-route direct //引入直连路由
# 查看RouterA的BGP路由表。
[RouterA-bgp] display bgp routing-table
2.路由反射器的配置
2.1路由反射技术概述
BGP在AS之间的路由防环,是要依赖AS_PATH属性,但是AS_PATH属性只有路由在EBGP邻居之间传递时才会发生改变,在AS内部,AS_PATH是不会改变的,那么在AS内部的路由防环,就无法依赖AS_PATH了,因此BGP定义IBGP的水平分割规则:一台BGP路由器从它的IBGP邻居学习到的BGP路由不能再传递给任何IBGP邻居。由于存在IBGP水平分割原则,使得AS内的BGP路由器之间不得不两两建立IBGP连接(IBGP全互联),以求获得完整的BGP路由更新,然而这是个扩展性非常低的做法,同时也给网络设备带来了负担,解决IBGP扩展性问题的两种有效的办法是路由反射器及联邦。
路由反射器相比于联邦,优势在于,联邦中所有路由器都需要支持并理解联邦机制,而路由反射器只需要RR理解反射器机制即可,另外,路由反射器的实现机制也相对简单一些,并且对大型冗余性、层次性强的网络架构采用路由反射器的解决方案也是一个不错的选择。当然如果希望用各种EBGP机制来管理大规模AS,那么联邦将是一个更优的解决方案。

在上图中,由于IBGP水平分割的限制,使得R4在收到IBGP邻居R3发来的路由更新后,不能在发送给另一个IBGP邻居R5。如此一来R5就无法正常学习路由,除非在R3-R5之间也建立一条IBGP连接。

采用路由反射技术即可解决这个问题,首先我们定义一个RR,同时定义这个RR的Client。那么这时候当RR收到她的Client发送过来的路由,就可以像一面镜子一样,将路由反射给其他IBGP路由器。此刻R4作为RR,与它的Client R3就构成了一个路由反射簇。
思考路由反射器时,将簇当作一个逻辑的整体去考虑即可, RR和client共同构成反射簇,但是只有RR知道(配置只是在RR上完成)。注意RR只通告或反射它所知道的最佳路径。
为了维护一致的BGP拓扑,RR在反射路由的时候不修改某些BGP路径属性,这些属性包括NH、AS_PATH、LOCAL_PREF和MED,并且增加了ORIGINATOR和CLUSTER_LIST用于防环。
2.2路由反射规则
-
如果路由学习自非client IBGP对等体,则反射给所有client
-
如果路由学习自一client,则反射给所有非client IBGP邻居和除了该client以外的所有client(我司设备可以关闭RR在Client之间的路由反射行为)
-
如果路由学习自EBGP邻居,则发送给所有client和非client IBGP邻居
注意红色关键字。注意反射和发送的区别。下面看几个例子:


2.3路由反射器的基本配置

互联IP的规划如图所示;所有路由器Loopback0口地址为x.x.x.x/32,x为设备编号。
AS123内跑一个OSPF,宣告直连接口,以及各自的Loopback0接口。
R1、R2、R3根据上图所示建立IBGP邻居关系。
在R1上引入11.11.11.0/24路由进BGP,初始情况下R2能够学习这条BGP路由,但是R3无法学习到。
将R2配置为RR,R1作为R2的Client,使得R3能够学习到11.11.11.0/24路由
# R1的配置-省略OSPF及接口的配置
[R1] bgp 123[R1-bgp] router-id 1.1.1.1[R1-bgp] peer 2.2.2.2 as-number 123[R1-bgp] peer 2.2.2.2 connect-interface loopback0[R1-bgp] network 11.11.11.0 24
# R2的配置-省略OSPF及接口的配置
[R2] bgp 123[R2-bgp] router-id 2.2.2.2[R2-bgp] peer 1.1.1.1 as-number 123[R2-bgp] peer 1.1.1.1 connect-interface loopback0[R2-bgp] peer 1.1.1.1 reflect-client[R2-bgp] peer 3.3.3.3 as-number 123[R2-bgp] peer 3.3.3.3 connect-interface loopback0
# R3的配置省略OSPF及接口的配置
[R3] bgp 123[R3-bgp] router-id 3.3.3.3[R3-bgp] peer 2.2.2.2 as-number 123[R3-bgp] peer 2.2.2.2 connect-interface loopback0
在R3上验证一下,查看路由11.11.11.0的详细信息:

另一个需要关注的配置是配置路由反射簇的Cluster_ID,这也是在RR上完成的配置。当RR反射一条路由时,如果该路由不存在Originator及Cluster_list属性,则插入这两个属性值,同时Cluster_list属性值中写入本路由反射簇的Cluster_ID,默认情况下,Cluster_ID为RR的RouterID,如果需要修改,可使用下面的命令。
如果RR在反射路由时,被反射路由中已经存在Cluster_List属性了,那么RR将自己的Cluster_ID插入到已有的CLuster_List中。

九、软考真题
2020年11月网络规划设计师:
下列哪种BGP属性不会随着BGP的Update报文通告被邻居()
A.PreVal
B.Next-hop
C.AS-Path
D.Origin
【解析】答案是A,PreVal是华为设备特有属性,仅本地有效。
2016年11月网络规划设计师:
当一条路由被发布到它所起源的AS时,会发生的情况是()
A.该AS在路径属性列表中看到自己的号码,从而拒绝接收这条路由
B.边界路由器把该路由传送到这个AS中的其他路由器
C.该路由将作为一条外部路由传送给同一AS中的其他路由器
D.边界路由器从AS路径列表中删除自己的AS号码并重新发布路由
【解析】答案是A,EBGP防止环路就是不接收带有本地AS号的路由。
2022年11月网络规划设计师:
以下关于IS-IS协议的描述中,错误的是()。
A.IS-IS使用SPF算法来计算路由
B.IS-IS是一种链路状态路由协议
C.IS-IS使用域(area)来建立分级的网络拓扑结构,骨干为area0
D.IS-IS通过传递LSP来传递链路信息,完成链路数据库的同步
【解析】答案是C,area分级网络是OSPF协议内容。
2021年11月网络工程师:
以下关于IS-IS路由协议的说法中,错误的是()
A.IS-IS是基于距离矢量的路由协议。
B.IS-IS属于内部网关路由协议
C.IS-IS路由协议将自治系统分为骨干区域和非骨干区域
D.IS-IS路由协议中Leve1-2路由器可以和不同区域的Leve1-2或者Leve1-1-2路由器形成邻居关系
【解析】答案是A。IS-IS是链路状态路由协议,采用SPF算法计算路由路径。
相关文章:
专题十五:动态路由——BGP
一、BGP的基本概念 BGP(Border Gateway Protocol,边界网关协议)是一种用于在不同自治系统(AS)之间交换路由信息的外部网关协议(EGP)。通过TCP179端口建立连接。目前采用BGP4版本,IP…...
Linux命令-vim编辑
用vi或vim命令进入vim编辑器。 基础: u 撤销上一次操作。x剪切当前光标所在处的字符。yy复制当前行。dd剪切当前行。p粘贴剪贴板内容到光标下方。i切换到输入模式,在光标当前位置开始输入文本。:wq保存并退出Vim 编辑器。:q!不保存强制退出Vim 编辑器。 拓展: w光…...
hive数仓要点总结
1.OLTP和OLAP区别 OLTP(On-Line Transaction Processing)即联机事务处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用…...
一款安全好用的企业即时通讯平台,支持统一门户
在数字化转型的浪潮中,企业面临着信息孤岛、系统分散、协作低效等诸多挑战。BeeWorks作为一款专为企业打造的数字化底座平台,凭借其强大的企业内部应用集成能力和单点登录功能,正在成为企业数字化转型的有力推手。 数字化底座平台࿱…...
git安装(windows)
通过网盘分享的文件:资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用,所以不用创建。 用vscode,所以这么选择。...
微信小程序实战案例 - 餐馆点餐系统 阶段1 - 菜单浏览
阶段 1 – 菜单浏览(超详细版) 目标:完成「首页=菜品卡片列表」 打好 UI 地基会从 云数据库 拉取 categories / dishes 并渲染打 Git Tag v1.0‑menu 1. 技术/知识点速览 知识点关键词说明云数据库db.collection().where().…...
Dashboard的安装和基本使用
1.Dashboard简介: Dashboard是Kubernetes的Web图形用户界面(GUI),它为用户提供了一个直观的方式来管理和监控Kubernetes集群。 2.实验基础和前置条件: 本实验以Kubernetes集群环境搭建与初始化-CSDN博客为基础和前置…...
英语单词 list 11
前言 这一个 list 是一些简单的单词。感觉这个浏览单词的方法比较低效,所以准备每天最多看一个 list ,真要提升英语水平,感觉还是得直接做阅读理解题。就像我们接触中文阅读材料一样,当然光知道这个表面意思还不够,还…...
JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap
欢迎光临小站:致橡树 ThreadLocalMap 是 ThreadLocal 的核心底层数据结构,负责在每个线程中存储与 ThreadLocal 实例绑定的数据。它的设计目标是高效管理线程隔离数据,同时尽量减少内存泄漏风险。以下是其核心实现细节。 数据结构与设计目标…...
DeepSeek 接入 Word 完整教程
一、前期准备 1.1 注册并获取 API 密钥 访问 DeepSeek 平台: 打开浏览器,访问 DeepSeek 官方网站(或您使用的相应平台)。注册并登录您的账户。 创建 API 密钥: 在用户控制面板中,找到“API Keys”或“API…...
通义灵码助力Neo4J开发:快速上手与智能编码技巧
在 Web 应用开发中,Neo4J 作为一种图数据库,用于存储节点及节点间的关系。当图结构复杂化时,关系型数据库的查找效率会显著降低,甚至无法有效查找,这时 Neo4J 的优势便凸显出来。然而,由于其独特的应用场景…...
高性能文件上传服务
高性能文件上传服务 —— 您业务升级的不二选择 在当今互联网数据量激增、文件体积日益庞大的背景下,高效、稳定的文件上传方案显得尤为重要。我们的文件分块上传服务端采用业界领先的 Rust HTTP 框架 Hyperlane 开发,凭借其轻量级、低延时和高并发的特…...
p2p的发展
PCDN(P2P内容分发网络)行业目前处于快速发展阶段,面临机遇与挑战并存的局面。 一、发展机遇 技术融合推动 边缘计算与5G普及:5G的高带宽、低延迟特性与边缘计算技术结合,显著提升PCDN性能,降低延迟&#x…...
Java Lambda 表达式详解:发展史、语法、使用场景及代码示例
Java Lambda 表达式详解:发展史、语法、使用场景及代码示例 1. Lambda 表达式的发展史 背景与动机 JDK 7 前:Java的匿名内部类虽强大,但代码冗余(如事件监听器、集合遍历)。JDK 8(2014)&#…...
【从0到1学Elasticsearch】Elasticsearch从入门到精通(下)
我们在【从0到1学Elasticsearch】Elasticsearch从入门到精通(上)这边文章详细讲解了如何创建索引库和文档及javaAPI操作,但是在实战当中,我们还需要根据一些特殊字段对文档进行查找搜索,仅仅靠id查找文档是显然不够的。…...
Python实现贪吃蛇二
上篇文章Python实现贪吃蛇一,实现了一个贪吃蛇的基础版本,但存在一些不足,也缺乏一些乐趣。本篇文章将对其进行一些改进,主要修改/实现以下几点: 1、解决食物随机生成的位置与蛇身重合问题 2、蛇身移动加速/减速功能 3…...
使用pybind11开发c++扩展模块输出到控制台的中文信息显示乱码的问题
使用pybind11开发供Python项目使用的C++扩展模块时,如果在扩展模块的C++代码中向控制台输出的信息中包含中文,python程序的控制台很容易出现乱码。以如下C++扩展框架代码为例(这是对上一篇文章简明使用pybind11开发pythonc+扩展模块教程-CSDN博客中的C++扩展框架代码进行少量…...
基于51单片机的正负5V数字电压表( proteus仿真+程序+设计报告+讲解视频)
基于51单片机的正负5V数字电压表( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0101 1. 主要功能: 设计一个基于51单片机数字电压表 1、能够…...
Java雪花算法
以下是用Java实现的雪花算法代码示例,包含详细注释和异常处理: 代码下面有解析 public class SnowflakeIdGenerator {// 起始时间戳(2020-01-01 00:00:00)private static final long START_TIMESTAMP 1577836800000L;// 各部分…...
前端大屏可视化项目 局部全屏(指定盒子全屏)
需求是这样的,我用的项目是vue admin 项目 现在需要在做大屏项目 不希望显示除了大屏的其他东西 于是想了这个办法 至于大屏适配问题 请看我文章 底部的代码直接复制就可以运行 vue2 px转rem 大屏适配方案 postcss-pxtorem-CSDN博客 <template><div …...
Android studio消息同步机制:消息本地存储,服务器交互减压
文章目录 后端(Flask)代码前端(Android Studio Java)代码同步机制1. 放在 Activity 中2. 放在 Service 中3. 放在 DataManager 类中 放在Service中的具体实现1. 后台执行2. 独立于活动3. 系统管理4. 绑定服务5. 进程间通信&#x…...
P8667 [蓝桥杯 2018 省 B] 递增三元组(摘自洛谷)
给定三个整数数组 A[A1,A2,⋯,AN],B[B1,B2,⋯,BN],C[C1,C2,⋯,CN]。 请你统计有多少个三元组 (i,j,k) 满足: 1≤i,j,k≤NAi<Bj<Ck 输入格式 第一行包含一个整数 N。 第二行包含 N 个整数 A1,A2,⋯,AN…...
【Kafka基础】监控与维护:动态配置管理,灵活调整集群行为
1 基础配置操作 1.1 修改主题保留时间 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-configs.sh --alter \--bootstrap-server 192.168.10.33:9092 \--entity-type topics \--entity-name yourtopic \--add-config retention.ms86400000 参数说明: retention…...
01_JDBC
文章目录 一、概述1.1、什么是JDBC1.2、JDBC原理 二、JDBC入门2.1、准备工作2.1.1、建库建表2.1.2、新建项目 2.2、建立连接2.2.1、准备四大参数2.2.2、加载驱动2.2.3、准备SQL语句2.2.4、建立连接2.2.5、常见问题 2.3、获取发送SQL的对象2.4、执行SQL语句2.5、处理结果2.6、释…...
STM32 HAL库 HC - SR04 超声波测距模块驱动实现
一、引言 在现代嵌入式系统开发中,传感器技术起着至关重要的作用。超声波测距模块作为一种常用的距离测量传感器,因其成本低、精度较高、使用方便等优点,被广泛应用于机器人避障、液位检测、工业自动化等领域。HC - SR04 超声波测距模块是一…...
Spring Boot 热部署详解,包含详细的配置项说明
Spring Boot 热部署详解 1. 热部署简介 热部署(Hot Deployment)允许在应用运行时修改代码或配置文件,无需重启应用即可使更改生效。Spring Boot 通过 spring-boot-devtools 模块实现这一功能,其核心依赖于 LiveReload 技术和自动…...
剑指Offer(数据结构与算法面试题精讲)C++版——day12
剑指Offer(数据结构与算法面试题精讲)C版——day12 题目一:小行星碰撞题目二:每日温度题目三:直方图最大矩形面积附录:源码gitee仓库 题目一:小行星碰撞 题目:输入一个表示小行星的数…...
贪心算法(18)(java)距离相等的条形码
在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。 示例 1: 输入:barco…...
Docker学习笔记-docker安装、删除
一、在centOS 7中docker的默认安装目录 # Docker 主配置文件目录 ls /etc/docker# Docker 数据目录(镜像、容器、卷等) ls /var/lib/docker# Docker 可执行文件路径 which docker # 输出类似 /usr/bin/docker 二、docker文件目录说明 目录/文件用途/…...
【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具
🖥️ 你的 Windows 关机助手——PyQt5 版定时关机工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的…...
