IGP高级特性简要介绍(OSPF-上篇)

OSPF高级特性

一、OSPF_提升故障收敛及网络恢复速度

1.FRR与BFD快速恢复故障

1.1 FRR

在传统转发模式下,当到达同一个目的网络存在多条路由时,路由器总是选择最优路由使用,并且下发到FIB表指导数据转发。

当最优路由故障时,需要等待路由收敛完成重新选路,然后再把优选路由下发到转发表,业务才能恢复。

在这个过程中,业务中断时间较长,不能满 足业务的要求。

为此FRR快速重路由(Fast Reroute)就提供了解决方案:其核心就是找到一个在主用链路故障后的下一跳邻居节点,如果这个邻居节点目的节点最短路径不经过源节点,则这个邻居节点为无环备份下一跳。

源节点:源
邻居节点:源节点的相邻节点
目的节点:目的

通俗介绍:

在这里插入图片描述

案例:

​ 1、无FRR情况下查看4.4.4.4路由信息,只能看到一个下一跳。

在这里插入图片描述

​ 2、如果启用了FRR功能,将会出现BkNextHop备份下一跳,当主下一跳故障之后将立即切换到由FRR计算的备用链路转发数据。
在这里插入图片描述

反转:虽然是具备了备用转发路径,但前提是感知到链路故障之后才会进行切换,如果设备无法快速感知到链路故障,那么实际上还是存在丢包过多的情况。

​ 比如下面这种情况可能会造成设备无法快速感知链路故障:

​ 该结果就是,AR1需要等待40秒的超时时间才能感知到与AR2之间的链路存在故障。因此就非常需要另一项技术进行快速的故障感知(BFD
在这里插入图片描述

FRR的配置

OSPF进程中开启frr并使用LFA算法进行计算无环下一跳
ospf 1
 frr
  loop-free-alternate
1.2 BFD

BFD(Bidirectional Forwarding Detection,双向转发检测),提供了一个通用的标准化的介质无关协议无关的快速故障检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状态。

(1)BFD如何实现快速感知故障的呢?

​ BFD通过静态动态的方式建立起BFD会话,并在极短的时间内相互发送BFD报文,如果对方在一定时间内没有回复BFD报文,则BFD会话状态将变成Down表示出现故障。

(2)BFD如何与FRR配合解决故障快速收敛?

​ 以OSPF为例,FRR计算出备份下一跳之后,只要当原先链路断开之后才会快速切换至备份下一跳。当设备无法快速感觉到链路发生故障时,只能等待40秒邻居老化之后才会进行切换。

​ 为此使用BFD与邻居自动建立会话实现故障快速检测,实现当链路断开之后的3秒钟BFD会话断开。

​ 因为BFD与OSPF进行联动,故当BFD会话断开之后,其相应的OSPF邻居关系也会同时断开,从而实现链路故障后的快速切换。

(3)如何应用BFD?

​ 全局启用BFD功能之后,通过静态或动态方式建立起BFD会话,然后将其与OSPF、ISIS等路由协议进行联动,实现网络故障后的快速感知。

例子1:OSPF与BFD联动

# 全局开启BFD功能
[Router] bfd

# 进程中应用BFD功能
[Router] ospf 1
[Router-ospf-1] bfd all-interfaces enable

# 默认BFD发送和接收间隔均为1秒,丢包3次则为故障,即BFD对端故障后3秒将会检测到。
# 若想继续提高检测速度,可将发送和接收间隔缩短至 500毫秒,即1.5秒后检测到故障。
# 发送间隔
[Router-ospf-1] bfd all-interfaces min-tx-interval 500
# 接收间隔
[Router-ospf-1] bfd all-interfaces min-rx-interval 500

例子2:BFD与ISIS联动

[Router] bfd
[Router-bfd] quit

[Router] isis
[Router-isis-1] bfd all-interfaces enable
[Router-isis-1] quit

:详细介绍与案例于后面章节1.1.0 IGP高级特性之BFD 中继续介绍

2.OSPF的智能定时器 加速网络收敛

2.1 RPC

(Partial Route Calculation,部分路由计算)

​ 当网络上“路由”发生变化的时候,只对发生变化的路由进行重新计算,RPC不计算节点路径,而是根据SPF算法算出来的最短路径树来更新路由。

​ 因为只有“路由”变动,即拓扑本身没有变,变的只是最外边的“树叶”。

如下图:不管R5增加了多少个路由,只要没有影响原先计算好的“拓扑”结构,均可新增入网络中。新增之后R5会向其它节点通告新网络接入。

在这里插入图片描述

2.2 I-SPF

(Incremental SPF,增量最短路径优先算法)

​ 当网络拓扑改变的时候,只针对受影响的网络节点进行“路由”和“拓扑”计算,而不是全网节点重新进行路由计算。

如下图:当R5节点下接入新节点R6,那么R5将会把R6新接入的信息通告给其它节点,而其它节点只需要把R6节点在原先计算好的拓扑上增加即可。

在这里插入图片描述

2.3 智能定时器

​ 在进行SPF计算和产生LSA的时候会使用到的特殊定时器,他控制着SPF的计算,LSA的更新速度和接收速度,从而加快和减缓网络受影响的时间。

​ 如下图:智能定时器的作用

在这里插入图片描述

2.4 智能定时器的介绍与设置

(1)设置LSA接收的间隔,间隔内不接收LSA,间隔后再接收:

默认:接收LSA的最长间隔时间为1000毫秒、初始间隔时间为500毫秒、基数间隔时间为500毫秒

lsa-arrival-interval intelligent-timer 最长间隔 初始间隔 基数间隔

(2)设置LSA更新的间隔,间隔内不更新LSA,间隔后再更新:

默认:更新LSA的最长间隔时间为5000毫秒、初始间隔时间为500毫秒、基数间隔时间为1000毫秒

lsa-originate-interval intelligent-timer 最长间隔 初始间隔 基数间隔

(3)设置路由计算的间隔,间隔内不计算LSA,间隔后再计算:

默认:SPF计算的最长间隔时间为10000毫秒、初始间隔时间为500毫秒、基数间隔时间为1000毫秒

spf-schedule-interval intelligent-timer 最长间隔 初始间隔 基数间隔

注解:三个间隔的表示的含义

  1. 初次更新LSA的间隔时间由初始间隔参数指定。
  2. 第n(n≥2)次更新LSA的间隔时间为 基数间隔×2^(n-2)。
  3. 基数间隔×2^(n-2) 达到指定的最长间隔时,OSPF连续3次更新LSA的时间间隔都是最长间隔时间之后,再次返回按照初始间隔时间更新LSA,如此反复。

举例:

更新LSA的最长间隔时间为5000毫秒、初始间隔时间为500毫秒、基数间隔时间为1000毫秒。

​ 设备接入OSPF网络建立邻居关系之后(因为邻居建立后才交互LSA等信息),先等待500ms的初始间隔,收集网络中其它节点的LSA信息,500ms结束后才能发送自己的LSA信息。

​ 第1次更新LSA间隔:初始间隔的500ms

​ 第2次更新LSA间隔:1000ms*2^(2-2)=1000ms*1,1000ms后才可更新LSA,1000ms内即使有网络变更也不更新。

​ 第3次更新LSA间隔:1000ms*2^(3-2)=1000ms*1,2000ms。

​ 第4次更新LSA间隔:1000ms*2^(4-2)=1000ms*4,4000ms。

​ 第5,6,7次更新LSA间隔:1000ms*2^(5-2)=1000ms*8,但最长间隔为5000ms,故5、6、7次均为5000ms。

​ 第8次更新LSA间隔:由于连续3次更新均为最长间隔,重置到初始间隔的500ms。

有个很核心的问题,这里所说的更新、接收、计算的LSA是什么?

指的就是OSPF的那1、2、3、4、5、7类等LSA

3.延迟收敛

OSPF的收敛时间相对较快,在不计算LSA同步时间下,广播类型接口建立邻居后40秒选举完DR、BDR才会进入邻接关系,而如果是点对点类型接口则会更快建立起邻接关系。

默认情况下,在不计算路由同步时间下,BGP进入Established状态需要32秒。从TCP建立成功后的Active状态到Established这32秒的延迟(重传定时器)是为了确保网络稳定性,避免因快速切换或网络波动而导致的不稳定情况。

故,如果在BGP网络中使用的IGP协议为OSPF,接口类型为点对点,那么就会出现网络故障后又恢复之时,由于OSPF网络优先收敛完成,而BGP未完成路由同步造成数据包丢失。

3.1 图文解释P1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 图文解释P2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 解决方法

为了防止这种情况出现,通过在OSPF上配置命令:

(1)stub-router

启用之后,默认将该路由器传递的路由度量值设为最大(65535),从而控制其它节点路由器避免数据从此路由器转发。
@未选择on-startup参数,则表示该路由器始终保持为Stub设备,即所有来自这个路由器的路由条目Cost值均设为65535。

(2)stub-router on-startup 恢复时间

表示该路由器仅在重启或者主备倒换时保持为Stub设备,恢复时间结束之后才会恢复成正常的设备。
只有当到达了时间之后,才会将链路切换回来,反之,继续保持之前的状态。
从而避免出现BGP路由黑洞的情况。

(3)ISIS中实现相同效果则是用它独有的超载特性,然后加上on-startup命令选项,控制设备恢复时间。

set-overload on-startup 恢复时间

4.GR平滑重启

​ 路由设备采用了控制转发分离的技术之后(转控分离),在网络拓扑保持稳定的情况下,控制层面的重启并不会影响转发层面,转发层面仍然可以很好地完成数据转发任务,从而保证业务不受影响。

控制层面:接收处理协议信息,如路由表。
转发层面:负责数据报文转发,如转发表。

在这里插入图片描述

​ GR(Graceful Restart 平滑重启)技术,属于RFC 3623,该技术保证设备在重启过程转发层面能够继续指导数据的转发,同时控制层面邻居关系以及路由计算等动作不会影响转发层面的功能(重启过程中其它邻居感知不到该设备正在重启),从而避免了路由振荡引发的业务中断,提高了整网的可靠性。

4.1 GR的工作原理
GR实现

​ 1、与重启设备建立OSPF邻居的设备均需要具备GR功能,否则在设备重启之后,会与该邻居断开关系造成网络震荡。

​ 2、在GR中重启设备称为GR Restarter、其邻居叫作GR Helper

​ 3、GR报文即Grace-LSA属于9类LSA,只能在接口网段中泛洪,因此不会在网络中大量泛洪。

​ 4、GR报文用于在开始GR退出GR时向邻居通告GR的时间、重启原因以及接口地址等内容。

​ 5、其配置命令只有核心的两条:

[OSPF进程中执行]

# 使能设备可以生成和处理9类LSA报文
opaque-capability enable

# 使能OSPF GR功能
graceful-restart

​ 6、其中关于graceful-restart的默认参数如下:

参数参数说明取值
period period指定平滑重启的周期。整数形式,取值范围是1~1800,单位是秒。缺省值是120秒。
planned-only指定路由器仅支持Planned GR。
缺省情况下,路由器支持Planned GR和Unplanned GR。
-
partial指定路由器支持Partial GR。
缺省情况下,路由器支持Totally GR。
-
GR“主动倒换”工作的过程

​ 1、GR Restarter设备主动进行倒换,倒换前向邻居发送GR(Grace-LSA)报文通告自己将要重启,请不要删除与我之间的邻居关系。

注意,倒换前发送GR报文的次数不定,依厂商而定,华为手册写的是倒换前只发送一个GR报文。

​ 2、邻居GR Helper 收到GR报文之后,保证GR Restarter重启中邻居关系依旧保留,同时回复LSAck确认收到对方的GR报文。

此时GR Restarter设备是否收到LSAck都无所谓了,只要GR Restarter设备发送的GR报文被GR Helper收到即可。

​ 3、当GR Restarter设备恢复正常之后,再次发送GR报文通知GR Helper,然后开始进行同步LSDB 。

网络类型接口建立邻居时需要经过40秒选举DR/BDR,但由于先前已经通过GR报文同步了部分OSPF信息,故当GR Restarter设备收到GR Helper的Hello报文之后,将马上进入Exstart状态开始同步LSDB。

​ 4、当同步完成之后,通过发送Flush Grace-LSA报文(Age为3600秒的GR LSA),GR Restarter设备可以向GR Helper和其他路由器设备发出一个明确的信号,表示自己已经恢复了正常的运行状态。

为啥需要这个FlushGR报文呢,有何用意?

因为自GR Restarter发送GR报文给GR Helper之后,GR Helper们均一直在维持着与GR Restarter的邻居信息,即一直处于GR Helper状态下。所以在设备恢复之后,为了减少设备负担,通过发送Flush GR报文来终止这种关系。

当然也存在一个定时器,GR的持续时间最长为1800秒,当超过这个时间之后,GR的这种关系也会自动断开,之所以为1800是为了避免重新启动路由器的LSA老化(LSA老化时间)。

下图举例与其中某一台OSPF邻居交互GR报文过程:

在这里插入图片描述

GR“被动倒换”工作的过程

​ 1、设备因突发故障导致设备需要断电重启。

​ 2、Restarter设备重新启动之后,需要先向所有接口发送多次GR报文(目的224.0.0.5)

华为中重新启动后会连续发送5次GR报文。

在广播网络上,由于重新启动的路由器不知道其先前的DR状态,因此必须将此GR LSA泛洪到所有路由器。

​ 3、至此,手册与RFC就没有下文了。至于是重新建立OSPF邻居还是怎样,不知道咯。

因为在没有发送GR报文给Helper的情况下,突然重启设备,那么邻居状态固然会断开。

重启完成之后,再发送GR报文的意义是什么呢?

关于GR技术的疑惑点

​ 1、GR设备配置完成之后,如何实现所谓的计划重启?

reboot?还是其它专用重启命令?均没有在手册与RFC中出现。

​ 2、GR突发故障后设备重启如何恢复的过程没有明确讲到。

5.NSF/NSR不间断转发/不间断路由

NSF与NSR的区别

​ NSF(Non-Stopping Forwarding)不间断转发

​ NSR(Non-Stopping Routing)不间断路由
在这里插入图片描述

两者的应用场景

​ 当网络对丢包的要求、对路由收敛的速度的要求都比较低时,可以使用NSF功能。

​ 当网络对丢包的要求、对路由收敛的速度的要求都比较高时,可以使用NSR功能。

两者的优缺点
类型NSRNSF
硬件NSR需要配置两块主控板。一块做主用主控板,处于工作状态;一块做备用主控板,处于备份状态。当主用主控板重启时,备用主控板成为新的主用主控板。
NSR需要数据转发和控制分离,除主控板之外有专门的接口板用于数据转发。
主控板主要运行控制层的软件,比如动态路由协议;主控板用于学习和维护路由表,并计算出路由转发表FIB(Forwarding Information Base),使用接口板进行数据转发。
接口板负责根据主控板计算出的转发表进行数据的转发。
跟NSR的要求相同。
软件主用主控板正常运行的过程中,会把配置信息、接口状态信息、协议状态信息备份到备用主控板。当主用主控板因为硬件或者软件失效出现故障时,备用主控板接管失效的主用主控板的工作,重新启动控制层和转发层。跟NSR的要求相同。
协议无特殊要求。各相关网络协议,路由协议如OSPF、IS-IS、BGP等,其他协议如LDP、RSVP等做扩展,需要具备GR技术的能力。
优点NSR无需通知邻居节点路由信息变化,同时也无需邻居节点的协助。
当多个节点的控制层同时故障时,系统运行情况仍在在可控范围内。
当故障恢复时,短时间内即可恢复数据,且在主备切换中,网络拓扑也能够恢复。
当系统正常运行时,NSF对系统的负荷较小,系统性能较高。
缺点当系统正常运行时,NSR对系统的负荷较大,系统性能相对较低。
系统软件异常时NSR将失效。
需要邻居节点同样具备NSF能力,且需要部署在整网中。当多节点的控制层均故障时,NSF将失效。当故障恢复时,需要花费较长时间恢复数据,且网络拓扑的恢复也相对缓慢。网络拓扑的变化或者接口状态的变化,可能导致NSF失效。
NSR的工作原理

​ NSF的实现过程其实就是通过GR功能进行实现。

​ 原理主要包括以下三个过程:

  1. 批量备份:NSR功能使能后,备板复位重启过程中,主用主控板将路由信息和转发信息批量备份到备用主控板上。批量备份过程一定是在实时备份过程之前进行,同时NSR还不具备主备倒换能力。
  2. 实时备份:当批量备份过程结束后,系统进入实时备份阶段。任何在控制平面和转发平面的改变都将实时从主用主控板备份到备用主控板上。在该阶段,备用主控板能够随时代替主用主控板工作。
  3. 主备倒换:在已经完成备份的NSR系统主用主控板发生故障时,备用主控板会通过硬件状态感知到主用主控板故障,并成为新的主用主控板。备用主控板成为新主用后,会自动切换接口板的报文上送通道到新主控板。由于倒换时间足够短,路由协议在主备切换的过程中不会和邻居节点断连。

在这里插入图片描述

NSF与NSR的命令实现
# NSR能够实现路由处理及转发业务不中断
switchover mode nonstop-routing

# NSF能够大幅减少转发业务中断时间
switchover mode nonstop-forwarding

# 查看当前系统HA的工作模式
display switchover mode

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

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

相关文章

Ubuntu18.04安装pcl-1.12.1,make时报错:/usr/bin/ld: cannot find -lvtkIOMPIImage

解决方案: 在vtk安装包中,重新打开cmake-gui,然后勾选上VTK_Group_MPI和VTK_Group_Imaging。 cd VTK-8.2.0 cd build cmake-gui然后重新编译生成。 make -j8 # 或者j4,量力而行。 sudo make install 就可以解决了。 然后重新回到pcl安装…

虚拟机没有桥接模式--物理机WiFi不见了--注册表修复

我们知道虚拟机有三种模式: vmnet0 桥接模式;vmnet1 仅主机模式;vmnet8 NAT模式 我自己以前一直用的NAT模式,今天突然要用到桥接模式,发现无法切换... 我下面这个是后面弄好了的,最开始是没有显示桥接模式…

Vue 3 中,watch 和 watchEffect 的区别

结论先行: watch 和 watchEffect 都是监听器,都是用来监听响应式数据的变化并执行相应操作。区别是: watch:需要指明要监听的数据,而且在回调函数中可以获取到属性变化的前后值; 适用于需要精确控制监视…

quickapp_快应用_快应用组件

快应用组件 web组件web页面与快应用页面通信网页接收/发送消息网页接收消息 快应用页面接收/发送消息给网页发送消息 通信前提- trustedurl web组件 作用:用于显示在线的 html 页面(可以嵌入三方页面或者某些不太重要的页面) 缺点:打开会比原生慢一点&…

容联七陌携手岚时科技,解决医美机构回访3大痛点

近日,岚时科技研发中心联合容联七陌发布了全新的智能呼叫中心系统,5大功能模块解决了医美机构回访过程中的3大难题:客户资产保全困难、客户回访技术被卡脖子、回访人员(客服、咨询)效率管理困难。 “智能呼叫中心”通过…

Camtasia2024破解版电脑屏幕录制剪辑软件

屏幕录制剪辑 TechSmith Camtasia for Mac v2021是 TechSmith 公司所开发出一款专业屏幕录像和编辑, Camtasia Studio2024版是由TechSmith公司官方进行汉化推出的最新版本,除2023版以下版本均没有官方汉化。 同时TechSmith公司打击第三方贩卖Camtasia Studio汉化的…

MS2111多点低压差分(M-LVDS)线路驱动器和接收器

MS2111 是多点低压差分 (M-LVDS) 线路驱动器和接收器。经过 优化,可运行在高达 200Mbps 的信号速率下。所有部件均符合 M LVDS 标准 TIA / EIA-899 。该驱动器的输出支持负载低至 30Ω 的多 点总线。 MS2111 的接收器属于 Type-2 , 可在 -1…

第三章:人工智能深度学习教程-基础神经网络(第五节-了解多层前馈网络)

让我们了解反向传播网络 (BPN) 中的误差是如何计算的以及权重是如何更新的。 考虑下图中的以下网络。 反向传播网络(BPN) 上图中的网络是一个简单的多层前馈网络或反向传播网络。它包含三层,输入层有两个神经元 x 1和 x 2,隐藏层有两个神经元 z 1和 z 2,输出层有一个神经…

基于element-ui封装可配置表单组件

“vue”: “^2.7.13” “element-ui”: “^2.15.7” 代码地址 【说明】 该组件时使用vue3&#xff08;vue2.7&#xff09;语法封装&#xff0c;使用时可用vue2语法使用也可以使用vue3语法使用 一、vue2语法使用案例 基础用法 <template><div class"form-demo…

擎创动态 | 开箱即用!擎创科技联合中科可控推出大模型一体机

一、金融行业大模型一体机发布 10月26日至27日&#xff0c;2023金融科技安全与创新大会顺利召开。会上&#xff0c;中科可控联合擎创科技、卓世科技、文因互联、百川智能、捷通华声、智谱华章、易道博识等9大厂商&#xff0c;发布了9款金融行业大模型一体机&#xff0c;为金融…

加速度jsudo:小企业会遇到哪些瓶颈期?

什么是瓶颈期&#xff1f;瓶颈期&#xff0c;就是你无论怎么努力&#xff0c;成绩都是上不去&#xff0c;还是停留在原地&#xff1b;而自己表现的还是很匆忙&#xff0c;却不知道如何下手&#xff1f;就像水桶效益一样&#xff0c;水桶的木板高度层次不齐&#xff0c;像极了自…

安防监控系统EasyCVR平台设备通道绑定AI算法的功能设计与开发实现

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

Mysql数据库的备份和恢复及日志管理

一、数据备份概述 1.1 备份的分类 完全备份&#xff1a;整个数据库完整地进行备份 增量备份&#xff1a;在完全备份的基础之上&#xff0c;对后续新增的内容进行备份 冷备份&#xff1a;关机备份&#xff0c;停止mysql服务&#xff0c;然后进行备份 热备份&#xff1a;开机备…

从零开始的C++(十四)

继承&#xff1a; 作用&#xff1a;减少重复代码&#xff0c;简化程序。 用法&#xff1a; class b&#xff1a;public a {//...b中成员 } 在如上代码中&#xff0c;b类以public的方式继承了a类。规定a类是父类、基类&#xff0c;b类是子类、派生类。 关于继承方式&#xf…

[动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍

[动态规划] (十一) 简单多状态: LeetCode 面试题17.16.按摩师 和 198.打家劫舍 文章目录 [动态规划] (十一) 简单多状态: LeetCode 面试题17.16.按摩师 和 198.打家劫舍题目分析题目解析状态表示状态转移方程初始化和填表顺序 代码实现按摩师打家劫舍 总结 注&#xff1a;本题与…

iOS 让界面元素的文字随着语言的更改而变化——本地化文字跟随

在我的 App 内置的设置中&#xff0c;修改了语言&#xff0c;这时需要让当前界面的文本跟着改变语言。 解决方法是&#xff1a;添加一个观察者&#xff0c;观察 localize 本地语言的通知&#xff0c;然后一有变化就调用自定义的方法执行操作。&#xff08;而设置中其实是改变了…

ZYNQ_project:key_beep

通过按键控制蜂鸣器工作。 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a; /*1位按键消抖 */ module key_filter (input wire sys_clk ,input wire sys_rst_n ,input wire key_in ,output …

搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试

目录 1 搭建嵌入式gdb调试环境 1.1 交叉编译工具链自带的gdb和gdbserver 1.2 使用gdb进行嵌入式程序调试 1.2.1编写简单测试程序 1.2.2 gdb调试程序 1.3 源码编译gdb和gdbserver 1.3.1 下载gdb和gdbserver源码 1.3.2 编译gdb 1.3.3 移植gdbserver 2 VSCodegdbserver 图…

第十八章:Swing自述

18.1 Swing概述 18.2&#xff1a;Swing常用窗体 18.2.1&#xff1a;JFrame窗体 package eightth; import java.awt.*; //导入AWT包 import javax.swing.*; //导入Swing包 public class JFreamTest { public static void main(String args[]) { // 主方法 JFr…

阿里云99元服务器2核2G3M带宽_4年396元_新老用户均可

阿里云2核2G3M带宽99元服务器新老用户同享&#xff0c;续费不涨价&#xff0c;99元即可续费&#xff0c;可以续费到2027年&#xff0c;相当于396元买4年&#xff0c;阿里云百科aliyunbaike.com来详细说下阿里云99元服务器配置、购买条件、优惠价格和续费攻略&#xff1a; 阿里…