OSPF详解

1 OSPF
1.1 OSPF形成邻接关系所经历各个阶段有何意义?

  1. 失效状态(Down)这是一个邻居会话的初始状态,用来指明在最近一个Router Dead Interval的时间内还没有收到来自邻居路由器的Hello数据包。除非在NBMA网络中的那些邻居路由器,否则,Hello数据包是不会发送给那些失效的邻居路由器的。在NBMA网络环境中,Hello数据包是每隔Poll Interval的时间发送一次的。如果一台邻居路由器从其他更高—些的邻居状态转换到了失效状态,那么路由器将会清空链路状态重传列表、数据库摘要列表和链路状态请求列表。
  2. 尝试状态(Attempt)这种状态仅仅适用于NBMA网络上的邻居,在NBMA网络上邻居路由器是手工配置的。当NBMA网络上具有DR选取资格的路由器和其邻居路由器相连的接口开始变为有效(Active)时,或者当这台路由器成为DR或
    BDR时,这台具有DR选取资格的路由器将会把邻居路由器的状态转换到Attempt状态。在Attempt状态下,路由器将使用HelloInterval的时间代替PollInterval的时间来作为向邻居发送Hello数据包的时问间隔。
  3. 初始状态(Init)这一状态表明在最近的RouterDeadInterval时间里路由器收到了来自邻居路由器的Hello数据包,但是双向通信仍然没有建立。路由器将会在Hello数据包的邻居字段中包含这种状态下或更高状态的所有邻居路由器的路由器ID。
  4. 双向通信状态(2-Way)这一状态表明本地路由器已经在来自邻居路由器的Hello数据包的邻居字段中看到了它自己的路由器ID,这也就意味着,一个双向通信的会话己经成功建立了。在多址网络中,邻居路由器必须在这个状态或更高状态时才能有资格被选作该网络上的DR或BDR。如果在Init状态下从邻居路由器那里收到一个数据库描述数据包,也可以引起邻居状态直接转换到2-Way状态。
  5. 信息交换初始状态(Exstart)在这一状态下,本地路由器和它的邻居将建立起主/从关系,并确定数据库描述数据包的序列号,以便为数据库描述数据包的信息交换做准备。在这里,具有最高路由器ID的邻居路由器将成为“主”路由器。
  6. 信息交换状态(Exchange)在这一状态下,本地路由器将向它的邻居路由器发送可以描述它整个链路状态数据库信息的数据库描述数据包。同时,在这个Exchangc的状态下,本地路由器也会发送链路状态请求数据包给它的邻居路由器,用来请求最新的LSA。
  7. 信息加载状态(Loading)在这一状态下,本地路由器将会向它的邻居路由器发送链路状态请求数据包,用来请求最新的LSA通告。虽然在Exchange状态下已经发现了这些最新的LSA通告,但是本地路由器还没有收到这些LSA通告。
  8. 完全邻接状态(Full)在这一状态下,邻居路由器之间将建立起完全邻接关系,这种邻接关系出现在路由器LSA和网络LSA中。
    1.1.1 Init会完成那些操作?
    发送Hello报文
    1.1.2 2-Way在不同的网络类型中完成那些操作?
    在广播网络选举DR和BDR,广播链路中DRother处于2-Way状态。
    1.1.3 Exstart主要完成什么工作?
    协商主从,决定确定数据库描述数据包的序列号。如果两端MTU不匹配,则两端会卡在Exstart状态。
    1.1.4 Exchange主要完成什么工作?
    发送链路状态完整摘要信息,进行数据库同步。
    1.1.5 Loading主要完成什么工作?
    该过程实际上是Exchange的一个延续,Loading状态并非一定要经历。
    1.2 OSPF有哪些特点?
  9. 使用了区域的概念这样可以有效减少路由选择协议对路由器的CPU和内存的占有;划分区域还可以降低路由选择协议的通信量。
  10. 支持CIDR
  11. 支持无大小限制的、任意的度量值(打破类似RIP条数限制,实际上也是有限制的,参照LSA中metric所在字段长度就知道了)
  12. 支持等价负载分担(华为设备:maximum load-balancing number;缺省为8,最大也为8)
  13. 使用保留的组播地址减少对不宣告OSPF设备的影响(这里可以讨论下224.0.0.5和224.0.0.6的区别)
  14. 支持安全的路由选择认证(注意:所有的路由认证均不是对报文进行加密,而是对源的认证)
  15. 使用可以跟踪外部路由的路由标记(类似RIP的router tag字段)
    1.2.1 OSPF为何要分区域?
    使用了区域的概念这样可以有效减少路由选择协议对路由器的CPU和内存的占有;划分区域还可以降低路由选择协议的通信量。
    1.2.2 OSPF的加密是加密整个数据包吗?
    OSPF的加密实际上就是邻居的验证,邻居验证并不会加密数据包文。
    1.2.3 OSPF的metric有没有大小限制?
    OSPF的metric是由LSA携带的,LSA中有固定的bit来表示metric,所以metric是有大小限制的。
    1.2.4 OSPF为什么用组播进行更新?
    使用保留的组播地址减少对不宣告OSPF设备的影响,只有运行了OSPF的设备(即对OSPF流量感兴趣的设备)才会去侦听OSPF流量。在广播网络中,DR/BDR同样会侦听组播地址224.0.0.5。
    1.2.5 OSPF如何跟踪外部路由?
    OSPF可以为不同类型的外部路由打上不同的tag,通过tag来进行跟踪。
    1.2.6 OSPF虚链路有什么作用?
    通过一个非骨干区域连接一个区域到骨干区域;通过一个非骨干区域连接一个分段的骨干区域两边的部分区。虚链路属于区域0。虚链路中LSA是永不过期的,Hello是被抑制的。
    1.2.7 OSPF工作在那个层次之上??
    OSPF工作做IP之上,IP协议号是89。
    1.3 OSPF建立邻居条件有哪些?
  16. 两端路由器接口的地址掩码是否一致(根据原理,实际上只有在广播网络才是严格掩码信息的。RFC2328原文:on point-to-point networks and on virtual links, the Network Mask in the received Hello Packet should be ignored) 。另外P2MP也会检查子网掩码,但是华为设备可以通过命令ospf p2mp-mask-ignore命令用来设置在P2MP网络上忽略对网络掩码的检查。
  17. 两端路由器接口所在区域性质(这里所说的区域性质比如该区域是骨干区域,还是普通区域,还是末节区域)
  18. 两端路由器接口的认证类型和认证信息是否一致
  19. 两端路由器接口的HELLO、DEAD时间间隔是否一致
  20. 两端路由器的MTU是否一致(这里可以提下即使两端接口配置不同的网络类型:比如一边是点到点,另外一段是广播,邻居也是可以起的)
    1.3.1 HELLO报文包含那些信息?
    Hello时间间隔、可选项、路由优先级、路由器无效时间间隔、指定路由器、备用路由器、邻居。
    1.3.2 建立邻居一定要检查子网掩码吗?
    不一定,只有在BROADCAST,NBMA,P2MP网络类型是严格检查两端接口地址在同一网段的。而PPP不需要掩码一致。
    1.3.3 邻居两端一定要求网络类型一致吗?
    OSPF协议中并没有规定要检查链路两端的网络类型。关于链路网络类型的描述是在TYPE 1 LSA中,而对于HELLO报文中并没有对此的描述,因此首先是可以建立邻居关系;然后在接下来的LSDB同步过程中也没有对网络类型的匹配进行检查,所以两端是可以建立full关系的,但是据此是否就可以说能够正常计算出路由呢?答案是否定的:OSPF路由器需要LSDB来构建SPT(Shortest Path Tree),由于LSDB的数据库是脱节有问题的(在我的Router LSA中,我认为你是个广播邻居;而在你的Router LSA中认为我应该是个P2P邻居),根本无法构建正确的SPT, SPF算法也无法计算出正确的路由。
    1.4 OSPF支持的网络类型有哪些特点?
  21. 点到点网络类型:当链路层协议是PPP、HDLC时,缺省情况下,OSPF认为网络类型是P2P。
    a) 在该类型的网络中,以组播形式(224.0.0.5)发送协议报文(Hello报文、DD报文、LSR报文、LSU报文、LSAck报文)。
  22. 广播网络类型:当链路层协议是Ethernet、FDDI时,缺省情况下,OSPF认为网络类型是Broadcast。
    a) 通常以组播形式发送Hello报文、LSU报文和LSAck报文。其中,224.0.0.5的组播地址为OSPF路由器的预留IP组播地址;224.0.0.6的组播地址为OSPF DR的预留IP组播地址(注意,DR和BDR也会侦听224.0.0.5)。
    b) 以单播形式发送DD报文和LSR报文。
  23. NBMA网络类型:当链路层协议是ATM、帧中继时,缺省情况下,OSPF认为网络类型是NBMA。
    a) 在该类型的网络中,以单播形式发送协议报文(Hello报文、DD报文、LSR报文、LSU报文、LSAck报文)。
  24. P2MP网络类型:没有一种链路层协议会被缺省的认为是Point-to-Multipoint类型。点到多点必须是由其他的网络类型强制更改的。常用做法是将非全连通的NBMA改为点到多点的网络。
    a) 以组播形式(224.0.0.5)发送Hello报文;
    b) 以单播形式发送其他协议报文(DD报文、LSR报文、LSU报文、LSAck报文)。
    1.5 OSPF形成邻居关系需要经历几个阶段?每个阶段有何意义?
  25. 初始(down)是一个邻居会话的初始状态,用来指明在最近一个Dead间隔的时间内还没有收到来自邻居路由器的Hcllo数据包。除非在NBMA网络中的那些邻居路由器,否则,HELLO数据包是不会发送给那些失效的邻居路由器的。在NBMA网络环境中,HellO数据包是每隔POLLINTERVAL的时间发送一次的。如果一台邻居路由器从其他更高—些的邻居状态转换到了失效状态,那么路由器将会清空链路状态重传列表、数据库摘要列表和链路状态请求列表。
  26. 尝试状态(attempt):这种状态仅仅适用于NBMA网络上的邻居,在NBMA网络上邻居路由器是手工配置的。当NBMA网络上具有DR选取资格的路由器和其邻居路由器相连的接口开始变为有效(Active)时,或者当这台路由器成为DR或BDR时,这台具有DR选取资格的路由器将会把邻居路由器的状态转换到attempt状态。在attempt状态下,路由器将使用hellointerval的时间代替pollinterval的时间来作为向邻居发送hello数据包的时问间隔。
  27. 初始状态(init): 这一状态表明在最近的dead时间里路由器收到了来自邻居路由器的Hello数据包,但是双向通信仍然没有建立。路由器将会在Hello数据包的邻居字段中包含这种状态下或更高状态的所有邻居路由器的路由器ID。
  28. 双向通信(2-way):这一状态表明本地路由器已经在来自邻居路由器的Hello数据包的邻居字段中看到了它自己的路由器ID,这也就意味着,一个双向通信的会话己经成功建立了。在多址网络中,邻居路由器必须在这个状态或更高状态时才能有资格被选作该网络上的DR或BDR。如果在Init状态下从邻居路由器那里收到一个数据库描述数据包,也可以引起邻居状态直接转换到2-Way状态。
  29. 信息交换初始状态(ExStart):在这一状态下,本地路由器和它的邻居将建立起主/从关系,并确定数据库描述数据包的序列号,以便为数据库描述数据包的信`急交换做准备。在这里,具有最高路由器D的邻居路由器将成为“主”路由器。
  30. 信息交换状态(Exchange):在这一状态下,本地路由器将向它的邻居路由器发送可以描述它整个链路状态数据库信息的数据库描述数据包。同时,在这个Exchangc的状态下,本地路由器也会发送链路状态请求数据包给它的邻居路由器,用来请求最新的LSA。
  31. 信息加载状态(Loading):在这一状态下,本地路由器将会向它的邻居路由器发送链路状态请求数据包,用来请求最新的LSA通告。虽然在ExGhange状态下已经发现了这些最新的LsA通告,但是本地路由器还没有收到这些LSA通告。
  32. 完全邻接:在这一状态下,邻居路由器之间将建立起完全邻接关系,这种邻接关系出现在路由器LSA和网络LSA中。
    1.5.1 广播网络如何选举DR/BDR有何特点?
  33. 在路由器和它的邻居路由器之间首先建立2-way,接着检查每台邻居路由器发送的Hello数据包的优先级、DR和BDR字段。列出所有具有DR和BDR选取资格的路由器的列表表(也就是说,路由器的优先级要大于0,并且它的邻居状态至少要是2-way的);接着,所有的路由器将宣称自己是DR路由器(Hello数据包的DR字段是它们自身接口的地址);所有的路由也将宣称它们自己是BDR路由器(Hello数据包的BDR字段是它们自身接口的地址)。除非没有选取资格,路由器计算时也将在这个具有选取资格路由器的列表中包括它本身。
  34. 从具有选取资格的路由器的列表中,创建一个还没有宣告为DR路由器的所有路由器的子集(宣告自己为DR路由器的路由器不能被选取为BDR路由器)。
  35. 如果在这个子集中的—台或者多台邻居路由器,它们在Hello数据包的BDR字段包含了它们自己的接口地址,那么具有最高优先级的邻居路由器将被宣告为BDR路由器。在优先级相同的条件下,具有最高路由器ID的邻居路由器将被选作BDR路由器。
  36. 如果在这个子集中没有路由器宣称自己是BDR路由器,那么具有最高优先级的邻居路由器将被宣告为BDR路由器。在优先级相同的条件下,具有最高路由器ID的邻居路由器将被选作BDR路由器。
  37. 如果—台或多台具有选取资格的路由器在Hello数据包的DR字段包含它们自己的接口地址,那么具有最高优先级的邻居路由器将被宣告为DR路由器。在优先级相同的条件下,具有最高路由器D的邻居路由器将被选作DR路由器。
  38. 如果没有路由器宣称自己是DR路由器,那么新选取的BDR路由器将成为DR路由器。
  39. 如果正在执行计算的路由器是新选取的DR或BDR路由器,或者它不再是DR或BDR路由器了,那么将重复以上的2~6步骤。
    其实DR/BDR选举就是“字段游戏”,DR的选举资格:在Hello包中的DR ID写的是自己的ID,BDR的选举资格:在Hello包中的BDR ID写的是自己的ID 且在 DR ID字段写的不是自己的ID,具体选举还要看接口优先级和最高Router-id。
    1.6 OSPF在不同区域发布缺省路由的原则是什么?
  40. 普通区域:
    a) 缺省情况下,普通OSPF区域内的OSPF路由器是不会产生缺省路由的,即使它有缺省路由。
    b) 当网络中缺省路由通过其他路由进程产生时,路由器必须将缺省路由通告到整个OSPF自治域中。实现方法是在ASBR上手动通过命令进行配置,产生缺省路由。配置完成后,路由器会产生一个缺省ASE LSA(Type5 LSA),并且通告到整个OSPF自治域中。如果ASBR上没有缺省路由,则路由器不会通告缺省路由。
  41. Stub Area:
    a) Stub区域不允许自治系统外部的路由(Type5 LSA)在区域内传播。
    b) 但是ABR会自动产生一条缺省的Summary LSA(Type3 LSA)通告到整个Stub区域内。
  42. Totally Stub Area:
    a) Totally Stub区域既不允许自治系统外部的路由(Type5 LSA)在区域内传播,也不允许区域间路由(Type3 LSA)在区域内传播。
    b) 但是ABR会自动产生一条缺省的Summary LSA(Type3 LSA)通告到整个Stub区域内。
  43. NSSA Area:
    a) 只配置了NSSA区域是不会自动产生缺省路由的。
    b) 如果希望到达自治系统外部的路由通过该区域的ASBR到达,而其它外部路由通过其它区域出去。则必须在ABR上手动通过命令进行配置,使ABR产生一条缺省的NSSA LSA(Type7 LSA),通告到整个NSSA区域内。
    c) 如果希望所有的外部路由只通过本区域NSSA的ASBR到达。则必须在ASBR上手动通过命令进行配置,使ASBR产生一条缺省的NSSA LSA(Type7 LSA),通告到整个NSSA区域内。
    d) ASBR产生缺省7类LSA不会在ABR上转换成5类LSA!!!与cisco不同。
  44. Totally NSSA Area:
    a) 配置Totally NSSA区域后,ABR会自动产生一条缺省的Type3 LSA通告到整个NSSA区域内。
    1.7 OSPF的邻接无法形成full状态是什么原因?
  45. 导致无法到达2WAY状态的原因:
    a) hello报文中的ared id不一致;
    b) hello报文中的netmask不一致;
    c) hello报文的发送间隔和超时间隔不一致;
    d) hello报文的验证方式和验证key设置不一致;
    e) 接口配置的IP不在同一网段;(不在一个网段,不通也是可以理解的)
    f) Hello报文中设置的flag标志位不一致;
    g) 试图通过辅助地址建立邻居关系;
    h) 配置的网络类型为NBMA,没有配置邻居命令或者在映射命令中没有指定broadcast参数;
    i) Ospf网路类型为NBMA或Broadcast类型,但所有接口DR优先级均为0;
    j) Router id 冲突;
    k) 系统软件bug或者硬件故障;
  46. 接着再分析一下无法到达FULL状态的原因:
    a) 两端接口的MTU设置不一致,导致DD报文无法正常交互。
    b) 对于BROADCAST或者NBMA网络类型而言,没有DR存在,即都是DRother,导致无法建立邻接关系并进行后续报文的交互。
  47. 可以到达FULL状态,但无法正常学习到路由的原因:
    a) 两端配置的OSPF 网络类型不匹配。
    1.8 LSA产生:常见的LSA都由谁产生?这些LSA都有何作用?ABR是否会在area 0中产生TYPE4的LSA?
    ABR只会在标准区域中生成TYPE 4的LSA,而且目的也只是通告其他ASBR的信息。但如果该ABR自己就是ASBR,它是不会向自己连接的标准区域发送TYPE 4的LSA的,这时标准区域内的路由器是通过TYPE 1 LSA 了解到ASBR的信息。
    1.9 LSA处理:OSPF对LSA如何进行唯一性标识?如果收到标识符相同、掩码不同的LSA5,路由器该如何处理?
  48. 通过LSA头部的LS ID (链路状态ID)、LS TYPE(链路状态类型)、Advertising Router ID(通告路由器ID)来唯一地标识一个LSA。 但由于一个LSA可能同时会有多个实例,因此要标识一个最新的LSA 实例,必须配合LS Sequence(序号)、LS Checksum(校验和)、LS Age(老化时间)三个字段。
  49. 如果路由器要产生一条新的TYPE 5 LSA,会首先检查LSDB中是否已存在LS ID一样的TYPE 5 LSA,如果不存在那就好办了,直接创建就完事。如果已经存在那么采取下列原则:比较将要新生成的TYPE 5 LSA的netmask长度与LSDB中已有LSA的netmask长度。
    a) 如果netmask_new > netmask_old,将新的LSA 的LS ID字段的中描述的主机位全置1,即将子网广播地址作为新生成LSA的LS ID,同时netmask字段采用netmask_new,并通告出去。
    b) 如果netmaskk_new < netmask_old,则会产生两条新的LSA:一个用于产生新的LSA并覆盖原有LSA,一个用于重新生成原有的LSA。产生一个用于覆盖原有LSA的新LSA,LS ID仍保持不变,LS Sequence为原有LSA的Sequence+1,COST为新LSA的COST值,netmask字段采用netmask_new;另外再产生一个用于恢复原有LSA的新LSA,将LS ID为原有LSA 的LS ID的子网广播地址,即将原有LS ID的主机位置1;LS Sequence为1;COST为原有LSA的COST值,netmask字段采用netmask_old。

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值