个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将以SRv6 BE场景下报文交互过程为例,以详细介绍SRv6。
关于SRv6的相关资料,可参考如下RFC:
IGP对SRv6的扩展支持参考RFC:
- 2016-RFC7981-IS-IS Extensions for Advertising Router Information
- 2019-RFC8665-OSPF Extensions for Segment Routing
- 2019-RFC8666-OSPFv3 Extensions for Segment Routing
- 2019-RFC8667-IS-IS Extensions for Segment Routing
- 2023-RFC9352-IS-IS Extensions to Support SRv6
其他相关扩展功能还有:
- 2008-RFC5286- Basic Specification for IP Fast Reroute: Loop-Free Alternates
- 2012-RFC6571-Loop-Free Alternate (LFA) Applicability in Service Provider (SP) Networks
- 2015-RFC7490-Remote Loop-Free Alternate (LFA) Fast Reroute (FRR)
- 2020-RFC8924-Service Function Chaining (SFC) Operations, Administration, and Maintenance (OAM) Framework
- 2022-RFC9259-Operations, Administration, and Maintenance (OAM) in Segment Routing over IPv6 (SRv6)
- 2023-Internet-Draft (active)-Topology Independent Fast Reroute using Segment Routing
- 2023-Internet-Draft (active)-Enhanced Topology Independent Loop-free Alternate Fast Re-route
- 2023-Internet-Draft (active)-Topology Independent Fast Reroute using Segment Routing
- 关于 SRv6 工作原理和相关概念的相关介绍可参考博客SRv6技术课堂(一):SRv6概述
- 关于 SRv6 可靠性方案 SRv6 Ti-LFA 的相关介绍可参考博客SRv6技术课堂:SRv6可靠性方案
- 关于 SRv6 Endpoint Behaviors 和 Segment Types 的字段定义可参考IANA发布的Segment Routing
自动换行
SRv6还存在大量相关RFC,感兴趣者可查阅相关资料。
Note:第一章主要简介了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报文转发即可。
SRv6原理简介:SRv6主要是利用的IPv6的扩展头部。在扩展头部中携带了“IPv6地址(被称为SID)”,利用这个IPv6地址来指导支持SRv6的设备对报文进行报文转发。该IPv6携带了报文的处理动作。
SRv6可编程:SR的设计理念在于对路径进行分段(Segment)以及在起始节点对路径进行排序组合(Segment List),确定出行路径。例如可以在SRH头部中(IPv6扩展头的一种),携带多个SID。每个节点设备处理不同的SID,从而严格规定报文的转发路径实现可编程。
传统路由网络如果需要指定路径则需要全网统一规划路由,这通常是难以实现的。
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:
2017年的RFC8200定义了多种扩展头,这里对其进行简介
1@逐跳选项报头(Hop-by-Hop Options header,Next Header=0)
该报头主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段。(每台IPv6都需要处理的参数)
@:其应用场景可包括用于巨型载荷;用于路由器提示;用于资源预留。在SR的5G网络切片场景下,也会用到该报头。主要用于差异化服务。关于 SRv6 在网络切片方面的应用可参考博客SRv6扩展阅读-故障保护+Flex-Algo+G-SRv6+网络切片。
@:RFC8200规定逐跳选项报头必须紧跟在 IPv6 标头之后。
2@目的选项报头(Destination Options header,Next Header =60)
目的选项报头携带了一些只有目的节点才会处理的信息。目前,目的选项报文头主要用于移动lPv6。
3@路由报头(Routing header,Next Header =43)
路由报头和IPv4的Loose Source and Record Route选项类似,该报头能够被lPv6源节点用来强制数据包经过特定的路由器。
4@分段报头(Fragment header,Next Header =44)
同IPv4一样,IPv6报文发送也受到MTU的限制。当报文长度超过MTU时就需要将报文分段发送,而在IPv6中,分段通过分段报头来实现。
5@认证报头(Authentication header,Next Header =51)
该报头由IPSec使用,提供认证、数据完整性以及重放保护。它还对IPv6基本报头中的一些字段进行保护。
6@封装安全净载报头(Encapsulating Security Payload header,Next Header =50)
该报头由IPSec使用,提供认证、数据完整性以及重放保护和IPv6数据报的保密,类似于认证报头。
关于IPv6扩展头,RFC8200给出了如下说明:
1@:强烈建议当数据包出现多个报头时,应当按照以上顺序插入。但也允许节点以任意顺序处理收到报文中的扩展标头。
2@:封装安全净载报头后还可根据需要插入目的选项报头。详细的报头插入原则可查看相关资料。
3@:目的选项报头最多出现二次,其他报头最多出现一次。
4@:如果定义了其他扩展标头,则必须指定它们相对于上面列出的标头的排序约束。
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字节。
当前在RFC8754中对该Flags定义为未来使用,传输时必须置0并在接收时忽略该Flags字段。
在RFC9259中对该Flags进行如下定义。
//目前仅定义SRv6 O-bit,O-bit用于指示OAM处理。若O-bit置位,则每一个SRv6 Endpoint节点需要复制一份数据包并打上时间戳,然后上送复制报文和时间戳到控制平面处理。为了防止重复处理报文,控制平面无需响应IPv6上层的协议,比如ICMPv6 Ping&Tracert。通常在ping ipv6-sid时会携带该O-bit。
关于SRv6的另一个OAM实现是通过End.Op SID来实现连通性检测或连通质量检测,这里不在进行相关介绍。
Tag:2字节。用于对数排包分组。可以实现基于组的策略。
Address:16字节,这一字段也叫 Segment List []。IPv6地址,也即SRv6的SID。一般有多个,只是这里只有一个 SID=SL[0]。每有一个SID增加16字节。
有一个需要说明的是这个SID列表 Segment List 从上往下依次为 SL0,1,2,…。在使用时,首先使用的是最低层的 SL,而传统 MPLS 是从外层开始使用剥离。(正好相反)
点击此处回到目录
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)
Segment Routing domain (SR domain):一组参与源路由模型计算的节点。这些节点可以连接到相同的物理基础设施(例如,服务提供商的网络)。如果部署了多个协议实例,则SR域通常包括网络中的所有协议实例。
SR Global Block (SRGB):SR域中的全局Segment的集合。如果一个节点参与多个SR域,则节点为每个SR域分配一个SRGB。
@在SR-MPLS中,SRGB具有节点的本地属性,并且标识为全局Segment保留的一组本地标签。在里面SR-MPLS,强烈推荐在SR域内的所有节点上使用相同的SRGB。这样做可以简化操作和故障排除。
@在SRv6中,SRGB是SR域中全局SRv6 SID的集合。
SR Local Block (SRLB):SR节点的局部属性。如果一个节点参与多个SR域,则节点为每个SR域分配一个SRLB。
@在SR-MPLS中,SRLB是为本地段保留的一组本地标签。
@在SRv6中,SRLB是为本地SRv6 SID保留的一组本地IPv6地址。在控制器驱动的网络中,一些控制器或应用程序可以使用控制平面来发现本地段的可用集合。
SR Policy:一个有序的Segments列表。用于将数据包与指定的路径相关联。Segments列表是基于目的地和一组优化目标和约束(例如,延迟、亲和性、SRLG等)来计算的。计算可以是本地的,也可以委托给PCE服务器。
SR Policy的下发可以手工配置也可以通过NETCONF或PCEP协议。
PUSH:PUSH动作包括在Segments列表的顶部插入一个段。类似于MPLS的标签压入。
NEXT:当活动Segments执行完成时,NEXT动作是由下一个Segments的检查组成的操作。下一个分段变为活动分段。在SR-MPLS中,NEXT指的是顶部标签的POP。在SRv6中,NEXT指的是从SRH到IPv6报头的目的地地址的下一段的拷贝。
CONTINUE:Segments未执行完成时或数据包处于Segments中执行时。在SR-MPLS中,CONTINUE指的是顶部标签的SWAP。在SRv6中,CONTINUE指的是IPv6目的地址的转发。
点击此处回到目录
根据之前的介绍可以知道SRv6是一种新型的隧道技术。IPv6地址(也即SID)替代 MPLS 的标签用于公网数据传递。
这里以 L3VPN 跨域 BE 场景为例子进行 SRv6 技术的介绍。实际上 SRv6 方案也可用于承载 EVPN 传递私网路由的场景。
SRv6的SID主要是由 Locator路由前缀+Function+Argument 组成。
Locator:网络节点的标识。是IPv6路由前缀,主要用于路由传递。一个重要特性是可路由。
Argument:SID的可选参数,在双归双活场景下有应用。
Function:SID处理的选择动作,指导报文进行转发。Function 比较复杂,这里重点进行介绍。标准文档可参考2021-RFC8986-Segment Routing over IPv6 (SRv6) Network Programming,这里对不同类型进行简单介绍。
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。
其余 Function 动作可查阅相关资料。
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的相应动作)。
例如《3.2.1.IGP报文分析》中展示的ISIS LSP携带的SRv6 Locator-Type=27就携带了PSP型的End SID。
RFC8402中也表明BGP也可作为控制面传递SID。
转发面:End节点收到DIP=SID的IPv6报文后,根据该SID相应的Function字段进行相应报文转发行为。
(对于该IPv6报文收到后,会进行SRH的SID替换DIP。这一过程在3.3章节进行详细介绍)。点击此处到达第3.3章节
和L3VPN的小区别:
在L3VPN中,标签不仅作为数据转发的指导也承载了对私网租户的标识作用。
SRv6不存在L3VPN的标签,而是由SID代替了标签。SID的Locator本身作为IPv6路由前缀可以指导数据转发。而丰富的Function不仅可以承载对私网的标识,而且可以进一步指导报文的处理动作。相比于Label,业务承载类型和业务处理动作的丰富性都大大提高!!
与SR-MPLS相同,SR的SID都可由IGP协议动态生成。在IGP协议的收敛完成的同时,标签转发路径LSP也随之建立。
本场景下以ISIS作为Underlay协议进行SID信息的传递。本场景下ISIS协议涉及SRv6功能的有如下三种TLV:Router capability、SRv6 Locator和Extender IS reachability。接下来对其进行介绍:
自动换行
Router Capability-Type=242:由RFC7981介绍
Router Capability:T=242。
Type:1字节。取值242。
Length:1字节。取值5-255。
Router ID:4字节。
S-bit:1bit。置1时,表示Router capability整个ISIS域泛洪。
D-bit:1bit。UP/Down bit,置1时,表示从Level-2区域泄漏到Level-1区域。并不得在泄露至Level-2区域水平分割。
并在该TLV中标识携带
SRv6 capability :T=25。由RFC9352介绍。
OAM-bit:Operations, Administration, and Maintenance功能。
其中标识了路由器对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-Type=27:由RFC9352介绍
SRv6 Locator:T=27。主要用于传递SID信息,建立LSP。
Topology ID:12bit。表示所承载IGP协议对网络的支持能力。
Algorithm:1字节。表示所使用的路由算法。目前只有两种0和1:0表示SPF,1表示严格SPF。
由RFC8402介绍严格SPF表示结果严格按照SPF算法执行忽略任何可能的覆盖SPF决策的本地策略。如果使用严格SPF通常要求全网都使用严格SPF。
Locator Size:1字节。和Locator共同表示了SID的Locator或路由前缀。
SubTLV=SRv6 End SID:Code=5。这里的End SID用于标识节点的SID。
SRv6 Endpoint Function:2字节。表示Endpoint Behavior行为。
而PSP指的是Flavors行为(用于增强SRv6 Segment的执行动作)
PSP表示在倒数第二个End节点剥离SRH。
这里的Local-sid也即节点SID。此外在Extended IS reachability中携带了邻居SID。
自动换行
Extended IS reachability-Type=22:由RFC5305介绍
Extended IS reachability:T=22。主要用于传递SID信息。这里主要传递的是邻居SID End.X SID表示按链路进行传递。
并在该TLV中标识携带Sub TLV
SRv6 LAN End.X SID :Code=44。由RFC9352介绍。
B-bit:Backup备份标志位。如果置位表明SID受保护,使用IPFRR等功能。
S-bit:Set标志位。如果置位表明SID指的是一组相邻(因此也可以分配给其他相邻)。
P-bit:Persistent永久标志位。如果置位表明SID是永久分配的,即SID值在路由器重新启动和/或接口波动之间保持一致。
Algorithm:1字节。表示所使用的路由算法。目前只有两种0和1:0表示SPF,1表示严格SPF。
由RFC8402介绍严格SPF表示结果严格按照SPF算法执行忽略任何可能的覆盖SPF决策的本地策略。如果使用严格SPF通常要求全网都使用严格SPF。
Weight:1字节。RFC8402中主要描述了用于负载分担场景。
Endpoint Behavior:2字节。对于不支持或不识别的Behavior将进行忽略。
RFC8986中主要描述了所定义的几种End节点行为。本文档的3.1.1.章节对其进行了相关描述。
SID:16字节。封装通告的SRv6 SID。
Sub-sub-TLV-length:1字节。所使用的sub-sub- TLVs字节数,也即之后还可根据选择携带相应的sub-sub- TLVs。
在IGP分发SID收敛完成后,BGP为CE分配Prefix-SID即可:由RFC8669介绍。
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。
点击此处回到目录
BGP-SID简介:
RFC8402的page-9中介绍BGP也可作为Underlay网络传输SID地址信息,也即BGP-based distributed control plane。此时BGP Segments可分为:BGP-Prefix Segment和BGP Peering Segments。
BGP-Prefix Segment:SR域中的BGP-Prefix segment具有全局属性并且等价于IGP-Prefix Segment。
BGP Peering Segment:在BGP Egress Peer Engineering(EPE)的概念中,启用了EPE的出口节点可以通告与其所连接的对等体相对应的分段。这些Segment称为BGP Peering Segment或BGP peering SIDs。它们用于表达SR域间路径。
而BGP Peering Segment则又可分为:PeerNode SID、PeerAdj SID和PeerSet SID。
PeerNode SID:本地Segment(local segment),SR动作为NEXT。segment相关的对等体Node。类似于LDP的标签SWAP。
PeerAdj SID:本地Segment(local segment),SR动作为NEXT。接口连接与Segment相关的对等体。
PeerSet SID:本地Segment(local segment),SR动作为NEXT。同一个组的对等体集合,通过任意连接的接口进行负载分担。
Binding Segment:
Binding Segment称为绑定Segment,又称为粘连Segment。主要用于SID的扩展,网络不透明和服务独立性。
通常由于设备的芯片等硬件的限制,SRH所能携带的SL通常是有限的。当进行一个大范围多个 Segment 的网络时,就无法一次包含所有的 SID。此时可通过 SID 映射的方式进行扩展。
此外与 SR Policy 强相关的 Binding Segment 也可以实现多种策略路由。
SRv6可以分为控制面和转发面。通俗意义上控制面通常指的是路由信息生成,而转发面则指的是具体的流量传输。
例如我们所说的传统 MPLS L3VPN 的控制面是 MPLS(LDP基于路由表生成标签)。转发面则是依照形成的 LSP 进行流量传递。
普通的 L2VPN 没有控制面,而是通过2层的 MAC/ARP 泛洪学习来导通的。目前基于 MP-BGP 的 L2VPN EVPN 以 MP-BGP 作为控制面传递 5 种 EVPN 路由实现了转控分离。(目前EVPN路由已标准化了8种。)
接下来以图示为例进行相应介绍:
CX1-CX6用于公网隧道建立(CX1-3为AS100,CX4-6为AS200。CX2和CX5可以支持SRv6功能,也可以不支持);
AR1和AR2分别作为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-LS 邻居。
(根据实际的网络规划决定是否需要建立 BGP 的 RR 反射器。)
在传统MPLS L3VPN场景下,PE 端 BGP 的一个作用在于生成 MP-BGP 标签作为私网VPN的标识。而SRv6场景没有单纯的标签概念,PE 端只需将相应的 VPN 实例与 SID 关联即可。而 SID(Function) 中自动包含的相应处理动作。
(当然还是需要 BGP 传递私网 IPv4 路由,只是下一跳指向了IPv6。RFC9252)
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,SRH 的处理由所支持的设备来完成。
1@在源节点收到AR1传递过来的数据流量。查表发现下一跳为CX6。去往CX6的地址可以迭代入相应的 SRv6 隧道。(实际使用时可能有多种隧道并行)
2@在源节点对该报文进行封装。外层封装 IPv6 报头,MAC 取相应的下一跳地址。同时 IPv6 报头插入相应的 SRH 头部信息。
DIPv6 地址取 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携带情况还需以实际为准
点击此处回到目录
这里以 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。
//指定名为 [CX3] 的 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
#
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 v4
undo policy -target
peer 2222::2222 enable
peer 2222::2222 prefix-sid
#
#
//使能VPNv4传递BGP Prefix-SID信息。
//需要宣告了AS内部的loopback用于建立BGP邻居。
SID信息Local-sid:描述了节点的SID。包括End SID、End.x SID和End.DT4等。
Locator:描述了本地定义的Segment信息。
3.2.章节(点击可达)已做过体现,这里不在举例。
VPN路由信息此处可看到私网路由的下一跳为 IPv6 地址。
私网流量传递时的报文
这里直接携带的是 CX4 的 End 型 SID 地址,直接查 IPv6 路由表转发。因为只有1个Segment,这里携带的是目的选项报头而非SRH。
具有SRH的报文
使用ping ipv6-sid -a 1111::1111 4444::4444可以进行相应SID可达性检查。
IPv6 的 Next Header 为43号路由报头,路由报头类型为4表示SRH。同时路由报头的 Next Header 为58标识携带 ICMPv6 作为payload。
点击此处回到目录
主要参考2022-RFC9256-Segment Routing Policy Architecture进行描述。
此时仅进行简单介绍,详细的取值和定义可查阅相关资料。
有关于SRv6-TE的场景介绍,可参见博客SRv6 TE Policy场景-原理浅谈及配置示例。
1@:SR Policy必须通过元组<Headend,Color,Endpoint>来标识。Color和Endpoint共同描述了到目标的信息。
元组是一个程序概念,可以理解为数据结构的最小单元。只是这个单元有三个要素/成员。
Headend:实例化或实施策略的节点。也即IPv4/IPv6地址,在SR domain中全局唯一。
Color:非0的32-bit整数。将SR策略与意图或目标(例如,低延迟)相关联。
Endpoint:policy的目的。同样即IPv4/IPv6地址,在SR domain中全局唯一。特定情况下可为未指定地址:0.0.0.0或::。
2@:SR Policy与一个或多个 Candidate Path 候选路径相关联。候选路径可通过 Path Computation Element Communication Protocol (PCEP) 或BGP SR Policy协议或手工传递相应的信令。
3@:候选路径可以是动态的、显式的或复合的。
动态的候选路径表示特定数据平面(即SR-MPLS或SRv6)的优化目标和一组约束。Headend可借助PCE对优化问题动态的生成SL或SL的集合。
显式的候选路径表示为SL或SL的集合。
复合的候选路径充当对SR Policy进行分组的容器。每个策略都具有显式的候选路径和/或具有潜在不同优化目标和约束的动态候选路径的组合,可用于对分组流进行负载平衡的引导。
简单来说候选路径就是Segment List,用于标识的流量经过的路径。并且如果动态候选路径与SL相关联,则SID报文中的weight有效,并默认置为1用于负载分担。
自动换行
SR Policy可包含/继承其他SR policy,此时要求子父SR Policy有如下要求:
@:子父SR Policy的endpoints必须相同。
@:子父SR Policy的Color必须不同。
@:父SR Policy不可使用复合的候选路径。
4@:至少有一个Candidate Path 候选路径,SR Policy才可生效。
因此SR Policy的关键在于候选路径的选择。
CP的标识:候选路径的标识主要有以下原则:
@:前文提到SR Policy可有多个候选路径,这里要说明的是一个候选路径只为一个SR Policy服务。一个候选路径不可共享给其他SR Policy。
@:SL不可用于区分候选路径,即使他们一样。SL是候选路径的一个属性。
@:元组唯一标识候选路径。
@:候选路径使用ASCII[RFC0020]字符(即0x20到0x7E)的符号名称发信号,以用作用户友好属性,用于调试和故障排除。此类符号名称不得被视为候选路径的标识符。
Protocol-Origin of CP:8-bit,候选路径的协议起源。
目前RFC9256建议PCEP协议取10;BGP SR Policy协议取20;配置取30。
该值可作为同等条件下候选路径选择依据之一。
Originator of CP:160-bit,候选路径的始发者用于识别节点。该节点在Headend上提供或用信号标识候选路径。
Originator主要由ASN(4字节)和Node Address(16字节)进行标识。当AS Number取2字节时,高bit置0。同样的当使用IPv4地址时,映射到低32-bit位而高bit置0。
Discriminator of CP:32-bit,候选路径在来自特定Protocol-Origin的SR policy的上下文中唯一地标识。
候选路径的唯一标识,与Protocol-Origin相关。不同的Protocol-Origin有不同的选择定义。
Preferencer of CP:32-bit,用于为SR Policy选择最佳候选路径。
越大越优,默认100。PCEP协议和BGP SR Policy协议对优先级的定义可查阅相关文档。
Active CP:当候选路径可用并被选择为最优时称为Active CP。每一次的路径信息改动必须重新选举Active CP。选举原则如下
@:比较Preferencer,越大越优
@:比较Protocol-Origin,越大越优。如果都是手工配置的,优选已经存在的。
@:比较Originator,越小越优。
@:比较Discriminator,越大越优
SR Policy的实际应用:在SR Policy的实际应用上通常有如下原则:
@:只有可用的SR Policy才能下发到转发面,指导流量执行转发。
@:Active CP必须用于转发被引导到该策略上的流量,但某些情况除外,如Fast ReRoute快速重新路由。
@:如果一组SL与策略的Active CP相关联,则转向是按流的,并根据每个SL的相对权重加权ECMP(W-ECMP)。当复合候选路径处于活动状态时,引导到每个组成SR策略的流的分数等于每个组成SR政策的相对权重。w/Sw。
@:加权负载平衡的准确性取决于平台实现。
SR Policy的priority:取值0-255,越小优先级越高。默认128。SR Policy的priority可以用在如下场景:
当拓扑发生改变时,每一条SR Policy势必要重新计算Active CP。priority可用于指导优先进行计算的SR Policy。
当使用非默认的priority时,也用于选举。
SR Policy的应用举例:
有如下场景1:
SR Policy1有候选路径CP1和CP2,按上文介绍应选择CP1作为Active CP。并且在引导数据流量时,根据flow-based哈希到SL1的流量应为W1/(W1+W2)。
有如下场景2:
SR Policy100为复合Policy,有父SR Policy color1和SR Policy color2。并且依照上文定义,父SR Policy color1和SR Policy color2都不包含复合CP。此时在父SR Policy color1上进行per-flow的哈希流量应为W1/(W1+W2)。
这里的流量还是根据转发表里的SL来。
Segment Routing Database:也即SR-DB。
SR-DB是一个数据库概念,用于说明可能有助于SR Policy计算和验证的各种信息及其来源。SR Policy计算节点(例如,Headend或控制器)通常维护SR-DB。Headend可通过SR-DB验证显式候选路径和动态候选路径。
SR-DB通常包括:
@:IGP拓扑信息
@:Segment Route信息,例如SRGB、SRLB和SID等。
@:TE链路属性,例如TE度量、Shared Risk Link Groups共享风险链路组、attribute-flag属性标志、extended admin group扩展管理组等。
@:扩展TE链路属性,例如延迟、丢包。
@:AS内部拓扑信息。
所连接域的拓扑可以通过IGP、BGP-LS和NETCONF协议获得。非所连接则可通过BGP-LS和NETCONF协议获得。
Segment Types:
基于所需的数据平面,可从Segment List构建MPLS标签栈或SRv6 SRH。但是,Segment List本身可以使用不同的Segment Types来指定,并且当前定义了以下内容:
Type A=SR-MPLS Label:与SR-MPLS定义的任何Segment Types相对应的MPLS标签
Type B=SRv6 SID:与SRv6的任何SID行为相对应的IPv6地址
Type C=IPv4 Prefix with optional SR Algorithm:这是一种特殊情况。要求headend将指定的IPv4前缀地址解析为与其前缀SID段相对应的SR-MPLS标签。
Type D=IPv6 Global Prefix with optional SR Algorithm for SR-MPLS:这是一种特殊情况。要求headend将指定的IPv6全局前缀地址解析为与其前缀SID段相对应的SR-MPLS标签
Type E=IPv4 Prefix with Local Interface ID:这是一种特殊情况。要求headend将指定的IPv4前缀地址解析为发起它的节点,然后使用本地接口ID来识别其邻接为点对点链路。
Type F=IPv4 Addresses for link endpoints as Local, Remote pair:这是一种特殊情况。要求headend将指定的IPv4本地地址解析为发起它的节点,然后使用IPv4远程地址来识别所引用的链路邻接。
Type …
Type K= IPv6 Addresses for link endpoints as Local, Remote pair for SRv6
Binding SID of a Candidate Path:
相同SR Policy的候选路径应该具有相同的Binding SID。
不同SR Policy的候选路径不得具有相同的Binding SID。
Binding SID of a SR Policy:
SR Policy的Binding SID是其活动候选路径的Binding SID。
使用SR Policy导入流量:主要的方式有4种。
通过Active SID:传入数据包具有与头端的本地Binding SID相匹配的Active SID。
举例:头端H
@有Active SL和Binding SID B
自动换行
当H收到具有标签/SL为数据包K时,H将进行POP/PHP弹出B并压入。此时形成 的标签/SL进行相应转发。
Per-Destination的引导:传入数据包与BGP/服务路由匹配,该路由在SR策略上重复出现。
举例:头端H
@从BGP学习到路由R有下一跳N,Color扩展属性C和VPN标签V;
@有可用SR Policy P(headend=H,Color=C,endpoint=N),且其有可用候选路径和Binding SID B
@有BGP policy可匹配到Color扩展属性C并可应用
自动换行
如果满足所有这些条件,H在RIB/FIB中安装R,下一跳设置BSID B的SR Policy P,而非N。当H收到可匹配路由R的数据包K时,H将压入标签栈/SL。
举例:头端H
@从BGP学习到路由R有下一跳N,Color扩展属性C和VPN标签V;
@有可用SR Policy P1(headend=H,Color=C1,endpoint=N),且其有可用候选路径和Binding SID B1
@有可用SR Policy P2(headend=H,Color=C2,endpoint=N),且其有可用候选路径和Binding SID B2
自动换行
如果满足所有这些条件,H在RIB/FIB中安装R,下一跳设置BSID B的SR Policy P2,而非N。因为优选Color大者。并且当SR Policy P1失效时,继续优选Color大的SR Policy。
Per-Flow的引导:传入数据包根据特定的Flow特征在Forwarding Class转发数组上匹配或递归,根据选中的SR Policy进行转发。
举例:头端H
@有可用SR Policy P1(headend=H,Color=C1,endpoint=N),且其有可用候选路径和Binding SID B1
@有可用SR Policy P2(headend=H,Color=C2,endpoint=N),且其有可用候选路径和Binding SID B2
@有指向N的数组/队列A。这一数组/队列称为Forwarding Class,并且有元素0-7。例如A[0],A[1],A[2],…,A[7]。数组/队列A中进行如下定义,使用IGP转发至N的数据流定义为A[0],具有Color=C1映射A[2],具有Color=C1映射A[2]。
@具有相应的Flow分类,例如基于VLAN/TOS/DSCP/IP Destination/IP Source/Port等。并对相应的Flow进行着色Color。
自动换行
如果满足所有这些条件,发往N的数据将进行递归。Entry A(0)将按IGP最短路径转发,Entry A(1)将引导至SR Policy P1,Entry A(2)将引导至SR Policy P2。
需要注意的是,即使走A[0]数组/队列也可压入Prefix-SID进行SL转发。并且其他未匹配或无效匹配的数据走A[0]。
当所有流量都进行A[0]转发时,发往N的转发条目被更新以绕过数组/队列并直接指向其传出接口和下一跳。
Policy-Based的引导:传入的数据包与在SR Policy上引导它们的路由策略相匹配。
头端H可以配置有本地路由策略,该策略覆盖任何BGP/IGP路径并在SR Policy上引导指定的数据包。这包括使用IGP Shortcut等机制,通过SR策略自动路由IGP前缀。
点击此处回到目录