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

HCIP-Datacom Core Technology V1.0_7 BGP基础

用于自治系统之间动态交换路由信息的路由协议,就是BGP,BGP的前身是EGP,它有很多缺陷,在设计之初,它只能发布可达路由信息,而无法对路由信息进行优选,同是也没有考虑到环路的问题,因此很快就被淘汰了,后来设计出了BGP协议来取代它。和EGP最大不同在于,BGP在路由信息的选择上面,它有很多方式,甚至可以解决路由环路的问题。

BGP概述

OSPF和IS-IS都属于IGP,他们都有一个非常重要的缺陷,随着网络规模扩大,路由的数量呈几何倍增长,在这种情况下,在后期管理和维护的时候,IGP协议已经不能够满足需求,因此为了分割网络规模,便于后续的维护和管理,提出了自治系统这个概念。那么 IGP在同一个自治系统里面内部进行运行,维护自己本自治系统区域的路由,这样就会减轻IGP的负荷。

自治系统指的是用同一个组织管理下使用同一路由策略的这样的一个设备的集合,那么不同的自治系统,用不同的自治系统号去分区,它分为两字节和四字节的表达方式,那么两字节的表达方式里面,它的取值范围是1~65535,但是在后期的使用过程中发现它并不够用,于是把它扩展成四字节,那么在四字节它的取值范围最大可以取得4294967295,这么大的一个范围。

不同的自治系统之间,如果需要通信的时候,应该使用什么样的路由协议进行传递。

不同的自治系统之间难道不可以用路由引入的方式去解决吗?难道非要用BGP才可以吗?

自治系统之间需要怎样的连接呢?第一种通过直连链路的方式,第二种是通过VPN,逻辑直连,这样能够实现一个传递路由的这样的一个概念。

不同自治系统之间是否可以以路由引入的方式,来传递路由,而不用BGP。

不同的自治系统属于不同的机构,不同的公司,那么不同的自治系统之间,它对于内部的这样的一个网络信息是否要保密,而以路由引入的方式,把不同的自治系统的路由互相引入到各自的公司里面,对于安全问题是不是很难去规避,另一个非常重要的问题是什么呢?随着网络规模不断的扩大,如果自治系统之间采用路由引用的方式去传递路由,这样设备所需要维护的路由表的规模就很大,一旦网络发生动荡,路由器进行网络收敛就变重非常缓慢。从而影响用户的通信质量。因此在自治系统之间,采用路由引入的方式去传递不同自治系统的路由是有很大的问题的。除了安全问题,更需要保证一个可靠性。

为了更好的在自治系统之间传递和维护路由,提出了BGP协议,相较于传递的IGP协议,BGP协议有哪些特征呢?第一个BGP协议是基于TCP的,因此是非常可靠的,第二,只传递路由信息,不会暴露自治系统内部的拓扑信息,BGP协议不像IGP协议一样,会通过各种算法去计算生成路由,BGP协议它更像是路由的搬运工,把IGP学习到的这些协议,搬到BGP这辆大卡车上,然后运过去,同是隐藏了自治系统内部的拓扑。从而提高了网络的安全性,第三点,就是触发式更新,这样的好处是什么呢,如果路由规模非常大,维护的路由条目是几万条,以周期性的方式在自治系统之间传递路由,这样路由器所要进行收敛的时间以及所要维护的这样的一个资源是非常巨大的,于是为了后期方便维护,进行触发式更新,只对网络产生波动的路由进行更新和收敛,从而解决了网络稳定的这样一个问题。

在20世纪80年代初,其实就提出了自治系统这样的一个概念,那是因为随着网络规模不断的扩展,IGP已经没有办法更好的去维护和管理这样一个巨大规模的网络,因此伴随着自治系统的概念,提出了EGP这个协议。也就是BGP的前身,EGP有很大的缺陷,它可以理解为叫做来者不拒,只负责传递可达的路由,其他的包括路由信息的选择,环路问题,于是提出了BGP,BGP作为EGP的取代者,在设计的方面就考虑到了如何解决环路的问题,以及如何对于路由信息进行一个优先,随着时代的发展,BGP分为很多版本,现在最常用的是BGP-4,这个版本是基于IPv4的网络,同是BGP还衍生出了BGP4+这个版本,能够支持更多协议簇,比如说组播、IPv6、MPLS等等,扩展性非常强。

第一种情况是在企业内部的互通,如果某一个企业它在不同的地理区域有各自的分公司,就可以通过BGP协议进行传递,不同地理区域的分公司的路由。

第二种情况是企业和运营商进行互通,这样运营商就能够得到企业内部的路由,同是企业也能够通过运营商的网络,去访问想要访问的其他网络。

BGP的基本概念

BGP作为自治系统之间传递路由的这样的一个协议,它属于矢量型路由协议,随着网络的发展,BGP 衍生出了很多版本,现在最常用的是基于IPv4的BGP-4这个版本,如果还要支持其它地址簇,可以用后续扩展出来的MP-BGP来承载,看一下BGP的特点,

BGP能够承载大量的路由信息,它能够支持非常大规模的网络,可以承载几千几万条这样的一个路由,因此,它使用的是触发式更新,而不能以周期性的方式去更新路由,这样对于网络负荷会产生很大的压力。

BGP是采用TCP,端口号179作为传输层协议,也就是说BGP是应用层协议。

在传递大量路由信息的过程中,为了实现路由信息的优选,提供了丰富的策略,这些策略能够帮助我们在选入的时候更加灵活,同时为了保证网络的可靠性,路由器提供了路由聚合和路由衰减功能。

无论是触发式更新以及丰富的策略,包括我们提供的路由衰减,和路由聚合这样的功能,都和它的大规模网络有关,它们之间其实都是相辅相成的关系。在BGP扩展应用上,会发现它能够支持MPLS以及MPLS VPN的这些应用。帮助客户去传递VPN路由,由此可见BGP这个协议在现网中是非常重要的一个路由协议。

BGP特征

BGP是基于TCP连接而建立的

BGP发言者,发言者可以理解为发送BGP报文的这样的一台路由器,也就是运行BGP协议的设备叫发言者。

对等体,对等体其实就是两个BGP的发言者互相交换BGP的路由表,这样的两台路由器就成为了对等体,同时会发现BGP它只发送增量的更新路由,或者说触发式更新,不再进行周期性更新,而且BGP也能够承载大量的路由信息。

以图中的案例来看一下,这两台路由器,分别为各自的BGP  Speak,然后基于TCP会话建立了邻居关系,它们之间就成为了对等体,同时路由器产生了大量的路由,给了另一台路由器,会发现它承载的路由信息数量是多少,70万,是不是非常的庞大,如果这么庞大的规模的路由表,以周期性的形式去泛洪,那么对于设备进行收敛,是不是存在着很大的压力,这也是它触发式更新或者增量更新的一个原因。

之前一直提BGP相较于它的前身EGP而言,它能够对路由进行优选和控制,它是以怎样的方式来控制和优选的,BGP作为矢量路由协议,它包含了多种路径属性,就是通过路径属性,来进行路由信息的优选。

BGP对待体关系

对等体之间需要建立怎样的关系,和OSPF,ISIS不同,因为BGP是基于TCP会话建立而成的,所以他在建立邻居的过程中,可以跨越路由器,建立邻居关系。BGP在建立对等体关系时并不需要直连,那么BGP对待体关系有哪几种?

一共分为两种,一种是EBGP ,一种是IBGP,其实非常容易理解,EBGP邻居关系指的是两台路由器运行在不同的自治系统之间,建立邻居关系,它们属于EBGP邻居关系,而所谓的IBGP邻居关系指的是运行在同一个自治系统内部,他们之间建立邻居关系。

在建立EBGP邻居关系的时候,有几个重要的因素。

这两台路由器一定要属于不同的自治系统,如果把它们划分到同一个自治系统,是无法建立起EBGP邻居关系的。

在配置EBGP邻居关系的时候,peer命令后所指定的这样的一个对等体,跟建立邻居关系的IP地址一定是可达的,如果不可达,依然是无法正常建立邻居关系的,

第1,通过TCP会话来建立起BGP的邻居连接,要经历TCP的三次握手,首先先启动BGP的一端,发起了TCP连接,图中的案例是由R1先启动的BGP,使用随机端口向R2的179端口号发起TCP连接,TCP连接完成三次握手之后,进行参数协商,参数协商完成之后,就正式建立了连接关系。那么在建立起TCP连接的过程中会有怎样的问题,TCP的连接分为主动端,以及被动端,实际上,这两台设备都会向对端发起TCP连接,也就是说,实际上BGP会话在建立的过程中会启用两个TCP的连接,那么这两个TCP的连接是都使用还是只使用一条,答案是只使用一条,那该使用哪一条,也就是说在后续发送报文交互过程中,要决定使用哪一条TCP连接,在BGP完成三次握手之后会发送一个报文,是Open报文,Open报文里面会携带了一些参数的信息,其中有一个非常重要的参数信息是BGP标识符,也就是BGP identifier,标识符指的是什么呢?是Router ID,也就是通过标识符来确定使用哪一个TCP会话,当两台设备之间建立起两条TCP会话之后,会互相发送Open报文,同时在Open报文里面开始参数的协商,其中会查看BGP的标识符,将对端的Router ID和自己本端的Router ID进行比较,会选择Router ID大的一端发起的TCP的连接。而Router ID较小的一端主动发起的TCP连接会被关闭。这也Open参数去协商的一个重要的原因。假设路由器1,Router ID是1.1.1.1,路由器2的Router ID是2.2.2.2,在建立起TCP连接的过程中,他们建立起两条会话,一条是会话是由R1主动发起的,另一条会话是由R2主动发起的,当tcp的三次握手建立完成之后,他们会互相发送Open报文,R1收到R2发过来的Open报文之后,会发现你们携带了一个BGP的标识符,查看R1的Router ID,会发现R2的Router ID比R1的Router ID(大),那么R1就会采用由对端主动发起TCP建立会话的那条链接,发送后续的报文,而自己会话的一条会被关闭,这是是用来确定使用哪一个TCP会话的一个过程。

BGP对等体建立完邻居之后,就正式开始发送路由信息,路由信息是通过BGP的Update更新报文,发送给对等体。

基于TCP连接的源IP地址,BGP是基于TCP的会话来建立邻居关系,那么这台设备该采用哪一个作为源IP地址来建立起TCP会话,正常情况下BGP是使用出接口作为TCP的本地接口,在实际的部署的情况下,IBGP一般推荐使用Loopback接口的IP地址。

如果在建立起EBGP对等体的时候,采用Loopback接口,能不能建立起会话过程呢?答案是可以的,在建立起EBGP的时候,直接使用直连的接口,作为源IP地址,而不采用Loopback接口,这进而就会涉及到一个BGP多跳的问题。默认情况下,EBGP建立连接的ttl值为1,若使用Loopback接口作为地址,需要将ttl值设置为2。

BGP报文类型

BGP一共有5种报文,同时它们有相同的头部,这5种报文分别是,Open,Update,Notification,Keepalive,Route-Refresh。

Open报文是用来进行参数协商的。

Update报文是用来发送路由更新。

Notification报文是用来中止对待体关系,比如说发生了一些错误报告。

Keepalive报文是用来保持邻居之间为活状态。

Router-Refresh报文是进行路由刷新能力的支持。

头部只有3个字节,分别是标识BGP边界的Marker,以及报文的长度Length,最后一个是用来标识采用的是哪一个BGP报文,一共有5种类型。

Open报文是在TCP建立完成之后的第一个报文,它主要是用来协商两台设备之间的一些参数,第一个要协商的参数是版本号,

第二个是用来去比较自己本端的自治系统和对端的自治系统是否在同一个AS内,用于确定EBGP邻居关系,还是IBGP关系。

第三个是Hold Time,Hold Time是用来保持时间,就是在协商过程中用来确定这个时间,这个时间的作用是什么呢?因为最后邻居建立完成之后,会互相发送Keepalive报文,如果在Hold Time时间内,没有收到对端给我发送的keepalive报文,就认为邻居失活,邻居断开,这有点类似于OSPF中的HelloInterval和DeadInterval是一样的,默认是180秒。而Keepalive报文的发送时间间隔是多少呢?在参数协商中并没有去协商它的时间,它的时间是由Hold Time去控制的,是它的1/3,也就是60秒,也就是说,两台设备正常建立邻居关系之后,每60秒互相发送一次Keepalive报文,如果180秒内没有收到邻居发送的keepalive报文,就认为邻居失活,断开连接,

下一个是BGP的标识符Identifier,也就是用来标识这台路由器的Router ID.

最后一个是字节是Optional Parameters,可选项内容,它包含了BGP在协商过程中能够支持的其它能力,比如说是否支持认证,是否支持其它协议处理,都是通过这个字节进行协商的。

Update报文是用于在对等体之间去传递路由信息,包括发布以及撤销,在Update报文里面最需要关注的字段分别是哪些呢?

第一个NLRI,网络层可达信息,如果是用来发布或者更新路由信息,就通过网络层可达信息进行(发布),

第二个,如果是用来撤销路由,会通过Withdrawn Routers字段来进行撤销,其中Update报文这两个字段比较重要,尤其撤销路由是通过这个字段进行撤销的。

Notification这个报文比较简单,当BGP检测到一些错误,比如说链路断开或者接口地址不可达,它就会向对端发送Notification报文,通过里面的错误码和错误子码来告知对端,错误的具体类型,从而终止断开链接,其实类似于一个警告通知一样,向邻居发送一些告警。

这个报文是用于两台设备之间,让对方感知这台设备依然是你的邻居,处于一个存活的状态,它会定期性的发送,间隔是60秒,同时它的报文里面只包含了报文的头部,和BGP报文的头部是一模一样的格式,而不包含其它任何字段。

Route-Refresh,刷新报文,用来向对等体重新发送指定路由地址的路由信息,如果说本台设备,发生的一些策略(变动),想让对方重新发送一些Update更新报文,让我重新学习,那么就可以使用Route-Refresh这样的一个报文去通知对方。但是Route-Refresh这样的一个能力,并不是所有设备都支持的,它们在一开始交互Open报文里面,其实就会进行一个能力的支持,进行参数的协商,表明该设备是否能够支持Route-Refresh这样的一个能力,如果它支持这个能力的话,后续管理员就可以通过命令,手工进行软件的复位,这样就可以保持BGP邻居在不中断的情况下,去更新路由表,它里面包含了一些字段,比如说AFI,地址族,以及SAFI,子地址族。

BGP状态机

随着报文的交互,BGP的邻居状态会发生一系列的变迁,BGP的邻居状态机一共分为以下这6种。

idle状态,表明开始准备TCP连接,也就是说准备启用BGP.

Connect状态,正在进行TCP连接,

Active状态,如果TCP建立失败了,就会进入到Active状态,反复尝试进行TCP连接。

OpenSent状态,如果TCP连接建立成功,就会进行到OpenSent状态,开始发送Open报文,Open报文开始参数的协商,

OpenConfirm状态,当参数,能力协商成功后,开始发送Keepalive包,同是等待对方给我发送Keepalive报文,

Established状态,已经收到对方的Keepalive包,表明对方的邻居已经建立成功,这个时候双方路由器正式建立一层邻居关系,然后通过Update报文开始通告路由信息。

假设R1开始配置BGP,然后建立起TCP连接,如果无法建起TCP的连接,就会一直处理idle状态,什么时候会一直处于idle状态,正常情况下,如果缺乏对等体路由就会处于这个状态,比如说R1和R2是通过LoopBack接口建立邻居关系,但是路由表里面没有对方LoopBack接口的路由,就会导致无法发起TCP的连接,因此就会一直处于idle的状态。

当成功查到去往对待体路由之后,就会发起TCP的三次握手,TCP三次握手成功,就会进入到Connect状态,如果失败,就会进入到Active状态,同是反复尝试TCP连接,什么情况下TCP的连接会建立失败,进入到Active状态,如果把TCP179端口号禁用,那么就无法完成TCP的3次握手,也就是无法建立起TCP的会话,就会一直反复尝试建立起TCP的连接,那就会停留在Active状态。

BGP对等体表

BGP路由表

这个表和普通的ip路由表不同,最常见的是Network,去往目的地址和掩码,第二个是下一跳,剩下的MED,本地优先级,协议优先值以及路径可以暂时不知道,在后续的课程中会介绍这些属性是如何影响BGP进行路由选路。同是注意到这张表会逻列去往目的的多条路径,但实际上只有一条路径是最优的。如何确定这条路径是最优的?如果想查看具体某一条明细路由的具体信息,可以在display bgp routing-table后面,跟上具体的IP地址。

这里面包含了路由的来源,下一跳,以及它是否会被选择优选以及它的属性。

BGP路由的生成

其实,生成这个词并不是那么的恰当,BGP不像IGP,它并不计算和产生路由,它是通过路由引入的方式,把路由表里面已有的路由信息导进BGP表里面,然后在传递给对等体,所以说与其说是BGP路由的生成,用BGP的注入这个词更加准确一点。 

那么BGP是如何注入路由的呢?一共有两种方式,分别是Network和Import-route。

比如图中的案例,BGP建立起邻居之后,查看BGP邻居表,会发现这张表是空的,没有任何信息,以两种方式中的其中的一种,将IGP里面存在的路由条目,注入到BGP表里面,这个时候 再查看BGP路由表,会发现里面就包含了注入的这些路由信息,然后以Update报文的方式进行更新,发送给对待体。和IGP一样,BGP也支持路由聚合。

这两种路由注入方式有什么区别。

通过network命令注入路由,非常精确的注入路由信息,假设IGP的路由表里有几千几百条路由信息,但是实际在传递的过程中只想传递两条,分别是10.1.0.0/24和10.2.0.0/24,那么怎么办呢?可以通过Network的命令方式将这两条路由信息,注入到BGP路由表里面,然后通过Update报文进行发送,传递给R3,如图,在BGP的进程下,通过命令的方式写进这两条路由,然后这两条路由就会出现在本地路由器,也就是R1的BGP的路由表里面,然后通过Update报文的方式去发送给R3,这个时候,再查看BGP路由表里面,就会学习到相应的路由

NetWork的方式的优点是在于可以精细的把控想要的这样的一个路由信息,但是缺点是什么呢?假设有几千几百这样的路由需要注入到BGP路由表里面,那么是否需要通过Network这样的命令去敲几千几百条这样的路由信息,这样的方式过于繁琐。

可以采用第二种方式,就是import-route引入的方式注入路由,直连路由、静态路由、OSPF、ISIS其他协议的路由,也就是说,除了非BGP其他普通的IGP协议路由都可以注入到BGP路由表中, 以import-route的方式进行引导,如果要一次性注入几千几万条,这就比Network的方式更加轻松。

BGP也支持路由聚合,图中的案例,它是如何实现路由聚合的,假设R1的BGP路由表分别有10.1.1.0/24、10.1.2.0/24、10.1.3.0/24、现在将这三条路由聚合,聚合成10.1.0.22/22,可以通过aggregate这条命令去进行手工聚合,如果不加detail-suppressed,传递给R3的时候,会将明细路由和聚合后的路由一起发送给R3,因此为了抑制明细路由,只传递聚合路由,在聚合路由后面加了一条命令,detail-suppressed,这样的话,发送给R3的时候,只发送聚合路由,而三条明细路由就不再发送给R3。

通告原则

在通过过程中需要遵循以下4个原则。

只将自己最优的路由发布给邻居,通告原则一是只发布最优且有效的路由,说明它只传递一条路由,给R3,传递的是上面的一条。

BGP路由表里面的一此标识符的概念,首先*号代表是有效的,代表这条路由可达,>大于号代表这条路由是最优的,所以*加>组合在一起,就代表这条路由在BGP路由表里面是最优的且可达的。因此就会将这条路由,上面这条,下一跳11.1.0.1的路由传递给R3,而下面的这条是不传的,至于为什么上面这条是最优的?

从EBGP获得的路由会传递给所有的对等体,比如说R2和R1建立起EBGP邻居关系,现在R1的BGP路由表里面有10.1.0.0/24这条路由,通过EBGP传递给R2,R2学习到了,R2学习到了之后会将这条路由传递给R3和R4,这个时候查看R3和R4的BG路由表里面会发现有关于10.1.0.0/24,其中R3和R2是IBGP邻居关系,R4和R2是EBGP邻居关系。

通告原则三是指从IBGP获得的路由不会发布给其他的IBGP对等体,如果要发布的话,就会和图中这个案例一样,发现路由成环了,首先R2和R1、R3,他们之间互为IBGP邻居关系,假设R2上面现在有一条10.0.0.0的这样的一个网段,通过IBGP传给R1,也通过IBGP传给了R3,现在R1和R3通过IBGP从R2那里学习到去往10.0.0.0的路由,同时R1和R3又互为IBGP邻居关系,如果这个时候他们互相去传递这条路由,就会发现路由成环了,于是通告原则三不让他们传,通过IBGP获得的路由不再传递给IBGP邻居,这样就防止了环路的形成,也就是说R1和R3通过IBGP从R2那里学习到去往10.0.0.0这条路由,因为R1和R3又互为IBGP邻居关系,它们之间不再传递10.0.0.0这条路由,就防止了路由环路的形成,因此,这条规则也称为IBGP的水平分割,是用来解决环路的问题的,从这个应用场景看上去好像没有什么缺点。但是如果换个应用场景,这个通告原则又会产生什么问题呢。

如果是这样的拓扑结构(R2和R3没有直接连接),现在R1和R2及R3分别是IBGP邻居关系,R2和R3没有任何关系,现在R3想要去学习R2上面的某一段网段,假设还是10.0.0.0这条网段,现在R2将这条网段通过IBGP传给了R1,但是碍于IBGP水平分割这条通告原则,不能将10.0.0.0路由传给R3,就导致R3无法学习10.0.0.0这条路由,因此在这个特殊的应用场景下,IBGP的水平分割成为了限制学习路由的一个障碍了,所以面对这个问题,应该怎么解决呢。R2和R3之间可以建立起IBGP邻居关系,那么就可以通过R2学习这条路由,但是实际上有个问题,R2和R3之间实际上没有直接链路,逻辑上认为它们直连,建立起了IBGP邻居关系,跨域了R1,实际上传递路由还是要通过R1去传递的。那么这种解决办法可以称为叫做IBGP的全互联。也就是说所有路由器之间两两建立起BGP的邻居关系。从而保证全网路由都可以学习到。但是这种方法过于繁琐,因此可以用特殊的机制,比如说路由反射器RR来解决IBGP的水平分割问题。

这条通告原则可能比较抽象或者说比较复杂。当一台路由器通过IBGP获得的路由将它传递给EBGP对等体时,他不传。除非它又从IGP协议学习到这条路由。这称之为BGP的同步原则。

R3通过IBGP,也就是从R2那里学习到到去往10.0.4.0的路由,原本是要通过EBGP要传递给R5的,但是在传递给R5这条路由之前,他会首先查看一个自己底层的IGP协议表,也就是IP路由表,只有它的IP路由表里面存在去往10.0.4.0的这条路由,才会将这条路由通过EBGP的方式传给R5,如果IP路由表里面没有,就不传递给R5,这是因为即使我传递出去,但是我的IP路由表里面没有这条路由,中间的某一台设备一定会发生路由黑洞,会导致数据不通,所以传递这条路由给 R5,没有任何意义,这就是通告原则4。这里注意一下,通告原则4在华为某些型号上默认是关闭的,同时无法开启,为什么呢?即使开启了这条通告原则,有意义吗?假设R3,IGP里面,有路由,我就传,没有就不传,哪怕开启了这一个功能,能从根据上解决数据通信里面通和不通的问题吗?并没有,他只能够去识别这条路由有和没有,并不能解决通和不通的问题。从本质上,开启这条命令和不开其实没有什么区别。并不能帮助我们解决通和不通的问题,面对路由黑洞这个问题,可以用什么办法去解决呢?

第一个,是否可以在R1上运行BGP路由协议,同是和R2和R3建立起IBGP的全互联,帮助去传递路由,

第二个,可以通过路由反射器,来解决这个问题。

第三个,可以用MPLS陪着技术,来解决路由黑洞这个问题,

BGP基本配置

BGP基础实验

http://www.xdnf.cn/news/19472.html

相关文章:

  • (纯新手教学)计算机视觉(opencv)实战十二——模板匹配(cv2.matchTemplate)
  • SpringAI模型评估
  • 刀片电池 vs 三元锂:家庭用车选谁更长寿?
  • 海康相机开发---HCNetSDK
  • 【2025ICCV】
  • SpringCloud-服务注册-服务发现
  • 35.序列(中)
  • 植物来源细胞外囊泡的脂质组学分析
  • 【项目思维】这是一份嵌入式软件开发的大纲(简化版)
  • LabVIEW自动抗乳化测试仪
  • 高效大规模创新3D重建模型iLRM
  • 进阶篇(上):大模型训练工作流(LoRA 微调实战)
  • 链表相关OJ题
  • 2025年AI智能体开源技术栈全面解析:从基础框架到垂直应用
  • RocksDB 在 macOS M 系列 上运行时报错的解决方案
  • 音视频面试题集锦第 36 期
  • Unity:XML笔记
  • 在 Qt/C++ 中查找最近点并截断 QVector<QPointF>
  • 驱动——miscdevice框架 vs 标准字符设备cdev框架
  • Android开发之add方式添加Fragment生命周期不响应
  • 单例模式
  • Selenium 自动化测试实战:绕过登录直接获取 Cookie
  • 希尔排序。
  • Java面试-微服务(业务问题)
  • QT控件QPlainTextEdit、QTextEdit与QTextBrowser的区别
  • 【秋招笔试】2025.08.31小红书秋招笔试真题
  • 解读数据中台建设汇报方案【附全文阅读】
  • 淘天二面总结
  • 链表算法知识汇总
  • lesson51:CSS全攻略:从基础样式到前沿特性的实战指南