2.SRv6
SR架构设计之初,就为SR数据平面设计了两种实现方式:一种是SR-MPLS,其重用了MPLS数据平面,可以在现有IP/MPLS网络上增量部署;另一种是SRv6,使用IPv6数据平面,基于IPv6路由扩展头进行扩展。
RFC8402(Segment Routing Architecture)介绍了源路由的机制,即在头节点引入一段有序的Segment List控制流量引入和转发。这个行为可以被看作是在头节点输入一段有序的指令(Instruction),每个指令则代表了在网络中某个特定位置的功能(Function)。功能是节点上本地定义的,例如简单的按照Segment List转发或其他复杂的用户自定义行为。
SRv6(draft-ietf-spring-srv6-network-programming)更强调网络编程,这能将简单和复杂的网络功能结合,能够实现更多的网络目的而不仅仅是转发。
基于IPv6转发面的SRv6,通过在IPv6报文中插入一个路由扩展头SRH(Segment Routing Header),在SRH中压入一个显式的IPv6地址栈,通过中间节点不断的进行更新目的地址和偏移地址栈的操作来完成逐跳转发。
网络编程的概念
网络意图
–某业务沿着低时延路径转发SDN控制器
–业务需求转换为网络模型、SRv6段
–控制器计算将路径编码为SRv6 Segment插入报文中网络设备
–网络设备转发报文
SRv6的价值
- 简化协议、简化网络:去掉LDP、RSVP-TE等MPLS控制协议,网络控制层面协议简化为IGP/BGP。无需维护多种协议状态,并应对复杂的协议状态同步问题
- SDN事实上的标准应用:兼具全局最优和分布智能的优势,可以实现各种流量工程,根据不同业务提供提供按需的SLA保障
- 100%拓扑保护:任意拓扑100%保护倒换全覆盖,保护路径最优(与收敛后的路径一致)
- 强可扩展性:基于源路由技术,每条流的状态仅在头节点维护,中间节点不感知
2.1 IPv6 Segment Routing Header(SRH)
2.1.1 SRH字段
RFC 8754中定义IPv6 SRH扩展头标准,在IPv6报文增加一个SRH扩展头。
next=43字段
:表明是Routing Extension Header。IPv6的扩展报头类型之一就是路由报头 (Routing Header),其类型号是43,。IPv6源结点使用路由报头列出一个或多个中间结点,使得数据包在去往最终目的地的路径上经过这些结点。因此源结点可以使用路由报头来实现数据包的源路由。
Routing Extension Header的Routing Type建议值为4
表明是SR Header,称作SR扩展头或者SRH。
SRH继承路由报头属性:它应该只在数据包中出现一次,并且如果Segment Left = 0,则忽略 (但不丢弃) SRH,并且基于数据包中的下一报头来处理数据包
Segment Left
是一个指针,指向下面的地址列表,比如2,就会把指针为2的地址放入到目的地址中,从而影响数据的转发
如果结点收到数据包,并且数据包的目的地址对应于该结点的地址,则该数据包检查扩展报头 (如果存在)。如果扩展报头中含有结点不能识别的路由类型的路由报头,结点的行为取决于 “Segment Left” 的值:
如果Segment Left = 0,则节点忽略路由报头并处理数据包的下一报头。
如果Segment Left != 0,则节点丢失数据包,并且向数据包的源地址发送ICMP “参数问题 (Parameter Problem)” 的消息。
SRH扩展头包含如下内容:
- Segment List:有序的SRv6 SID列表
- Segments Left(SL):SRv6激活的SID为Slist【SL】。转发过程中通过修改SL,同时更换DIP为活跃的SID来分段完成转发
- Tag:用于对数据包分组可以实现基于组的策略。
- SRH TLVs(NSH metadata,HMAC TLV,Padding TLV等):可以作为segment list的SID共同使用的全局参数
从SRH看SRv6网络可编程能力
SRv6较于SR-MPLS有更强大的网络编程能力,这种能力体现在SRH中。
整体上看SRH有三层编程空间:
- 第一层是segment序列。它可以将多个segment组合,形成SRv6路径。这一点和MPLS标签栈类似。
- 第二层是对SRv6 SID 128bit地址的运用。MPLS标签中四个段是定长的(20bit标签、8bit TTL、3bit TC和1bit栈底标识)。而SRv6 SID的128bit可以灵活分段,并且每个段的长度也可以变化。由此SRv6具备更灵活的可编程能力。
- 第三层是紧接在segment序列后的可选TLV。报文在网络中传送时,如果需要在转发平面封装一些非规则类的信息,可以通过在SRH中TLV的灵活组合来完成。
2.1.2 SRH处理过程
SRv6路径上分为三种不同角色的结点。
源结点
源结点是可以产生带有SRH的IPv6数据包的任何结点:
产生带有SRH的IPv6数据包的主机
插入SRH或压入新的带有SRH的外部IPv6报头的SRv6域入口节点
当源结点产生数据包时,它会为数据包创建SRH,如下所示,并将其插入报头。
Segment List:采用对路径进行逆序排序的方式编码n个Segment。第一个位置是最后的Segment,最后位置是第一个Segment。
Segment Left:设置为n-1。
First Segment:设置为n-1。
Des-address:数据包地址设置为路径的第一个Segment。
HMAC TLV和 (或) 其他TLV可以添加到SRH。
事实上,SRv6主报头中的目的地址会被编码为active segment对应的IPv6地址。
Segment端节点
带有SRH的IPv6数据包的目的地址如果与结点的地址一样,则该节点称为Segment端节点。
Segment端节点接收到一个带有SRH的数据包时的操作如下:
if “Des-address == self-address” then
— if “Segment Left > 0” then
—— Segment Left - 1 (next Segment become active)
—— update Des-address to active SID (IPv6 address)
—— if “Segment Left ==0” then
——— if “C-flag == 1” then
———— remove SRH
——— endif
—— else
——— process next header
—— endif
— endif
endif
avtive Segment是Segment Left指向的Segment List中的Segment。Active Segment也被设置为数据包的目的地址。在每个Segment端节点处,通过在Segment List中找到的下一个active Segment来更新目的地址。
中转结点
中转结点是数据包路径上的一个结点,但不是Segment端节点。IPv6规范规定中转结点必须将数据包转发到其IPv6目的地址,且不改动SRH。中转结点不需要支持SRv6来转发数据包。
2.2 网络指令:SRv6 Segment
SRv6 Segment是一个128位数,通常也可以称为SRv6 SID或者SID。SID是一种实例化的IPv6地址,此类IPv6地址被赋予唯一的功能,一个SRv6 SID可以表示一个节点/链路,或者一个L2/L3的VPN,又或者一个服务。可以说,通过SRv6 SID可以定义任何的网络功能。
通常一条计算机指令包括两个部分,opcode(操作码)和operand(操作数)。opcode是指令要完成的操作,operand是参加运算的数据及其所在地址。同样SRv6网络编程也要定义网络指令,及SRv6 segment。
SRv6 segment是IPv6地址形式,通常也可以成为SRv6 SID
与SR MPLS的Segment不同,SRv6的Segment有128bits,而且分成了三部分:
- Locator(位置标识):网络中分配给一个网络节点的标识,可以用于路由和转发数据包。Locator有两个重要的属性,可路由和聚合。在SRv6 SID中Locator是一个可变长的部分,用于适配不同规模的网络。
- Function(功能):设备分配给本地转发指令的一个ID值,该值可用于表达需要设备执行的转发动作,相当于计算机指令的操作码。在SRv6网络编程中,不同的转发行为由不同的功能ID来表达。一定程度上功能ID和MPLS标签类似,用于标识VPN转发实例等。
- Args(变量):转发指令在执行的时候所需要的参数,这些参数可能包含流,服务或任何其他相关的可变信息。
三部分的表现为LOC:FUNCT:ARG。注意Length<=128。当长度小于128时,保留位用0补齐
Locator
Locator是网络拓扑中的一个网络节点的标识,用于路由和转发报文到该节点,实现网络指令的可寻址。
Locator标识的位置信息由两个重要的属性:可路由和可聚合。节点配置Locator之后,系统会生成一条Locator网段路由,并且通过IGP在SR域内扩散。网络里其他节点通过Locator网段路由就可以定位到本节点,同时本节点发布的所有SRv6 SID也都可以通过该条Locator网段路由到达。
在华为设备配置中,配置前缀为2001:DB8:ABCD:,长度为64 bit:
[Router] segment-routing ipv6
[Router-segment-routing-ipv6] locator srv6_locator1 ipv6-prefix 2001:DB8:ABCD: 64
Fuction & Argument
Function用来表示该指令要执行的转发动作(实RFC中叫做behavior),相当于计算机指令的Opcode。在SRv6网络编程中,不同的转发行为由不同的Fuction来标示,例如在RFC中定义了公认的End(类似node segment)、End.X(类似邻接segment)、End.DX4、End.DX6等。
Argument是可选的,这是对Function的一个补充。
例如End-x类似SR-MPLS中的Adjacency SID,用于标识某条链路。配置如下:
[Router-segment-routing-ipv6] locator srv6_locator1 ipv6-prefix 2001:DB8:ABCD: 64
[Router-segment-routing-ipv6] opcode ::1 end-x interface g3/0/0 next-hop 2001:DB8:200::1
此Function对应的opcode为::1,此时没有Argument,那么SRv6 SID的只为2001:db8🔡:1
此Function的行为标示将报文从指定接口(G3/0/0),转发给对应的邻居节点(2001:db8:200::1)
SRv6 SID总结
首先它的长度128bit与IPv6地址长度保持了兼容(实际上他们之间没有关系,这只是一种巧妙的设计),这使得SRv6 SID可以作为IPv6地址使用。且现有的IPv6地址也能在读在SRv6中使用。
其次,SRv6中SID中的“Locator+Function”设计实际上是一种“路由+MPLS”的融合。总所周知MPLS是一种“2.5”层技术,SRv6可以类似的看做是一种“3.5”层技术,它同时融合了路由和MPLS技术的优势。
最后SRv6 SID中字段的含义和长度是可自定义的,而非像MPLS标签采用固定格式。这提供了更好的编程灵活性。
2.3 SRv6节点
源节点(SR source node):生成SRv6报文的源节点
中转节点(transit node):转发SRv6报文但不进行SRv6处理的IPv6节点
endpoint节点(SR segment endpoint node):SRv6报文的目的节点
2.3.1 Source Node
源节点将数据包引导到SRv6 segment list中,如果SRv6 segment list只包含单个SID,并且无需在SRv6报文中添加信息或TLV字段,则SRv6报文的目的地址字段设置为该SID。
源节点可以是生成IPv6报文且支持SRv6的主机,也可以是SRv6域的边缘设备
如图本咧为L3VPNv4 over SRv6 TE policy,即在SRv6上承载IPv4流量。源节点负责将IPv4流量引入隧道,封装SRH
2.3.2 Transit Node
中转节点是在SRv6报文路径上不参与SRv6处理的IPv6节点,即中转节点只执行普通的IPv6报文转发
当节点收到SRv6报文后解析报文的IPv6目的地址字段。如果IPv6目的地址不是本地配置的SRv6 SID也不是本地接口地址,节点则将SRv6报文当做普通IPv6报文查询路由表执行转发,不处理SRH。
中转节点可以使普通的IPv6节点,也可以是支持SRv6的节点
2.3.3 Endpoint Node
在SRv6报文转发过程中,节点接收报文的IPv6目的地址是本地配置的SID,则节点被称为Endpoint节点
Endpoint节点需要处理SRv6 SID和SRH
2.3.4 SRH处理过程
在SRv6转发过程中每经过一个SRv6节点,segment left(SL)字段减1,IPv6 DA信息变换一次,Segment Left和Segment List字段共同决定IPv6 DA信息
与SR-MPLS不同,SRv6是从下到上逆序操作,SRH中的segment在经过节点后也不会被弹出。因此SRv6报头保留了路径信息可以做路径回溯
2.3.5 SRv6指令集
SRH存储了实现网络业务的有序指令列表,相当于计算机的程序。其中的Segment List[0] ~ Segment List[n]相当于计算机程序的指令。第一个需要执行的指令是Segment List[n]。Segment Left相当于计算机程序的PC(Program Counter,程序计数器)指针,指向当前正在执行的指令。
SRv6指令的命名规则
End:是最基础的Segment Endpoint执行指令,表示中止当前指令,开始执行下一个指令。对应的转发动作是将SL值-1,并将SL指向的SID复制到IPv6报文头的目的地址中。
X:指定一个或一组三层接口转发报文。对应的转发行为是按照指定出接口转发报文。
T:查询路路由表并转发报文。
D:解封装,移除IPv6报文头和与它相关的扩展报文头。
V:根据VLAN查表转发。
U:根据单播MAC查表转发。
M:查询二层转发表进行组播转发。
B6:应用指定的SRv6 Policy。
BM:应用指定的SR-MPLS Policy。
源节点行为
SRv6源节点负责将流量引导到SRv6 policy中,并执行可能的SRH封装。下面列举了SRv6源节点封装报头的几种模式:
源节点行为 | 功能描述 |
---|---|
H. Insert | 为接收到的IPv6报文插入SRH,并查表转发。 |
H. Insert. Red | 为接收到的IPv6报文插入Reduced SRH,并查表转发。 |
H. Encaps | 为接收到的IP报文封装外层IPv6报文头与SRH,并查表转发。 |
H. Encaps. Red | 为接收到的IP报文封装外层IPv6报文头与Reduced SRH,并查表转发。 |
H. Encaps. L2 | 为接收到的二层帧外封装IPv6报文头与SRH,并查表转发。 |
H. Encaps. L2. Red | 为接收到的二层帧外封装IPv6报文头与Reduced SRH,并查表转发。 |
Endpoint节点行为
指令 | 功能描述 | 应用场景 |
---|---|---|
End | 把下一个SID复制到IPv6目的地址,进行查表转发 | 指定节点转发,相当于SR-MPLS的Node Segment |
End. X | 根据指定出接口转发报文 | 指定出接口转发,相当于SR-MPLS的Adjacency Segment |
End. T | 在指定的IPv6路由表中进行查表并转发报文 | 用于多路由表转发场景 |
End. DX2 | 解封装报文,从指定的二层出接口转发 | L2VPN,例如EVPN VPWS(Virtual Private Wire Service) |
End. DX4 | 解封装报文,从指定的IPv4三层邻接转发 | L3VPNv4,通过指定的IPv4邻接转发到CE |
End. DX6 | 解封装报文,从指定的IPv6三层邻接转发 | L3VPNv6,通过指定的IPv6邻接转发到CE |
End. DT6 | 解封装报文,在指定的IPv6路由表中进行查表转发 | L3VPNv6 |
End. DT4 | 解封装报文,在指定的IPv4路由表中进行查表转发 | L3VPNv4 |
End. B6. Insert | 插入SRH,应用指定的SRv6 Policy | Insert模式下引流如SRv6 Policy,隧道拼接、SD-WAN选路等 |
End. BM | 插入MPLS标签栈,应用指定的SR-MPLS Policy | SRv6与SR-MPLS互通场景 |
Flavors附加行为
Flavors是为了增强End系列指令而定义的附加行为。这些附加行为是可选项,它们将会增强End系列指令的执行动作,满足更丰富的业务需求。
SRv6-Network-Programming中定义了以下附加行为,PSP(Penultimate Segment Pop of the SRH,倒数第二段弹出SRH)、USP(Ultimate Segment Pop of the SRH,倒数第一段弹出SRH)和USD(Ultimate Segment Decapsulation,倒数第一段解封装)。
附加行为 | 功能描述 | 附着的End指令 |
---|---|---|
PSP | 在倒数第二个Endpoint节点执行移除SRH操作。 | End、End.X、End.T |
USP | 在最后一个Endpoint节点执行移除SRH操作。 | End、End.X、End.T |
USD | 在最后一个Endpoint节点执行解封装外层IPv6报文头操作。 | End、End.X、End.T |
2.4 SRv6 Policy
集中式SR-TE功能架构
SR-TE采用集中式架构,控制器收集全局网络拓扑信息和TE信息,集中算路,然后把算路结果下发给网络设备
首先SR也通过IGP来扩散SR信息,然后由头节点建立满足约束的SR路径,但是不需要RSVP-TE信令建立LSP
控制器
- 通过BGP-LS收集网络信息,建立全局TE数据库
- 基于约束全局算路
- 使用PCEP或BGP SRv6 Policy将算路结果下发设备
网络设备上没有算路功能组件
SRv6 TE Policy简介
SR-TE Policy是SR Policy在流量工程领域的使用。它使用SR的源路由机制,通过在头节点封装一个有序的指令列表来知道报文穿越网络。SR-TE Policy没有传统隧道接口的概念。
SR-TE Policy根据Segment不同分为SR-MPLS TE Policy和SRv6 TE Policy,这里以后者为例
SR Policy是当前主流厂家的实现SR-TE的方式,后续将用SRv6 policy代指SRv6 TE Policy