BGP—边界网关协议

BGP

       动态路由协议可以按照工作范围分为IGP以及EGPIGP工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换;而EGP工作在AS与AS之间,在AS间提供无环路的路由信息交换,BGP则是EGP的一种。
       BGP是一种增强的路径矢量路由协议,同时BGP是拥有丰富的策略控制技术的外部网关协议。多运行于AS与AS之间

自治系统---AS

定义:由一个单一的机构或组织所管理的一系列IP网络及其设备所构成的集合

AS的来源:

  • 整个网络规模过大,会导致路由信息收敛速度过慢,设备对相同目标认知不同。

  • AS之间可能是不同的机构或企业,相互之间无法完全信任,使用IGP协议会存在暴露网络信息的风险。

AS号:16bit和32bit。---->IANA组织进行分配

  • 取值范围1-65534(0和65535保留)

    • 1-64511---------公有AS号

    • 64512-65534-----------私有AS号

BGP从设计上避免了环路的发生:

  • AS之间:BGP通过携带AS路径信息来标记途经的AS,带有本地AS号的路由将被丢弃,从而避免了域间产生环路。
  • AS内部:BGP在AS内学到的路由不再通告给AS内的BGP邻居,避免了AS内产生环路。

BGP基础

 运行了BGP协议的路由器,其所维护的路由表,是包含了整个互联网的所有路由信息

BGP特点

  • BGP是基于TCP协议进行数据传输,必须先建立TCP连接,再建立BGP会话连接。

  • 仅具备触发更新,而不再进行周期更新。

  • BGP协议只传递路由信息,不会暴露AS内部的拓扑信息。

  • 通常BGP被称为无类别的路径矢量协议

    • 无类别----传递时携带掩码信息

    • 矢量----方向性:谁传递给我的路由信息,谁就是我的下一跳。

    • 路径矢量----将一个AS看做一个整体,从而计算下一跳。

BGP与IGP协议有本质上的区别:

  • IGP协议主要的任务是将AS内部的未知网段信息计算获取到路由信息
  • 而BGP则主要是将通过IGP协议计算出的路由信息进行搬运,并不会计算路由信息

BGP特征

  • 可控性

    • BGP使用大量的路径属性,取代了IGP协议中的Cost,来对路由信息进行管控。

  • 可靠性

    • 依靠TCP完成可靠性建设。TCP端口179

    • 两台运行BGP协议的设备,需要网络管理员手工配置邻居的IP地址,从而实现数据通讯。

  • AS-BY-AS

    • 在BGP的视角当中,会将一个AS看做为一个整体

    • 因为BGP是将一个AS看做一个整体,但是在该整体内部数据传输时,并非相同,故BGP默认不支持负载均衡功能

BGP的对等体关系

      BGP因为传输层使用的是TCP协议,所以,只要在TCP协议可以正常建立会话的基础上就可以完成BGP会话的建立工作-------BGP支持非直连建邻。----前提网络可达。----->BGP协议的搭建是建立在IGP协议之上

  • EBGP

    • 位于不同自治系统的BGP路由器之间的BGP对等体关系。

    • EBGP对等体一般使用直连方式建立邻居关系,故而,TTL数值被设定为1

    • 两台路由器之间要建立EBGP对等体关系,需要满足如下条件

      • 两台路由器所属的AS不同

        • --->判别方式:本地设备通过网络管理员的配置知晓对端的AS,从而判断是否处于相同AS。

      • 配置EBGP时,peer命令所指定的邻居IP地址必须为网络可达,保证TCP连接可以正常建立。

  • IBGP

    • 位于相同自治系统的BGP路由器之间的BGP对等体关系。

    • IBGP对等体一般使用非直连建邻,故而TTL数值被设定为255

      缺省情况下,BGP协议使用报文出接口作为TCP连接的本地接口IP。但是在某些情况下,我们可以指定BGP对等体之间的会话IP地址;例如,在IBGP对等体关系中,常使用环回接口地址作为通讯的源地址。原因是因为loopback接口非常稳定,而且可以借助AS内的IGP协议实现冗余来保证可靠性。

BGP对等体之间交互原则

  • 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体(这样的水平分割是为了防止IBGP内部环路)
  • 从EBGP对等体获得的BGP路由,BGP设备发布给它所有EBGP和IBGP对等体(即发给所有BGP对等体)
  • 当存在多条到达同一目的地址的有效路由时,BGP设备会选择最优路由给自己使用,即用来发给邻居,同时上送给路由表
  • 路由更新时,BGP设备只发送更新的BGP路由

总结:

  • 无类别路径矢量协议

  • BGP使用单播更新来发送数据,基于TCP实现通讯。

  • 增量更新

  • 具有丰富的路径属性来取代IGP中的度量值参数,从而控制选路。

  • 可以在控制层流量的出入口通过路由策略实现可控性

  • 默认不被用于负载均衡-----会通过各种选路规则选择出一条最优路径信息。

  • BGP支持认证以及路由聚合。

BGP数据包

  • Open消息:是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。对等体在接收到Open消息并协商成功后,将发送Keepalive消息确认并保持连接的有效性。确认后,对等体间可以进行Update、Notification、Keepalive和Route-Refresh消息的交换。
  • Update消息:用于在对等体之间交换路由信息。Update消息可以发布多条属性相同的可达路由信息,也可以撤销多条不可达路由信息。
  • Keepalive消息:BGP会周期性的向对等体发出Keepalive消息,用来保持连接的有效性。
  • Notification消息:当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断。
  • Route-Refresh消息:通过OPEN消息告知BGP peer本地支持路由刷新能力(Route-Refresh capability)。

5种消息的应用:

  • 通过TCP建立BGP连接时,发送OPEN消息
  • 连接建立后,如果有路由需要发送或路由变化时,发送UPDATE消息通告对端
  • 稳定后要定时发送KEEPALIVE消息以保持BGP连接的有效性
  • 当本地BGP在运行中发现错误时,要发送NOTIFICATION消息通告BGP对等体
  • ROUTE-REFRESH消息用来通知对等体自己支持路由刷新

Route-refresh-----路由刷新包

作用:用来要求对等体重新发送指定地址族的路由信息

      一般为本端修改了相关路由策略之后让对方重新发送update报文,本端执行新的路由策略重新计算BGP路由。----前提提交为双方均支持路由刷新功能。

open包

TCP建立之后发送的第一个BGP报文,用于建立BGP对等体之间的连接关系。该过程无非就是进行参数协商的过程。

  • AS号

    • 不管接收到的open报文中的AS号是否与本地AS号相同,都不会影响到BGP对等体关系的建立。

    • 但是,如果open报文中的AS号,与本地建邻时由网络管理员编写的AS号不同,则邻居关系无法建立

      • BGP对等体在建立邻居时,会配置对等体所在的AS号,如果对端发送的open报文中所包含的AS号与本地配置不同,才会导致建邻失败。

  • RID

    • 如果两端RID相同,则对等体关系建立失败。

  • 认证字段

    • 如果认证方式或者认证数据不通,则导致建邻失败。

    • 该字段永远以MD5形式,存储在TCP的选项字段中。

  • Hold Time----保活时间

    • BGP在建立对等体关系时两端需要协商该参数,并保持一致。但是该参数并不会影响BGP对等体关系的建立

    • 如果两端的保活时间不同,则按照较小的一端数值来执行。

    • 如果在该时间内未收到对端发送来的报文信息,则认为BGP连接断开。该时间默认为180S,报文的周期发送时间为保活时间的三分之一,即60S。

    • 该参数可以设置为0,此时代表不发送keepalive报文周期保活。

    • 因为BGP会话是基于TCP会话建立,只要TCP判断连接断开,则BGP会话断开,故保活机制对于BGP而言并不那么重要,而设定保活机制原因仅仅是因为TCP判断会话断开所需要的时间过长,为了加快收敛速度,添加保活机制。

  • 路由刷新功能

keepalive包

作用:主要用来进行周期保活,临时充当确认报文

keepalive报文发送时间默认为保活时间的三分之一,即60S

keepalive报文的确认实际上是针对open报文中的参数信息进行确认。而非open报文本身。TCP协议进行确认的目的是为了保障数据传输的可靠性,而keepalive报文确认的目的是为了告知对端本地认可你的参数内容。

当收到的open报文中的参数通过验证,则回复keepalive报文;如果未通过验证,则回复notification报文。

Update包-----更新包

作用:用于在对等体之间传递路由信息,可以用于发布和撤销路由

  • 撤销路由字段长度

  • 撤销路由列表

    • length---->待撤销路由的掩码信息

    • perfix---->传输的IP地址前缀信息。

  • 路径属性字段长度

  • 路径属性列表

  • NLRI---->网络层可达信息

    • 内容与撤销路由列表相同

BGP的状态机

      OSPF的状态机是在描述整个协议的完整工作过程,而BGP的状态机仅描述的是对等体关系建立过程中的状态变化。-----因为BGP将邻居建立过程以及BGP路由收发过程完全隔离

      IGP协议在启动后,需要通过network命令激活接口,从而使接口具备处理IGP协议报文的能力。且network命令另一重含义就是发布路由,所以IGP协议无法将邻居建立过程以及路由收发过程隔离。

      但是BGP协议在启动后,每一个接口都具备处理BGP报文的能力,不需要其他任何操作,所以可以将邻居建立过程以及路由收发过程进行分割。

  • Idle----空闲状态

    • 等待网络管理员手工指定邻居信息,IP地址以及AS号

    • 当指定邻居信息后,会进入一个检查环节,需要检查手工指定的IP地址在本地路由表中是否可达,只有可达,才可以正常建立TCP会话,并转至Connect状态。如果不可达,则邻居关系建立失败,停留在Idle状态。

  • Connect----连接状态

    • 该状态会开启一个连接重传定时器---32秒

      • 等待TCP完成连接
      • 当该计时器时间超时,则本端重新发送一次TCP连接请求报文。在该时间段内没有收到任何一个回复报文。
    • 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态;

    • 如果TCP连接失败,那么BGP转至Active状态;

    • 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。

    • 如果BGP在连接重传定时器时间内,没有收到对等体的响应,那么BGP会继续尝试与对等体建立TCP会话,并一直处于该状态

  • Active----尝试状态

    • 第一次TCP会话建立失败,则进入该状态。

    • 如果建立成功,则进入opensent状态;如果建立失败,则停留在active状态。

    • 使用在connect状态开启的连接重传定时器来发送链接建立请求报文,当建立成功后,该计时器才会被关闭。

  • opensent状态

    • 本地发送出open报文,同时也将收到对端发送的open报文,并予以回复。

    • 如果收到的open报文中的参数本端认可,则回复keepalive报文;否则回复notification报文。

    • 如果回复keepalive报文,则进入openconfirm状态;如果回复notification报文,则进入idle状态。

  • openconfirm状态

    • 等待对等体对于本地发出的open报文参数的回复。

    • 如果收到的是keepalive报文,则认为BGP会话建立成功,进入到establish状态。

    • 如果收到的是notification报文,则认为BGP会话建立失败,断开TCP连接,回到idle状态。

  • Establish状态----建立状态

    • BGP会话建立的标志

    • 在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。

    • 如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。

    • 如果收到错误的Update或Keepalive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。

    • Route-refresh报文不会改变BGP状态。 如果收到Notification报文,那么BGP转至Idle状态。

    • 如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态。

BGP的工作过程

  1. 基于IGP、静态、直连路由协议实现IP可达---->前置要求,不是BGP工作过程

  2. 启动BGP协议,并指定邻居关系。

    1. 邻居之间使用单播进行数据传输,通过三次握手,建立TCP会话通道。

    2. 之后所有的数据通讯均基于TCP会话通道来传输,并由TCP协议来提供传输的可靠性机制。

  3. 使用open报文和keepalive报文进行邻居之间参数的协商,以及对等体关系的建立。

    1. open报文用来携带参数信息

    2. keepalive报文用来进行参数确认

    3. 最终生成BGP邻居表

  4. 使用update报文来传输BGP路由信息。该信息中将携带前缀信息、前缀长度以及路径属性。

    1. 设备会将自己发送的以及收到的所有BGP路由信息记录在BGP路由表中。

    2. 设备会对比不同路由表单,将其中最优的路由信息加载到全局路由表中。

  5. 此时路由收敛完成,BGP对等体之间使用keepalive报文进行周期保活(可选)。默认为180S,可以设置为0关闭周期保活性质。

  6. 如果出现出错误,使用notification报文告警;如果出现结构突变,使用update报文进行增量更新。

BGP的防环

EBGP的水平分割机制

专门为了解决EBGP对等体之间的环路问题

通过AS_Path属性进行防环,该属性会记录下该路由信息所经过的所有AS的AS号。当设备收到一条路由信息时,会查看该属性内容,如果其中存在有与本地AS号相同的信息,则不接受该路由信息。

IBGP的水平分割机制

BGP规定:当路由器从一个IBGP对等体学习到某条BGP路由时,它将不能再把这条路由信息通告给任何IBGP对等体------IBGP水平分割机制

解决思路:

  1. 将原本的IBGP对等体关系替换为EBGP对等体关系----在同一个AS下--------联邦

  2. 手工设定让某台路由器将从IBGP学习到的路由信息传递给某个IBGP对等体-----路由反射器

  3. 构建全互联的IBGP对等体关系。----暂时常用。

BGP的路由黑洞

BGP同步更新规则----为了避免BGP路由黑洞问题

当一台路由器从自己的IBGP对等体学习到一条IBGP路由时,它将不能使用这条路由或者将这条路由通告给其他设备,除非他又从IGP协议中学习到这条路由信息------要求IBGP路由与IGP路由同步

华为与思科默认禁止使用该规则,华为不允许打开该规则,思科允许打开该规则

解决方法:

  1. 让两台运行BGP设备在物理或逻辑上直连

  2. 所有设备运行BGP协议----暂时最常用

  3. 将BGP路由引入到IGP中。

  4. MPLS----多协议标签交换----现网环境使用的解决方案

BGP选路规则与负载分担

当到达同一目的地存在多条路由时,BGP采取如下策略进行路由选择:

  • 如果此路由的下一跳不可达,忽略此路由
  • 优选协议首选值(PrefVal)最高的路由 (华为设备特有属性)
  • 优选本地优先级(Local_Pref)最高的路由
  • 优选本地生成的路由
  • 优选AS路径(AS_Path)最短的路由
  • 比较Origin属性,依次优选Origin类型为IGP、EGP、Incomplete的路由
  • 优选MED值最低的路由
  • 优选从EBGP邻居学来的路由
  • 优选到BGP下一跳IGP Metric较小的路由

当以上全部相同,则为“等价路由”,可以负载分担

注:AS_PATH必须一致;当负载分担时,以下3条原则无效

  • 优选Cluster_List最短的路由
  • 优选Originator_ID 或者Router ID最小的路由器发布的路由
  • 比较对等体的IP Address,优选从具有较小IP Address的对等体学来的路由

根据BGP的选路原则以及BGP常用的路径属性,我们可以总结出9个影响BGP选路的重要参数,分别为:

  • Preferred Value
  • LOCAL_PREF
  • AS_PATH
  • ORIGIN
  • MED
  • 邻居类别是EBGP还是IBGP
  • IGP内部开销值
  • Cluster List /ROUTER_ID
  • COMMUNITY

以上参数都能直接地影响BGP的路径选择,其中我们常用的参数分别为LOCAL_PREF, AS_PATH和MED属性

BGP基础配置

使用直连接口IP地址来建立EBGP对等体关系
1、启动BGP协议
[r1]bgp 100   ----启动BGP协议,并且规定其AS号

2、配置设备的RID数值,一般选择设备的loopback接口的IP地址
[r1-bgp]router-id 1.1.1.1

3、配置BGP对等体信息,包含了对等体的IP地址以及对等体所在的AS号
[r1-bgp]peer 12.0.0.2 as-number 200   


使用环回接口建立非直连的IBGP对等体关系
1、启动BGP协议
[r2]bgp 200

2、配置设备的RID数值
[r2-bgp]router-id 2.2.2.2

3、配置BGP对等体信息
[r2-bgp]peer 3.3.3.3 as-number 200

4、修改数据包中的源IP,对等体双方均需要进行修改
[r2-bgp]peer 3.3.3.3 connect-interface LoopBack 0

使用环回接口建立EBGP对等体关系:

  • 一般在EBGP对等体设备间,会使用多条链路进行连接,起到备份的作用,故可以使用环回接口来建立。

    
问题:此时TCP会话会正常建立,转而建立BGP会话。但是,对设备而言,此时的对端IP检查会发现是通过静态路由或IGP路由才可实现网络可达。那么也就意味着此时需要通过多跳才能到达目的地,而数据包中的TTL=1,发现错误,故两端均会发送notification报文进行告警,并断开BGP和TCP会话。
    
修改TTL数值:两边均需要修改
[r4-bgp]peer 5.5.5.5 ebgp-max-hop 2   ---修改TTL=2,如果不加参数,则修改为255

使用==display bgp peer== 命令查看BGP邻居表

PeerVASMsgRcvdMsgSentOutup/downstateprefRcv
对等体IP地址版本号对等体所在AS号已经收到的数据包数量发送的数据包数量出站队列BGP协议的启动时间状态机表示收到的路由信息数量

手工建立邻居关系时,所指定的建邻的IP地址必须和收到的数据包中的源IP地址相同才可以正常建立邻居关系。否则,邻居关系将建立失败。---->修改发送方数据包中的源IP地址。

BGP的路由发布

通过network命令发布路由信息

在BGP中,network命令只能用来发布路由信息。对于BGP而言,只要是路由表中存在的路由信息,都可以通过network命令发布,并且发布的路由必须时本地可用的路由信息

[r1-bgp]network 1.1.1.1 32  ----发布1.1.1.1/32的路由信息

发布路由时,网络号和掩码信息必须与全局路由表中的信息一致

[r1]display bgp routing-table   ----查看BGP路由表

NextHop:谁发送的路由信息,下一跳就为谁。如果是本地始发,则该字段为0.0.0.0。

状态码----路由条目最前面的符号

*

  • 代表可用;设备收到路由条目后,会根据下一跳属性参数来查询本地路由表,查看该地址是否可达,如果可达,则认为这条路由条目可以使用,如果不可则,则这条路由条目不能使用

>

  • 代表优选;当设备收集到多条到达相同网段的路由信息时,将依据路径属性进行路由优选,从而选择出最优的一条路由信息,该路由信息可以被路由器加载到全局路由表中,并且向下一跳BGP路由器进行传递。

i

  •     代表这条路由信息时从IBGP对等体学习到的

如果一条BGP路由信息不可用,则这条路由信息不会参与到路由优选过程。BGP协议在传递BGP路由信息时,只会传递可用且优的路由条目,即*>的状态码。

  •     该条路由信息传递到R3后,因为AS-BY-AS规则,认为此时是在一个整体中进行数据传递,那么路由信息的内容不会发生改变,所有路径属性相同。
  •     这就会导致R3认为传递这条路由信息的人是R1,其下一跳属性为12.0.0.1。而R3设备验算失败,这条路由不可用,即没有*,也没有>

解决思路:

[r2-bgp]peer 3.3.3.3 next-hop-local  ----R2在给3.3.3.3传递路由信息时,将下一跳属性修改为本地

BGP在全局路由表中的下一跳是跟着BGP路由表中的下一跳属性一致

总结

  1. 完成所有路由器的IGP配置

  2. 使用直连接口建立EBGP对等体关系

  3. 使用环回接口建立IBGP对等体关系

  4. 使用connect-interface命令修改IBGP的源IP地址

  5. 使用next-hop-local命令修改路由传递的下一跳属性

  6. (可选)如果存在使用环回接口建立EBGP对等体,需要使用ebgp-max-hop命令修改TTL数值

通过重发布的方式发布路由
[r2-bgp]import-route ospf 1  ---将通过OSPF进程1学习到的路由信息重发布到BGP中。

Ogn----起源码属性

标识这条路由信息的起源
i

  • 代表这条路由信息时起源于AS内部使用network命令通告的路由信息。

e

  • 代表这条路由信息起源于EGP协议---现在几乎看不到。

?

  • 除了以上两种方式获取到的路由信息。

在BGP协议中,不在乎这条路由信息到底属不属于本地的直连,只在乎这条路由信息在本地全局路由表中是否可用。只要可用就可以通过BGP进行通告

参考链接:

BGP协议总结(比较详细,好理解)-CSDN博客

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

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

相关文章

前端铺子-NodeJS后端:基于Node.js构建高效后端服务的探索与实践

一、引言 随着前端技术的快速发展,越来越多的开发者开始关注前后端分离的开发模式。前端铺子作为一个旨在服务前端开发者的开源项目,近期推出了基于Node.js的后端系统。该系统通过整合Node.js、Nodemon和MySQL等技术,为前端开发者提供了一个…

Python-VBA函数之旅-tuple函数

目录 一、tuple函数的常见应用场景 二、tuple函数使用注意事项 三、如何用好tuple函数? 1、tuple函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://myelsa1024.blog.csdn.net/ 一、tu…

钡铼技术BL205模块分布式IO集成应用风电场状态监测

在风力发电这一绿色能源领域,高效、精确的状态监测对于提升风电场运维效率、保障设备安全运行至关重要。随着工业4.0和数字化转型浪潮的推进,传统的监测方式已难以满足日益增长的数据处理与分析需求。钡铼技术BL205模块的出现,为风电场状态监…

[图解]实现领域驱动设计译文暴露的问题04

0 00:00:00,960 --> 00:00:03,020 今天我们继续说一下 1 00:00:03,460 --> 00:00:05,350 实现领域驱动设计 2 00:00:05,630 --> 00:00:08,120 译文里面暴露的问题 3 00:00:10,630 --> 00:00:14,740 前面三个视频,我们提到了第①句 4 00:00:15,550 -…

【算法提升之赛事推荐】蓝桥杯没拿奖?你还有这个比赛的羊毛可以薅

目录 蓝桥算法双周赛-赛事介绍([官方连接](https://www.lanqiao.cn/oj-contest/))赛事奖励赛事概览快速上手划重点!1. 赛题解析及答疑2. 排行榜3. 基础体验 注意事项 蓝桥算法双周赛-赛事介绍(官方连接) 为了激励同学们…

Django自定义封装Response

Django自定义封装Response 目录 Django自定义封装Response定义Response类视图层示例 定义Response类 # utils/common_response.py from rest_framework.response import Response# 继承DRF的Response并重写__init__ class APIResponse(Response):def __init__(self, code100, …

排序-计数排序(Counting Sort)

计数排序(Counting Sort)是一种非比较排序算法,特别适用于一定范围内的整数排序。它的核心思想是统计每个值的出现次数,然后根据这些计数将每个元素放到其正确的位置上。计数排序的时间复杂度为O(nk),其中n是数组长度&…

ChatGPT4o免费体验?OpenAI 又在深夜放大招了!

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、GPT4o是什么?二、官网…

LeetCode2215找出两数组的不同

题目描述 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组…

正念冥想训练内容有哪些?流静冥想

正念冥想训练内容有哪些? “我做不到感恩,总觉得满世界都是欠我的。”同学A这样说。看得出来她的无奈、无力以及无头绪感。 “我无法对父母做出感恩的祝福,从他们那里我感受不到爱,感受不到关怀,体验不到感恩。”同学…

【Java】IDEA自动生成类图和时序图

【Java】IDEA自动生成类图和时序图 idea 的强大之处在于此,它包含了很多小插件,我们不需要再次下载相关插件,只需要在idea中小小的设置一下就可以了,下面是设置方法,我用的是idea2020版本 打开设置File -> Settings->Diagr…

vue3 中 使用 antd中的select 组件的带搜索框 展开后可对选项进行筛选搜索功能

鼠标进入以后下拉显示&#xff1a; 输入字符串以后&#xff1a; 可以看出对数据进行了筛选。 具体代码&#xff1a; 结构上&#xff1a;<a-selectv-model:value"formState.formFlow"show-searchallowClearplaceholder"输入选择流程":options"op…

React Native 之 开发环境搭建(一)

1. 安装Node.js&#xff1a; Node.js是React Native开发的基础&#xff0c;因此首先需要安装Node.js。强烈建议始终选择 Node 当前的 LTS &#xff08;长期维护&#xff09;版本&#xff0c;一般是偶数版本&#xff0c;不要选择偏实验性质的奇数版本。 如果你希望更方便地管理…

【数据结构】数组循环队列的实现

队列&#xff08;Queue&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循FIFO&#xff08;First In First Out&#xff0c;先入先出&#xff09;的原则。队列只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#…

C++11 线程池:轻量级高并发解决方案

C11 线程池&#xff1a;轻量级高并发解决方案 线程池&#xff08;Thread Pool&#xff09;是一种线程管理的机制&#xff0c;它包含了多个预先创建的线程&#xff0c;用于执行多个任务&#xff0c;这些任务被放入任务队列中等待执行。 满足我们的生产者和消费者模型。 线程…

java面试题:判断字符串包含字母、数字、空格、符号的数量

在Java中&#xff0c;你可以使用正则表达式来检查字符串中包含多少个字母、数字、空格和符号。也可以使用基础api来实现业务逻辑&#xff0c;方法如下&#xff1a; 1 使用Character类的静态方法 以下代码定义了一个countCharacters方法&#xff0c;它遍历字符串中的每个字符&a…

戒烟网站|基于SSM+vue的戒烟网站系统的设计与实现(源码+数据库+文档)

戒烟网站 目录 基于SSM&#xff0b;vue的戒烟网站系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1网站功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主…

REACT 在组件之间共享状态

有时&#xff0c;您希望两个组件的状态始终一起变化。要做到这一点&#xff0c;请从他们俩身上删除状态&#xff0c;将其移动到他们最近的共同父级&#xff0c;然后通过道具将其传递给他们。这被称为提升状态&#xff0c;这是编写 React 代码时最常见的事情之一。 举例提升状态…

从ROS到数据库:用Python将ROS话题消息保存到数据库

观前提醒&#xff1a;本博客介绍如何使用Python订阅ROS话题,并将接收到的消息保存到SQL数据库中,包括MySQL和SQL Server两种情况。 使用Python订阅ROS话题并将消息保存至MySQL数据库 下面我们将详细介绍如何使用Python订阅ROS话题&#xff0c;并将接收的数据保存到MySQL数据库…

Postman基础功能-Collection集合和批量运行

一、Collection&#xff08;集合&#xff09;介绍 当我们对一个或多个系统中的很多接口用例进行维护时&#xff0c;首先想到的就是对接口用例进行分类管理&#xff0c;同时还希望对这批接口用例做回归测试。 在 Postman 中也提供了这样一个功能&#xff0c;就是 Collec…