网络安全之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

......未完待续

相关推荐
老猿讲编程2 小时前
整车厂如何规划构建汽车集成安全团队的软件研发能力
安全·汽车
黑客老陈4 小时前
面试经验分享 | 北京渗透测试岗位
运维·服务器·经验分享·安全·web安全·面试·职场和发展
咕德猫宁丶5 小时前
探秘Xss:原理、类型与防范全解析
java·网络·xss
黑子哥呢?5 小时前
Linux---防火墙端口设置(firewalld)
linux·服务器·网络
hellojackjiang20116 小时前
开源轻量级IM框架MobileIMSDK的鸿蒙NEXT客户端库已发布
网络·即时通讯·im开发·mobileimsdk-鸿蒙端
WebDeveloper20016 小时前
如何使用美国域名中心US Domain Center和WordPress创建商业网站
运维·服务器·css·网络·html
车载诊断技术8 小时前
电子电气架构 --- 什么是EPS?
网络·人工智能·安全·架构·汽车·需求分析
KevinRay_8 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
2301_819287129 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la9 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生