计算机网络4——网络层4内部路由选择协议

文章目录

  • 一、有关路由选择协议的几个基本概念
    • 1、理想的路由算法
    • 2、分层次的路由选择协议
  • 二、内部网关协议 RIP
    • 1、协议 RIP 的工作原理
    • 2、特点
    • 3、距离向量算法
    • 4、坏消息传播慢
  • 三、内部网关协议 OSPF
    • 1、基本特点
    • 2、OSPF 的五种分组类型

本节将讨论几种常用的路由选择协议,也就是要讨论转发表中的路由是怎样得出的

一、有关路由选择协议的几个基本概念

1、理想的路由算法

路由选择协议的核心就是路由算法,即需要何种算法来获得路由表中的各项目。一个理想的路由算法应具有如下的一些特点

  • 算法必须是正确的和完整的。这里,“正确”的含义是:沿着各路由表所指引的路由,分组一定能够最终到达目的网络和目的主机。
  • 算法在计算上应简单。路由选择的计算不应使网络通信量增加太多的额外开销。
  • 算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。当网络中的通信量发生变化时,算法能自适应地改变路由以均衡各链路的负载。当某个或某些节点、链路发生故障不能工作,或者修理好了再投入运行时,算法也能及时地改变路由。有时称这种自适应性为“稳健性”(robustness)。
  • 算法应具有稳定性。在网络通信量和网络拓扑相对稳定的情况下,路由算法应收敛于一个可以接受的解,而不应使得出的路由不停地变化。
  • 算法应是公平的。路由选择算法应对所有用户(除对少数优先级高的用户)都是平等的。例如,若仅仅使某一对用户的端到端时延为最小,但却不考虑其他的广大用户,这就明显地不符合公平性的要求。
  • 算法应是最佳的。路由选择算法应当能够找出最好的路由,使得分组平均时延最小而网络的吞吐量最大。虽然我们希望得到“最佳”的算法,但这并不总是最重要的。对于某些网络,网络的可靠性有时要比最小的分组平均时延或最大吞吐量更加重要。因此,所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。

一个实际的路由选择算法,应尽可能接近于理想的算法。在不同的应用条件下,对以上提出的6个方面也可有不同的侧重。

倘若从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则只有两大类,即静态路由选择策略动态路由选择策略

  • 静态路由选择:也叫作非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。对于很简单的小网络,完全可以采用静态路由选择,用人工配置每一条路由。

  • 动态路由选择:也叫作自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。因此,动态路由选择适用于较复杂的大网络。

2、分层次的路由选择协议

互联网采用的路由选择协议主要是自适应的(即动态的)、分布式路由选择协议。由于以下两个原因,互联网采用分层次的路由选择协议:

  • 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。
  • 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。

为此,可以把整个互联网划分为许多较小的自治系统(autonomous system),一般都记为AS。自治系统 AS是在单一技术管理下的许多网络、IP地址以及路由器,而这些路由器使用一种自治系统内部的路由选择协议和共同的度量。每一个AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。这样,互联网就把路由选择协议划分为两大类,即:

  • 内部网关协议IGP(lnterior GatewayProtocol)即在一个自治系统内部使用的路由选择协议,而这与在互联网中的其他自治系统选用什么路由选择协议无关。目前这类路由选择协议使用得最多的是RIP和OSPF协议(IS-IS协议也很流行,但不介绍了)。
  • 外部网关协议EGP(Extemmal GatewayProtocol) 若源主机和目的主机处在不同的自治系统中(这两个自治系统可能使用不同的内部网关协议),那么在不同自治系统AS之间的路由选择,就需要使用外部网关协议EGP。目前使用最多的外部网关协议是BGP的版本4

自治系统之间的路由选择也叫作域间路由选择(interdomain routing),而在自治系统内部
的路由选择叫作域内路由选择(intradomain routing)
在这里插入图片描述
总之,使用分层次的路由选择方法,可将互联网的路由选择协议划分为:

  • 内部网关协议 IGP:具体的协议有多种,如RIP和OSPF等。
  • 外部网关协议 EGP:目前使用的协议是 BGP-4。

二、内部网关协议 RIP

1、协议 RIP 的工作原理

RIP(Routing Information Protocol)是内部网关协议 IGP 中最先得到广泛使用的协议IRFC 1058],它的中文译名是路由信息协议。RIP是一种分布式的基于距离向量的路由选择协议,是互联网的标准协议,其最大优点就是简单。

RIP协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录(因此,这是一组距离,即“距离向量”)。协议 RIP 将“距离”定义如下:

从一路由器到直接连接的网络的距离定义为1。从一主机到非直接连接的网络的距离定义为所经过的路由器数加1。“加1”是因为到达目的网络后就进行直接交付(不需要再经过路由器),而到直接连接的网络的距离已经定义为1。

协议 RIP 的“距离”"也称为“跳数”(hop count),并且每经过一个网络,跳数就加 1。RIP 认为好的路由就是它通过的网络数目少,即“距离短”。RIP 允许一条路径最多只能包含 15个网络。因此“距离”等于 16 时即相当于不可达。可见 RIP 只适用于小型互联网

RIP不能在两个网络之间同时使用多条路由。RIP选择一条具有最少网络数的路由(即最短路由),哪怕还存在另一条高速(低时延)但网络数较多的路由。

2、特点

  • 仅和相邻路由器交换信息。如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。协议RIP规定,不相邻的路由器不交换信息。
  • 路由器交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表。也就是说,交换的信息是:“我到本自治系统中所有网络的(最短)距离,以及到每个网络应经过的下一跳路由器”。
  • 按固定的时间间隔交换路由信息,例如,每隔 30秒。然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。网络中的主机虽然也运行协议RIP,但只被动地接收路由器发来的路由信息。

这里要强调一点:路由器在刚刚开始工作时,它的路由表是空的。然后路由器就得出到直接相连的几个网络的距离(这些距离定义为1)。接着,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。但经过若干次的更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。

通过这种方式,最后在自治系统中所有的节点都得到了正确的路由选择信息。在一般情况下,协议RIP 可以收敛,并且过程也较快。“收敛”就是在自治系统中所有的节点都得到正确的路由
选择信息的过程。

路由表中最主要的信息就是:到某个网络的距离(即最短距离),以及应经过的下一跳地址。路由表更新的原则是找出到每个目的网络的最短距离。这种更新算法又称为距离向量算法。下面就是协议 RIP使用的距离向量算法。

3、距离向量算法

对每一个相邻路由器发送过来的 RIP 报文,执行以下步骤:

  • 对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加1(见后面的解释1)。每一个项目都有三个关键数据,即:到目的网络Net,距离是d,下一跳路由器是X。
  • 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
    • 若原来的路由表中没有目的网络Net,则把该项目添加到路由表中(见解释2)。
    • 否则(即在路由表中有目的网络Net,这时就再查看下一跳路由器地址)。
    • 若下一跳路由器地址是X,则把收到的项目替换原路由表中的项目(见解释3)。
    • 否则(即这个项目是:到目的网络Net,但下一跳路由器不是X)。
    • 若收到的项目中的距离d小于路由表中的距离,则进行更新(见解释 4),
    • 否则什么也不做(见解释5)。
  • 若3分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即把距离置为16(距离为16表示不可达)。
  • 返回。

上面给出的距离向量算法的基础就是 Bellman-Ford算法(或Ford-Fulkerson 算法)。这种算法的要点是这样的:

设X是节点A到B的最短路径上的一个节点。若把路径A→B拆成两段路径A→X和X→B,则每一段路径A→X和X→B也都分别是节点A到X和节点X到B的最短路径。

下面是对上述距离向量算法的五点解释。

  • 解释1:这样做是为了便于进行本路由表的更新。假设从位于地址X的相邻路由器发来的 RIP 报文的某一个项目是:“Net2,3,Y”,意思是“我经过路由器Y到网络 Net2 的距离是3”,那么本路由器就可推断出:“我经过X到网络Net2的距离应为3+1=4”。于是,本路由器就把收到的 RIP报文的这一个项目修改为“Net2,4,X”,作为下一步和路由表中原有项目进行比较时使用(只有比较后才能知道是否需要更新)。读者可注意到,收到的项目中的Y对本路由器是没有用的,因为Y不是本路由器的下一跳路由器地址。
  • 解释 2:表明这是新的目的网络,应当加入到路由表中。例如,本路由表中没有到目的
    网络 Net2 的路由,那么在路由表中就要加入新的项目“Net2,4.X”。
  • 解释 3:为什么要替换呢?因为这是最新的消息,要以最新的消息为准。到目的网络的距离有可能增大或减小,但也可能没有改变。例如,不管原来路由表中的项目是“Net2,3,X”还是“Net2,5,X”,都要更新为现在的“Net2,4,X”。
  • 解释 4:例如,若路由表中已有项目“Net2,5,P”,就要更新为“Net2,4,X”。因为到网络 Net2 的距离原来是5,现在减到4,更短了。
  • 解释 5:若距离更大了,显然不应更新。若距离不变,更新后得不到好处,因此也不更新。

协议RIP让一个自治系统中的所有路由器都和自己的相邻路由器定期交换路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。这里还应注意:虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的。

下图表明RIP 报文作为运输层用户数据报 UDP的数据部分进行传送(使用UDP的端口 520。端口的意义见5.2.2节)。
在这里插入图片描述
RIP 报文由首部和路由部分组成。在路由部分要填入自治系统号ASN(AutonomousSystem Number)",这是考虑使RIP有可能收到本自治系统以外的路由选择信息。还要指出目的网络地址(包括网络的子网掩码)、下一跳路由器地址以及到此网络的距离。一个 RIP报文最多可包括 25个路由。如超过,必须再用一个RIP报文来传送。

4、坏消息传播慢

RIP 存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。我们可以用下图的简单例子来说明。设三个网络通过两个路由器互连起来并且都已建立了各自的路由表。图中路由器交换的信息只给出了我们感兴趣的一行内容。路由器 R1中的“Net1,1,直接”表示“到网 Net1 的距离是 1,直接交付”。路由器 R2中的“Net1,2,R1,”表示“到网 Net1 的距离是 2,下一跳经过 R1,”
在这里插入图片描述
现在假定路由器R1到网 Net1 的链路出了故障,R1无法到达网 Net1。于是路由器R1把到网 Net1的距离改为16,表示不可达,因而在R,的路由表中的相应项目变为“Net1,16.直接”。但是,很可能要经过 30秒钟后R1才把更新信息发送给R2。然而R2可能已经先把
自己的路由表发送给了R1,其中有“Netl,2,R,”这一项。

R1收到 R2的更新报文后,误认为可经过R2到达网 Net1,于是把收到的路由信息“Net1,2.R,”修改为:“Net1,3,R,”,表明“我到网 Netl 的距离是 3,下一跳经过 R2”,并把更新后的信息发送给 R2。

同理,R₂接着又更新自己的路由表为“Net1,4,R1,”,以为“我到网 Netl 距离是 4,下一跳经过 R1”。

这样的更新一直继续下去,直到 R1和 R2到网 Netl 的距离都增大到 16 时,R1和 R2才知道原来网 Net1是不可达的。协议 RIP 的这一特点叫作:好消息传播得快,而坏消息传播得慢。网络出故障的传播时间往往较长(例如数分钟)。这是RIP的一个主要缺点。但如果一个路由器发现了更短的路由,那么这种更新信息就传播得很快。

为了使坏消息传播得更快些,可以采取多种措施。例如,让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送。

总之,协议 RIP最大的优点就是实现简单,开销较小。但协议RIP的缺点也较多。首先,RIP限制了网络的规模,它能使用的最大距离为15(16 表示不可达)。其次,路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。最后,“坏消息传播得慢”,使更新过程的收敛时间过长。因此,对于规模较大的网络就应当使用下一节所述的 OSPF 协议。然而目前在规模较小的网络中,使用协议 RIP 的仍占多数。

三、内部网关协议 OSPF

1、基本特点

这个协议的名字是开放最短路径优先OSPF(OpenShortest Path First)。它是为克服RIP的缺点在1989年开发出来的。OSPF的原理很简单,但实现起来却较复杂。“开放”表明 OSPF 协议不是受某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。

请注意:OSPF只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。实际上,所有的在自治系统内部使用的路由选择协议(包括协议RIP)都是要寻找一条最短的路径。

OSPF最主要的特征就是使用链路状态协议(linkstateprotocol),而不是像RIP 那样的距
离向量协议。协议OSPF的特点是:

  • 向本自治系统中所有路由器发送信息。这里使用的方法是洪泛法(flooding),这就是路由器通过所有输出端口向所有相邻的路由器发送信息。而每一个相邻路由器又再将此信息发往其所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器)。这样,最终整个区域中所有的路由器都得到了这个信息的一个副本。更具体的做法后面还要讨论。我们应注意协议 RIP 是仅仅向自己相邻的几个路由器发送信息。
  • 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。OSPF 将这个“度量”用来表示费用、距离、时延、带宽,等等。这些都由网络管理人员来决定,因此较为灵活。有时为了方便就称这个度量为“代价”。我们应注意,对于协议 RIP,发送的信息是:“到所有网络的距离和下一跳路由器”。
  • 当链路状态发生变化或每隔一段时间(如30分钟),路由器向所有路由器用洪泛法发送链路状态信息。

从上述的前两点可以看出,OSPF和RIP的工作原理相差较大。

由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库(link-state database),这个数据库实际上就是全网的拓扑结构图。这个拓扑结构图在全网范围内是一致的(这称为链路状态数据库的同步)。因此,每一个路由器都知道全网共有多少个路由器,以及哪些路由器是相连的,其代价是多少,等等。每一个路由器使用链路状态数据库中的数据,构造出自己的路由表(例如,使用Dikstra 的最短路径路由算法)。我们注意到,协议RIP的每一个路由器虽然知道到所有的网络的距离以及下一跳路由器,但却不知道全网的拓扑结构(只有到了下一跳路由器,才能知道再下一跳应当怎样走)。

OSPF的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF 的更新过程收敛得快是其重要优点。

为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫作区域(area)。下图就表示一个自治系统划分为四个区域。每一个区域都有一个32位的区域标识符(用点分十进制形式表示)。当然,一个区域也不能太大,在一个区域内的路由器最好不超过200个。

划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。

在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。为了使每一个区域能够和本区域以外的区域进行通信,OSPF使用层次结构的区域划分。

在上层的区域叫作主干区域(backbonearea)。主干区域的标识符规定为0.0.0.0。主干区域的作用是用来连通其他在下层的区域。从其他区域来的信息都由区域边界路由器(area border router)进行概括。

在下图中,路由器R3,R4和R7都是区域边界路由器,而显然,每一个区域至少应当有一个区域边界路由器。在主干区域内的路由器叫作主干路由器(backbone router),如 R3,R4,R5,R6和 R7。一个主干路由器可以同时是区域边界路由器,如R3、R4和R7。在主干区域内还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息。这样的路由器叫作自治系统边界路由器(如图 中的 R6)。
在这里插入图片描述
采用分层次划分区域的方法虽然使交换信息的种类增多了,同时也使OSPF协议更加复杂了。但这样做却能使每一个区域内部交换路由信息的通信量大大减小,因而使OSPE协议能够用于规模很大的自治系统中。这里,我们再一次地看到划分层次在网络设计中的重要性

除了以上的几个基本特点外,OSPF还具有下列的一些特点:

  • OSPF允许管理员给每条路由指派不同的代价。例如,高带宽的卫星链路对于非实时的业务可设置为较低的代价,但对于时延敏感的业务就可设置为非常高的代价。因此,OSPF 对于不同类型的业务可计算出不同的路由。链路的代价可以是1至65535 中的任何一个无量纲的数,因此十分灵活。商用的网络在使用OSPF时,通常根据链路带宽来计算链路的代价。这种灵活性是RIP所没有的。
  • 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫作多路径间的负载均衡(load balancing)。在代价相同的多条路径上分配通信量是通信量工程中的简单形式。RIP只能找出到某个网络的一条路径。
  • OSPF支持可变长度的子网划分和无分类的编址CIDR。
  • 由于网络中的链路状态可能经常发生变化,因此OSPF让每一个链路状态都带上一个32位的序号,序号越大状态就越新。OSPF规定,链路状态序号增长的速率不得超过每5秒钟1次。这样,全部序号空间在600年内不会产生重复号。

2、OSPF 的五种分组类型

OSPF 共有以下五种分组类型:

  • 类型1,问候(Hello)分组,用来发现和维持邻站的可达性。
  • 类型 2,数据库描述(Database Description)分组,向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
  • 类型 3,链路状态请求(Link State Request)分组,向对方请求发送某些链路状态项目的详细信息。
  • 类型 4,链路状态更新(Link State Update)分组,用洪泛法对全网更新链路状态。这种分组是最复杂的,也是OSPF协议最核心的部分。路由器使用这种分组将其链路状态通知给邻站。链路状态更新分组共有五种不同的链路状态「RFC2328],这里从略。
  • 类型 5,链路状态确认(Link State Acknowledgment)分组,对链路更新分组的确认。

OSPF分组是作为IP数据报的数据部分来传送的(如下图所示)。OSPF不用UDP而是直接用 IP 数据报传送(其 IP 数据报首部的协议字段值为 89)。OSPF 构成的数据报很短。这样做可减少路由信息的通信量。数据报很短的另一好处是可以不必将长的数据报分片传送分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。
在这里插入图片描述
OSPF规定,每两个相邻路由器每隔10秒钟要交换一次问候分组。这样就能确知哪些邻站是可达的。对相邻路由器来说,“可达”是最基本的要求,因为只有可达邻站的链路状态信息才存入链路状态数据库(路由表就是根据链路状态数据库计算出来的)。在正常情况下,网络中传送的绝大多数OSPF分组都是问候分组。若有40秒钟没有收到某个相邻路由器发来的问候分组,则可认为该相邻路由器是不可达的,应立即修改链路状态数据库,并重新计算路由表。

其他的四种分组都是用来进行链路状态数据库的同步。所谓同步就是指不同路由器的链路状态数据库的内容是一样的。两个同步的路由器叫作“完全邻接的”(fully adiacent)路由器。不是完全邻接的路由器表明它们虽然在物理上是相邻的,但其链路状态数据库并没有达到一致。

当一个路由器刚开始工作时,它只能通过问候分组得知它有哪些相邻的路由器在工作,以及将数据发往相邻路由器所需的“代价”。如果所有的路由器都把自己的本地链路状态信息对全网进行广播,那么各路由器只要将这些链路状态信息综合起来就可得出链路状态数据库。但这样做开销太大,因此OSPF采用下面的办法。

OSPF让每一个路由器用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息。摘要信息主要就是指出有哪些路由器的链路状态信息(以及其序号)已经写入了数据库。经过与相邻路由器交换数据库描述分组后,路由器就使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的这种分组交换,全网同步的链路数据库就建立了。

在网络运行的过程中,只要一个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用洪泛法向全网更新链路状态。OSPF使用的是可靠的洪泛法,其要点如下图所示。设路由器R用洪泛法发出链路状态更新分组。图中用一些小的箭头表示更新分组。第一次先发给相邻的三个路由器。这三个路由器将收到的分组再进行转发时,要将其上游路由器除外。可靠的洪泛法是在收到更新分组后要发送确认(收到重复的更新分组只需要发送一次确认)。图中的空心箭头表示确认分组。

在这里插入图片描述
为了确保链路状态数据库与全网的状态保持一致,OSPF还规定每隔一段时间,如30分钟,要刷新一次数据库中的链路状态。

由于一个路由器的链路状态只涉及与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF协议要比距离向量协议RIP好得多。由于 OSPF 没有“坏消息传播得慢”的问题,据统计,其响应网络变化的时间小于100 ms。

若N个路由器连接在一个以太网上,则每个路由器要向其他(N-1)个路由器发送链路状态信息,因而共有 N(N-1)个链路状态要在这个以太网上传送。OSPF 协议对这种多点接入的局域网采用了指定的路由器(designated router)的方法,使广播的信息量大大减少。指定的路由器代表该局域网上所有的链路向连接到该网络上的各路由器发送状态信息。

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

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

相关文章

【Mac】mac 安装 prometheus 报错 prometheus: prometheus: cannot execute binary file

1、官网下载 Download | Prometheus 这里下载的是prometheus-2.51.2.linux-amd64.tar.gz 2、现象 解压之后启动Prometheus 启动脚本: nohup ./prometheus --config.fileprometheus.yml > prometheus.out 2>&1 & prometheus.out日志文件&#xff…

【C++】:类和对象(下)

目录 一,再谈构造函数1.初始化列表2. 隐式类型转换的过程及其优化3. 隐式类型转换的使用4. explcit关键字5. 单参数和多参数构造函数的隐式类型转换 二,static成员1.静态成员变量2.静态成员函数 三,友元3.1 友元函数3.2 友元类 四&#xff0c…

Vue ui 创建vue项目,详细使用攻略。

1.安装及启动 1.1 Vue ui 使用前提是全局安装vue.js 命令如下 npm install vue -g 1.2 安装过Vue.js 之后 随便在自己系统的一个地方打开命令面板 1.3 使用命令启动vue ui面板创建项目 vue ui 如图运行后显示这种就是启动成功,成功之后会弹出页面或者直接访问你的…

QT5制做两个独立窗口

目录 增加第二个窗口 主窗口文件添加一个私有成员为子窗口 定义两个槽函数和 关联按钮和子窗口和主窗口 添加子窗口成员 子窗口处理函数 补充回顾 增加第二个窗口 1、 2、 3 主窗口文件添加一个私有成员为子窗口 在mainwidget.h文件 同时添加两个槽;来处理…

Visual studio 2019 编程控制CH341A芯片的USB设备

1、硬件 买了个USB可转IIC、或SPI、或UART的设备,主芯片是CH341A 主要说明USB转SPI的应用,绿色跳线帽选择IIC&SPI,用到CS0、SCK、MOSI、MISO这4个引脚 2、软件 2.1、下载CH341A的驱动 点CH341A官网https://www.wch.cn/downloads/CH34…

人工智能工具的强大之处:我用过的最好用的AI工具

人工智能工具的强大之处:我用过的最好用的AI工具 在当今科技迅速发展的时代,人工智能(AI)工具已经成为我们日常生活和工作中不可或缺的一部分。从语音助手到自动化内容创建工具,再到数据分析软件,AI的应用领域广泛且深远。本篇博…

【antd + vue】InputNumber 数字输入框 输入限制

一、需求说明 只能输入数字和小数点,保留小数点后两位;最多输入6位;删除所有内容时,默认为0; 二、问题说明 问题1:使用 precision 数值精度 时,超出规定小数位数时会自动四舍五入;…

LLM应用:让大模型prompt总结生成Mermaid流程图

生成内容、总结文章让大模型Mermaid流程图展示: mermaid 美人鱼, 是一个类似 markdown,用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具,您可以在文档中嵌入一段 mermaid 文本来生成 SVG 形式的图形 Prompt 示例:用横向…

PDF 正确指定页码后,挂载的书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另做一篇原因是一篇文章附带一个与该文章主题不相关的问题时,不利于被遇到该问题的人快速搜索发现以解决其遇到的…

深度学习口型驱动Visemenet使用小结

说明 我前一篇博客《使用共振峰提取元音音素/从声音生成口型动画》探索了使用共振峰分析元音,然后从元音音素映射到视位的口型驱动方案。当时我就在想,如果能用深度学习法方法从音频直接生成音素流,然后转换成对应视位,不就很容易…

Vue项目打包APK----Vue发布App

时隔多年我又来跟新了,今天给大普家及下前端Vue傻瓜式发布App,话不多说直接上干货。 首先准备开发工具HBuilder X,去官网直接下载即可,算了直接给你们上地址吧HBuilderX-高效极客技巧。 打开软件,文件-->新建--&g…

ARM学习(27)链接库依赖学习(二)dlopen failed:library xxxx.so

笔者继续学习一下链接的依赖库。 1、起因 Android下面需要需要一个日志解码库,所以笔者就编译了一个parse.so来进行解码, 编译器:Clang,基于llvm后端的编译器平台:交叉编译,linux -> aarch64 linux An…

Java | Leetcode Java题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePaths(int m, int n) {long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return (int) ans;} }

Python+PYGObject/PYGtk+CSS样式--2024python示例

隔久点不用老是会忘&#xff0c;留个笔记。。 PythonPYGObject/PYGtk&#xff0c;加载 CSS 样式的演示代码 demo 运行的效果截图&#xff1a; #!/usr/bin/env python3 import sys import gigi.require_version("Gtk", "3.0") from gi.repository import …

Web APIs 学习归纳5--- BOM浏览器对象

前面几节主要针对DOM进行了学习&#xff0c;现在开始新的内容的学习---DOM浏览器对象。 DOM是更注重页面&#xff08;document&#xff09;内容的设计&#xff0c;但是BOM不仅限于页面&#xff08;document&#xff09;的设计&#xff0c;而是更加全面包括页面的刷新&#xff0…

【小迪安全2023】第59天:服务攻防-中间件安全CVE复现lSApacheTomcatNginx

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

Taro引入echarts【兼容多端小程序(飞书/微信/支付宝小程序)】

近期接到公司新需求&#xff0c;开发飞书小程序&#xff0c;并且原型中含有大量的图表&#xff0c;本想使用飞书内置图表组件 —— chart-space&#xff0c;但官方表示已经停止维护了&#xff0c;无奈之下&#xff0c;只能另寻他路&#xff0c;于是乎&#xff0c;图表之王&…

Content type ‘application/json;charset=UTF-8‘ not supported异常的解决过程

1.首先说明开发场景 *就是对该json格式数据传输到后台 后台实体类 import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import org.sp…

CSS移动端弹性布局

一级标题 二倍图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>背景图片</title><styl…

LLM系列(4):通义千问7B在Swift/DeepSpeed上微调秘诀与实战陷阱避坑指南

LLM系列(4):通义千问7B在Swift/DeepSpeed上微调秘诀与实战陷阱避坑指南 阿里云于 2023年8 月 3 日开源通义千问 70 亿参数模型,包括通用模型 Qwen-7B 以及对话模型 Qwen-7B-Chat,这也是国内首个开源自家大模型的大厂。在诸多权威大模型能力测评基准上,如 MMLU、C-Eval、…
最新文章