个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。

因此本文将以SRv6 BE场景下报文交互过程为例,以详细介绍SRv6。
有关于SR-MPLS的场景介绍,可参见SR-MPLS(BE)场景
关于SRv6的RFC,可参考2021年发布的RFC8986

Note:第一章主要简介了SRv6内容。有相关基础可以直接阅读第二和三章节。

目录

SRv6 BE场景

  • 目录
  • 1.SRv6概念
    • 1.1.SRv6是什么
    • 1.2.SRv6特点
  • 2.SRv6术语
    • 2.1.SRv6的SID
    • 2.2.SRH简介
  • 3.SRv6(BE)跨域场景介绍
    • 3.1.SID介绍
      • 3.1.1.Function功能
      • 3.1.2.Flavors附加行为
    • 3.2.SID地址的传递(报文分析)
    • 3.3.SRv6的场景分析
    • 3.4.L3VPN for IPv4 over SRv6 BE
    • 3.5.状态查看

1.SRv6概念

1.1.SRv6是什么

SRv6(Segment Routing v6,基于IPv6转发平面的段路由)是基于源路由理念而设计的在网络上转发数据包的一种协议。其核心思想是将报文转发路径切割成不同的段,再为其分配SID(Segment Identifier,段标识符)进行标识从而以段指导报文转发。
SR-MPLS基于MPLS转发平面
SRv6的一个重要特点是不再使用LDP/RSVP-TE协议,也不需要MPLS标签,简化了协议。
SRv6基于Native IPv6进行转发。Native IPv6指的是普通的IPv6报文。SRv6是通过IPv6扩展报文头来实现的。普通的IPv6设备也可以识别SRv6报文(其实是识别IPv6报文)。SRv6设备能够和普通IPv6设备共同部署,对现有网络具有更好的兼容性。

这就是SR的Segment概念,例如在SR网络中End节点可以支持SR路由能力,而对中间节点只要求进行普通的IPv6报文转发即可。

1.2.SRv6特点

SRv6原理简介:SRv6主要是利用的IPv6的扩展头部。在扩展头部中携带了“IPv6地址(被称为SID)”,利用这个IPv6地址来指导支持SRv6的设备对报文进行报文转发。该IPv6携带了报文的处理动作。
SRv6可编程:SR的设计理念在于对路径进行分段(Segment)以及在起始节点对路径进行排序组合(Segment List),确定出行路径。例如可以在SRH头部中(IPv6扩展头的一种),携带多个SID。每个节点设备处理不同的SID,从而严格规定报文的转发路径实现可编程。
传统路由网络如果需要指定路径则需要全网统一规划路由,这通常是难以实现的。

2.SRv6术语

2.1.SRv6的SID

Segment用于指导报文转发,总的来说可分为3类。分别是Prefix Segment、Node Segment、Adjacency Segment。而针对Segment的标识SID(Segment ID)也有如下三种。

分类 生成方式 作用
Prefix SID 手工 标识目的地址前缀。
简单理解可以用于标识目标网络
Node SID 手工 标识节点设备。
简单理解可以用于标识设备,例如OSPF的router-id
Adjacency SID 手工或协议动态分配 标识网络邻接。

Prefix SID/Node SID和Adjacency SID可以分别类比于传统IP转发中的目的地址出接口
SR-MPLS的SID是与MPLS概念相同的标签,SRv6的SID则可以单纯理解为IPv6地址
SRv6的SID=Locator+Function+Arguments
Locator:提供IPv6的路由能力,报文通过该字段实现寻址转发。此外,Locator对应的路由也是可聚合的。(用于传递报文的路由前缀)
Function:用来表达该设备指令要执行的转发动作,不同的转发行为由不同的Function来表达。(比如可以指定邻居转发或按节点解封装SRH按链路转发,传统L3VPN是按所建立的LSP转发)
Arguments:可选字段,是对Function的补充。这些参数可能包含流、服务或任何其他相关的信息,目前应用较少。

(SID的每个字段都是可变长的,并且可人为指定也可动态分配。并且一个SRH可以包含多个SID)

2.2.SRH简介

SRH也即(Segment Route Header)是IPv6的扩展头。
如下是IPv6的头部信息
Version:固定为6表示IPv6。
Traffic class:类似IPv6的TOS,用于QOS为报文分配优先级。
Flow Label:流标签。该字段用来标记 IP 数据包的一个流。
Payload Length:IPv6有效载荷的长度,包括扩展头长度。
Next header: IPv6 基本报头后的那一个扩展报头的信息类型。一个IPv6可以有多个扩展头,通过在扩展头中指定下一个头部信息
Hop limit:跳数限制。与IPv4的TTL作用相同。
Source Address:IPv6源地址。
destination Address:IPv6目的地址。
Extension Header:扩展头。类型由Next header定义。

IPv6的Next Header
IPv6定义了多种扩展头,这里对其进行简介
1@逐跳选项报头(Next Header=0)=该选项主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段。(每台IPv6都需要处理的参数)
应用场景:用于巨型载荷;用于路由器提示;用于资源预留。
2@目的选项报头(Next Header=60)=目的选项报头携带了一些只有目的节点才会处理的信息。目前,目的选项报文头主要用于移动lPv6
3@路由报头(Next Header=43)=路由报头和IPv4的Loose Source and Record Route选项类似,该报头能够被lPv6源节点用来强制数据包经过特定的路由器。
4@分段报头(Next Header=44)=同IPv4一样,IPv6报文发送也受到MTU的限制。当报文长度超过MTU时就需要将报文分段发送,而在IPv6中,分段通过分段报头来实现。
5@认证报头(Next Header=51)=该报头由IPSec使用,提供认证、数据完整性以及重放保护。它还对IPv6基本报头中的一些字段进行保护。
6@封装安全净载报头(Next Header=50)=该报头由IPSec使用,提供认证、数据完整性以及重放保护和IPv6数据报的保密,类似于认证报头。

IPv6的SRH
SRH实际是43号IPv6扩展报头路由报头的一种。
Next Header:1字节。描述后续头部类型。可以正常报文也可以是扩展头。这里携带的就是ICMPv6报文。
Length:1字节。自己扩展头的长度。
Type:1字节。标识路由报头的类型。4表示SRH
Segment Left:1字节。SRv6激活的SID。前文提到类似于MPLS的多层标签,SRH可以携带多个SID。这里用于标识当前节点应使用的SID号。该字段与C语言的指针有点类似。
SRv6的SID可以形象理解为IPv6网络中的标签
Last Entry:1字节。
Flags:1字节。
Tag:2字节。用于对数排包分组。可以实现基于组的策略。
Address:16字节,这一字段也叫Segment List[]。IPv6地址,也即SRv6的SID。一般有多个,只是这里只有一个SID=SL[0]。每有一个SID增加16字节
有一个需要说明的是这个SID列表 Segment List从上往下依次为SL0,1,2,…。在使用时,首先使用的是最低层的SL,而传统MPLS是从外层开始使用剥离。(正好相反)
点击此处回到目录

3.SRv6(BE)跨域场景介绍

根据之前的介绍可以知道SRv6是一种新型的隧道技术。IPv6地址(SID)替代MPLS的标签用于公网数据传递。
这里以L3VPN跨域BE场景为例子进行SRv6技术的介绍。实际上SRv6方案也可用于承载EVPN。

3.1.SID介绍

SRv6的SID主要是由Locator路由前缀+Function+Argument组成。
Locator:网络节点的标识。是IPv6路由前缀,主要用于路由传递。一个重要特性是可路由。
Argument:SID的可选参数,在双归双活场景下有应用。

3.1.1.Function功能

Function:SID处理的选择动作,指导报文进行转发。Function比较复杂,这里重点进行介绍
RFC定义了SRv6的不同处理动作,这里对不同类型进行介绍。
End:表示Endpoint SlD,用于标识目的节点(Node)。对应的处理动作为更新IPv6 DA,目的为End SID时正常路由表转发。
End.X:表示三层连接的Endpoint SID,用于标识链路。对应的转发动作是:更新IPv6 DA,从End.x SID绑定的出接口转发报文。
End.DT4:表示PE类型的Endpoint SID,用于标识IPv4 VPN实例。对应的转发动作是:解封装报文,并且查找IPv4 VPN实例路由表转发。等价于IPv4 VPN的标签。
End.DT6:表示PE类型的Endpoint SID,用于标识IPv6 VPN实例。对应的转发动作是:解封装报文,并且查找IPv6 VPN实例路由表转发。等价于IPv6 VPN的标签。
End.DX4:表示PE类型三层连接的Endpoint SID,用于标识IPv4 CE。对应的转发动作是:解封装报文,并且查找绑定CE SID的三层接口转发。
End.DX6:表示PE类型三层连接的Endpoint SID,用于标识IPv6 CE。对应的转发动作是:解封装报文,并且查找绑定CE SID的三层接口转发。
其实Function有一定的命名规则:
End:是最基础的Segment处理动作,中止当前动作。处理时将SRH的Segment Left字段-1,Segment List复制到IPv6的Destination Address中。
D:Discapsulate。不仅解封装IPv6扩展头还解封装IPv6报文。
X:指定出接口进行转发。
T:Table。查找路由表转发。
V:Vlan。查找vlan转发。
U:Unicast。查找单播Mac表转发。
M:Multicast。查看组播表转发。
B6:指定应用SRv6 Policy。
BM:指定应用SR-MPLS Policy。

3.1.2.Flavors附加行为

Flavors是为了增强SRv6 Segment而定义的附加Function行为。这些附加行为是可选项,它们将会增强SRv6 Segment的执行动作,满足更丰富的业务需求。2021年发布的RFC8986-Segment Routing over IPv6 (SRv6) Network Programming定义了如下三种Flavors。
PSP: Penultimate Segment Pop of the SRH:在倒数第二个Endpoint节点执行移除SRH操作。类似于MPLS的倒数第二跳弹出。但是这里是段的概念,每个段之间可能经历了多台设备。
USP: Ultimate Segment Pop of the SRH:在倒数第一个Endpoint节点执行移除SRH操作
USD: Ultimate Segment Decapsulation:在倒数第一个Endpoint节点执行移除IPv6头部操作

设备如何知晓对报文的Function处理动作:
在报文中携带SID时,会进行SID标识。例如在ISIS的LSP报文的SRv6 Locator型SubTLV中会携带Code字段进行标识具体是哪种Function,以及是否需要进行Flavors行为。
控制面:IGP会将SID在全网通告(还有BGP的相应动作)。
转发面:End节点收到DIP=SID的IPv6报文后,根据该SID相应的Function字段进行相应报文转发行为。
(对于该IPv6报文收到后,会进行SRH的SID替换DIP。这一过程在3.3章节进行详细介绍)。点击此处到达第3.3章节

和L3VPN的小区别
在L3VPN中,标签不仅作为数据转发的指导也承载了对私网租户的标识作用。
SRv6不存在L3VPN的标签,而是由SID代替了标签。SID的Locator本身作为IPv6路由前缀可以指导数据转发。而丰富的Function不仅可以承载对私网的标识,而且可以进一步指导报文的处理动作。相比于Label,业务承载类型和业务处理动作的丰富性都大大提高!!

3.2.SID地址的传递(报文分析)

与SR-MPLS相同,SR的SID都可由IGP协议动态生成。在IGP协议的收敛完成的同时,标签转发路径LSP也随之建立。
本场景下ISIS协议涉及SRv6功能的有如下三种TLV:Router capabilitySRv6 LocatorExtender IS reachability。接下来对其进行介绍


Router capability:T=242。
并在该TLV中标识携带 SRv6 capability:T=25。其中标识了路由器对SRv6的支持能力。Node Maximum SID Depth:T=23。
Router capability作用在于协商对SRv6的支持能力,因为设备对SID的处理程度是有限制的。这一限制主要在于芯片的限制。限制包含
Maximum Segment Left:对Segment Left字段最大支持处理能力;Maximum End Pop:节点POP能力;Maximum T Insert:最多插入SID数;Maximum T Encaps:最多的封装SID数;Maximum End D:执行End.D动作时,可指定SID最大值。

SRv6 Locator:T=27。主要用于传递SID信息,建立LSP。
Topology ID:12bit。表示所承载IGP协议对网络的支持能力。
Algorithm:1字节。表示所使用的路由算法。0表示SPF,1表示严格SPF。
Locator Size:1字节。和Locator共同表示了SID的Locator或路由前缀。
SubTLV=SRv6 End SID:Code=5。这里的End SID用于标识节点的SID。而PSP指的是Flavors行为(用于增强SRv6 Segment的执行动作)
PSP表示在倒数第二个End节点剥离SRH

这里的Local-sid也即节点SID。此外在Extended IS reachability中携带了邻居SID。

Extended IS reachability:T=22。主要用于传递SID信息。这里主要传递的是邻居SID End.X SID表示按链路进行传递。

在IGP分发SID收敛完成后,BGP为CE分配Prefix-SID即可

Extended Community:传递VPN的RT。
BGP Prefix-SID:为相应的节点配置Prefix-SID。目前wireshark4.0.1暂不支持对该字段的识别。但是可以隐约识别出:3001:1:1:1::。
MP-NLRI:传递相应的VPNv4路由192.168.1.0/24(可以通过Prefix Length=112进行判断),下一跳指定为1111::1111。

3.3.SRv6的场景分析

SRv6可以分为控制面和转发面。通俗意义上控制面通常指的是路由信息生成,而转发面则指的是具体的流量传输。
例如我们所说的传统MPLS L3VPN的控制面是MPLS(LDP生成标签)。转发面则是依照LSP进行流量传递。
普通L2VPN没有控制面通过2层的MAC/ARP泛洪学习来导通的,而基于MP-BGP的EVPN是以MP-BGP作为控制面传递5种EVPN路由(目前已新增到8种)实现了转控分离。

接下来以图示为例进行相应介绍:
CX1-CX6用于公网隧道建立(CX1-3为AS100,CX4-6为AS200。CX2和CX5可以支持SRv6功能,也可以不支持);
AR1AR2分别作为VPN的CE路由器;
NE路由器可用于模拟SDN控制器(SRv6通常与SDN技术相关联)AR1向AR2通信:

控制面:
1@控制面上首先应进行IPv6网络的构造,通常CX1-6的每台设备都需要进行IPv6的地址改造。
2@CX1-6都运行IGP协议,同时应使能SRv6功能。自动或手动指定相应的SID信息,由IGP协议进行泛洪。
SRv6的一个强大之处在于不要求所有网络节点都支持SR功能。并且工程应用上的设备通常跨越多个AS。
因为在使用时节点设备实际上执行的IPv6的普通路由转发,只有支持SRv6功能的End节点才处理SRH头部信息。(TLV格式构造报文的一个好处是,可以忽略自己不支持的TLV)

3@在IGP完成SID的泛洪同步后,需要建立BGP邻居传递相应的SID和VPN私网路由。CX1和CX3建立iBGP,CX4和CX6建立iBGP,CX3和CX4建立eBGP。如果有控制器的加入,还需另外和控制器NE建立BGP邻居。
(根据实际的网络规划决定是否需要建立BGP的RR反射器。)
传统MPLS L3VPN场景下,CE-PE端BGP的作用在于生成MP-BGP标签作为私网VPN的标识。而SRv6场景没有单纯的标签概念,CE-PE端只需将相应的VPN实例与SID关联即可。而SID(Function)中自动包含的相应处理动作。
(当然还是需要BGP传递私网路由)
SDN控制器的加入为SRv6提供了可编程功能:
SDN控制器通过建立BGP邻居,下发BGP SID属性(BGP-LS等)。从而指导相应的流量行为。
目前的SDN控制器可以达到在底层可达的网络(underlay)自动下发配置,更加简化了网络变动的工作量。
SRv6的一个重要特点:跨域
传统MPLS L3VPN中,经常有跨域场景出现。而MPLS是无法连续的为非AS域的设备分配标签(一般来说LSP的连续通常只能在一个AS内)。针对这种情况MPLS 提出了3种方案:OptionA(各自AS当成对端的CE设备转发),OptionB(ASBR之间的MP-eBGP分配MPLS单层标签),OptionC(有两种方案可分别产生2层和3层标签,相同点在于内层都是目标CE的私网标签)。
SRv6场景中,不存在传统意义的标签概念(标签被SID/IPv6地址替代)。控制面传递的是SID/IPv6地址。也即只需要每台设备仅知道去往目标CE的IPv6地址即可。

转发面:
在转发面上,实际是IPv6的路由转发。只是IPv6的报文携带了相应的SRH

在控制面完成后AR1和AR2(CE)以及CX1和CX6都具有了相应的路由信息。(或在PE上双点双向重分发,或使用缺省路由。)

1@源节点收到AR1传递过来的数据流量。查表发现下一跳为CX6。去往CX6的地址可以迭代入相应的SRv6隧道(工程上可以有多种隧道并行)
2@源节点对该报文进行封装。外层封装IPv6报文,Mac取相应的下一跳地址。同时IPv6插入相应的SRH头部信息。
目的IPv6地址取SRH的Segment List字段的最大值,发送时Segment left-1。
3@中间节点对相应报文进行2层解封装。
如果支持SRv6功能,则取SRH字段中Segment left对应Segment List的SID/IPv6地址,替换为DIPv6地址,随后Segment left-1发送。
点击此处回到SRH报文介绍
这一行为与MPLS网络中间节点设备的标签替换非常类似
如果不支持SRv6功能,则只查找IPv6路由表比对该SID进行转发。
4@目地节点对相应报文进行解封装。目的节点收到该IPv6报文,可以识别该IPv6地址(也是SID)相应的Function。例如可以是End.DT4型SID,此时就会将SRH和IPv6同时剥离暴露出里边的IPv4报文查找IPv6路由表转发。

这里未提到的一点是Flavors附加行为。
具有Flavors附加行为的SID可以进行倒数第二段弹出,或弹出SRH弹出IPv6等操作。
SRv6的Segment概念可以理解为处理SRH的两个最近节点。在这两个End之间只需查表转发IPv6。具体转发时,SR可以分为不同的SID类型(不同的SID具有不同的行为)。
例如可以指定链路转发,可以仅查路由表的节点转发。
而添加链路检测的SDN网络,可以根据需求实时下发SID更改转发情况。因此选择性非常强。
实际SRH携带情况还需以实际为准

点击此处回到目录

3.4.L3VPN for IPv4 over SRv6 BE

这里以SRv6 BE为例进行介绍。SRv6 BE可能更像一个加强版的MPLS转发。

考虑到设备所支持情况,这里在CX1、CX2和CX3之间建立AS=100,并且在CX3和CX4之间建立eBGP邻居关系AS200。
1@这里只提供了PE设备配置,有能力者可自行进行其他P和PE设备的配置。
有需要者可私信联系提供模拟器源文件及配置。

这里以CX3为例进行配置介绍:
sysname CX3
#
segment-routing ipv6
locator CX3 ipv6-prefix 3003:1:1:1:: 64
#
//设置SRv6的SID,指定locator为3003:1:1:1:: 且前缀为64。
//设备自动根据定义的长度进行选择。例如此时Locaor指定为64,Function未指定则动态分配那么Function为128-64。Function可以静态指定也可以动态指定,例如
locator CX3 ipv6-prefix 3003:1:1:1:: 64 static 32
opcode ::1111 end
//此时为64的Locator,32的人为分配Function,32的动态Function指定。
//(Arg参数未指定则该SID完全由Locator和Function组成。)

isis 10
is-level level-2
cost-style wide
network-entity 49.0000.0000.0003.00
#
ipv6 enable topology standard
segment-routing ipv6 locator CX3
#
#
//指定IGP携带SRv6相关信息,并且未定义的SID长度部分由IGP自动分配。
bgp 100
router-id 3.3.3.3
peer 2003::4 as-number 200
peer 2222::2222 as-number 100
peer 2222::2222 connect-interface LoopBack1
#
ipv4-family unicast
undo synchronization
#
ipv6-family unicast
undo synchronization
network 1111::1111 128
network 2222::2222 128
peer 2003::4 enable
peer 2222::2222 enable
peer 2222::2222 next-hop-local
#
ipv4-family vpnv4
undo policy vpn-target
peer 2222::2222 enable
peer 2222::2222 prefix-sid
#
//使能VPNv4传递BGP Prefix-SID信息。
//这里宣告了AS内部的loopback用于建立BGP邻居。

3.5.状态查看

SID信息Local-sid:描述了节点的SID。包括End SID、End.x SID和End.DT4等。
Locator:描述了本地定义的Segment信息。
3.2.章节(点击可达)已做过体现,这里不在举例。

VPN路由信息
私网流量传递时的报文

这里直接携带的是CX4的End型SID地址,直接查IPv6路由表转发。因为只有1个Segment,这里携带的是目的选项报头而非SRH。

具有SRH的报文
使用ping ipv6-sid -a 1111::1111 4444::4444可以进行相应SID可达性检查。

点击此处回到目录

SRv6(BE)-原理介绍+报文解析+配置示例相关推荐

  1. 组播IGMP-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将在IGMPv2协议报文的基础上进行介绍,以详细介绍主机-路由器IGMP组播协议.I ...

  2. 组播MSDP-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将在MSDP协议(Multicast Source Discovery Protoc ...

  3. IPv6/ICMPv6-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将以IPv6的常用协议上进行介绍,以详细介绍IPv6的相关内容. 关于ICMPv6相 ...

  4. BGPv4-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将在BGP Version4协议上进行介绍,以详细介绍BGP的相关内容. 关于BGP ...

  5. 组播PIM-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将在PIMv2协议报文的基础上进行介绍,以详细介绍组播协议PIM. 这里需要说明的是 ...

  6. 大数据Hadoop之——Kafka Streams原理介绍与简单应用示例

    文章目录 一.Kafka Streams概述 1)Kafka Streams是什么 2)流式计算与批量计算区别 3)Kafka Streams特点 二.Kafka Streams流处理拓扑 1)相关概 ...

  7. H3C交换机MAC VLAN原理及配置示例

    对于不是很常用的MAC VLAN,许多读者都感到很陌生,读者QQ群中也经常见到有读者提到这方面的问题,希望我给予解答.现从笔者编著,目前在全国热销的<Cisco/H3C交换机配置与管理完全手册& ...

  8. 【通信原理】PC上调试MODBUS基本功能(附报文解析)

    目录 一 测试环境配置: 二 MODBUS概述: 三 MODBUS测试步骤: 四 MODBUS协议分析: 一 测试环境配置: 本文用到的测试工具如下: (1)Mthings:MThings是一款基于M ...

  9. 【Groovy】Groovy 脚本调用 ( Groovy 配置文件格式 | Groovy 配置文件读取 | 完整配置文件及解析代码示例 )

    文章目录 前言 一.Groovy 配置文件格式 二.Groovy 配置文件读取 二.完整配置文件及解析代码示例 前言 在 Groovy 脚本 , Groovy 类 , Java 类中 , 可以调用 G ...

最新文章

  1. ntpdate[27350]: no server suitable for synchronization found
  2. Scala 字符串详解
  3. CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解
  4. 使用画图软件gunplot出现的问题和解决办法
  5. 卷积神经网络中的权值共享
  6. Ubuntu18.04 关闭和开启图形界面
  7. arcgis 利用栅格计算器计算 土地转移矩阵
  8. 软件测试方法--黑盒测试、白盒测试
  9. Macbook变速播放视频
  10. 载波频率成分法——理论公式
  11. 墙裂推荐!比Sci-Hub网站更好用的文献下载神器!解决所有文献下载烦恼
  12. ESXI安装部署方法
  13. 【大学物理】设计性实验报告
  14. 论文复现_显示屏装配尺寸测量
  15. win10+ubuntu16.04双系统双硬盘(SSD+机械硬盘)安装
  16. 监听电源键的单击或长按事件
  17. P1629 邮递员送信-dijkstra+反向建边
  18. Stein引理(Stein's lemma)
  19. 华为手机在计算机里怎么隐藏游戏,原来华为手机隐藏着这么多实用功能!玩一年恐怕也发现不了...
  20. java计算机毕业设计高校招生管理系统源码+mysql数据库+系统+lw文档+部署

热门文章

  1. 谁是欧洲杯夺冠热门球队 德国居榜首英格兰垫底
  2. Give me 5!
  3. java 集群im服务器消息路由,消息路由
  4. TextView设置指定字符串为指定颜色
  5. Pygments — Python syntax highlighter
  6. 【解决】addEventListener监听滚动与removeEventListener移除监听阻止冒泡(e.preventDefault())不生效
  7. react+antd出现preventDefault()警告报错
  8. 给宝宝早教c语言,分享:0-3岁婴幼儿语言发展与教育
  9. “土博士”和“洋博士”哪个更厉害?读哪个更好?
  10. HNOI 2002 营业额统计(Splay树)