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博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【命名空间】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 学校的人事部门保存了有关学生的部分数据(学号、姓名、年龄、住址),教务部门也保存了学生的另外一些部分数据(学号、姓名、性别、成绩),两个部门分别编写了本部门的数据管…

制造业精益生产KPI和智慧供应链管理方案和实践案例分享

随着工业4.0的推进和国家对制造业高质量发展的重视,工业数据已跃升为生产经营活动中不可或缺的核心要素,同时,工业数据也是形成新质生产力的优质生产要素,助力企业实现高效精益生产。 工业数据在制造业中的作用不可忽视&#xff…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此,预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业,涵盖了不同业务背景下的流失预测数据。 后台回复暗号(在本文末…

向银行家应用程序添加日期

● 首先我们将下面图片上的时间更换成现在的时间 const now new Date(); const day now.getDate(); const month now.getMonth() 1; const year now.getFullYear(); const hour now.getHours(); const min now.getMinutes();labelDate.textContent ${day}/${month}/$…

【Unity从零开始学习制作手机游戏】第01节:控制3D胶囊体运动

1. 新建Project L01 使用3D Mobile模板。 2. 建立一个平面,用来承载物体 3. 导入Unity库内的胶囊体 下载 StandardAssets https://download.unitychina.cn/download_unity/e80cc3114ac1/WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-5.6.7f1.exe …

在excel的内置瀑布图模板中,能在数据标签里同时显示数值和百分比吗?

瀑布图是由麦肯锡顾问公司所创的图表类型,因为形似瀑布流水而称之为瀑布图( Waterfall Plot)。这种图表常用于表达数个特定数值之间的数量增减变化关系。 在Excel中,瀑布图是可以通过簇状柱形图来完成创建。从excel2016版起,excel添加了内置…

幻兽帕鲁(公益入库)教程

先安装“SteamtoolsSetup”, 安装好桌面会出来个steam图标的。然后打开“幻兽帕鲁文件夹” 把那2个脚本拖进去那个steam图标。只要显示“已编译了1个Lua脚本”“已更新了1个清单文件”将在Steam重启后生效。然后退出steam,然后重启steam就可以了&#xf…

有哪些网络兼职适合大学生参与?揭秘几个简单又实用的兼职机会

有哪些网络兼职适合大学生参与?揭秘几个简单又实用的兼职机会 对于大学生而言,除了专注于学业,利用空余时间参与一些网络兼职,不仅能锻炼个人技能,还能为未来的职业生涯积累宝贵的经验。想象一下,步入社会…

10W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP10AF系列

TP10AF系列输出功率为10W,具有可靠性高、更小的体积、性价比高等特点,广泛用于工控和电力仪器、仪表、智能家居等相关行业。

需求规格说明书设计规范(编制实际项目案例-word)

二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口需求 5.5 其他需求 六、…

2024年CCO加拿大化学奥赛最新安排已出

加拿大化学奥林匹克竞赛(Canadian Chemistry Olympiad,简称CCO)是加拿大举办的一项备受认可的化学竞赛活动,CCO的目标是激发高中生对化学学习的兴趣。(CCO官网:https://ccolympiad.org.cn/news/316.html&am…

94.二叉树的中序遍历

刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…