说明:该文档主要翻译自正IETF在制定的SRv6 Network Programming,以用自学
摘要
SRv6网络编程框架允许网络运营商或应用程序通过对IPv6数据包头中的指令序列进行编码来指定数据包处理程序。
每个指令在网络中的一个或多个节点上实现,并由包中的SRv6段标识符标识。
本文档定义了SRv6网络编程概念,并指定了SRv6行为的基本集,这些行为允许创建具有底层优化(服务级别协议)的可互操作覆盖。
1. 介绍
段路由RFC8402利用源路由范型。入口节点引导数据包通过被称为段的指令的有序列表。这些指令中的每一条都表示要在网络中的特定位置调用的函数。函数是在执行它的节点上本地定义的,可以从简单地在段列表中向前移动到任何复杂的用户定义行为。网络编程结合了简单和复杂的分段路由功能,以实现不仅仅是分组路由的网络目标。
本文档定义了SRv6网络编程概念,并指定了主要的网段路由行为,以便通过底层优化(服务级别协议)创建可互操作的覆盖层。
配套文件[I-D.filsfils-spring-srv6-net-pgm-illustration]说明了本文件中定义的概念。
读者需要先熟悉段路由头RFC8754。
2. 术语
本文档中使用的下列术语在RFC8402中定义:段路由、SR域、段ID(SID)、SRv6、SRv6 SID、活动段、SR策略、前缀SID和邻接SID。
本文件中使用的下列术语在RFC8754中定义:SRH、SR源节点、传输节点、SR段端点节点和简化SRH。
NH:IPv6头的下一个头字段RFC8200。NH=SRH意味着IPv6头的下一个头是IPv6的路由头(43),Type字段设置为4。
SL:SRH的Segments Left字段
FIB:转发信息库。FIB查找是转发表中的查找。
SA:源地址
DA:目的地地址
SRv6 SID函数:SID的函数部分是绑定到SID的本地行为的不透明标识。本文件第3.1节对其进行了正式定义。
SRv6段终结点行为:在SRv6段终结点上执行的数据包处理行为。本文档的第4节定义了与流量工程和覆盖用例相关的SRv6段端点行为。其他行为(如服务编程)不在本文档的范围内。
SR策略解析为SID列表。SID列表表示为<S1,S2,S3>,其中S1是要访问的第一个SID,S2是要访问的第二个SID,S3是沿SR路径要访问的最后一个SID。
(SA,DA)(S3,S2,S1;SL)表示IPv6数据包,其中:
- 源地址是SA,目标地址是DA,下一个头是SRH
- SID列表为<S1,S2,S3>且Segment List = SL
- 注意<>和()符号之间的区别:<S1,S2,S3>表示一个SID列表,其中S1是第一个SID,S3是要遍历的最后一个SID。(S3,S2,S1;SL)表示相同的SID列表,但以SRH格式编码,其中SRH中最右边的SID是第一个SID,SRH中最左边的SID是最后一个SID。在高级用例中引用SR策略时,使用<S1,S2,S3>符号更简单。当参考详细分组行为的说明时,(S3,S2,S1;SL)表示法更方便。
- 省略包的有效负载。
SRH[n]:段列表[n]的较短表示,定义见RFC8754。
2.1. 措辞界定
本文件中的关键词“必须”、“不得”、“必需”、“应当”、“不得”、“应当”、“不应当”、“推荐”、“不推荐”、“可以”和“可选”应按照BCP 14RFC2119RFC8174中的说明,当且仅当它们以所有大写字母出现。
3. SRv6 SID
RFC8402将SRv6段标识符定义为与该段显式关联的IPv6地址。
当SRv6 SID位于包的IPv6头的Destination Address字段中时,它将作为IPv6地址通过IPv6网络路由。
其处理过程在RFC8754第4.3节中定义,并在此复制作为提醒。
在不限制实现细节的情况下,SR segment endpoint节点为其本地SID创建转发信息库(FIB)条目。
当支持SRv6的节点接收到IPv6数据包时,它对数据包目标地址执行最长的前缀匹配查找。
此查找可以返回以下任何内容:
- 表示本地实例化的SRv6 SID的FIB项
- 表示本地接口的FIB项,而不是本地实例化为SRv6 SID
- 表示非本地路由的FIB条目
- 不匹配
本文档正式定义了SRv6 SID的行为和参数。
3.1. SID格式
本文档将SRv6 SID定义为由LOC:FUNCT:ARG组成,其中locator(LOC)编码在SID的L个最重要的位中,后跟F个函数位(FUNCT)和A个参数位(ARG)。L作为locator长度是灵活的,并且操作者可以自由地使用他们选择的定位器长度。F和A可以是任何值,只要L+F+A<=128即可。当L+F+A<128时,SID的reminder必须为零。
Locator可以表示为B:N,其中B是SRv6 SID块(操作员为SRv6 SID分配的IPv6子网),N是实例化该SID的父节点的标识符。
当SRv6 SID的LOC部分可路由时,它将指向实例化的SID节点。
FUNCT是绑定到SID本地行为的不透明标识。
术语“function”指的是SRv6 SID中的bit-string。术语“behavior”标识绑定到SID的behavior。这些行为在本文档的第4节中定义。
SRv6端点行为可能需要额外的信息来进行处理(例如,与流或服务相关)。此信息可以编码在SID的ARG位中。
在这种情况下,ARG位的语义和格式被定义为SRv6端点行为规范的一部分。
正在路由的SID中的ARG值应在给定流中的数据包之间保持不变。在流中的数据包之间改变ARG值可能导致不同的ECMP散列并导致重新排序。
3.2. SID可达性
通常,节点N会公布IPv6前缀,这些前缀与覆盖其SID或更短掩码前缀的LOC部分匹配。这些公告的分布及其可达性的计算是本文档范围之外的特定路由协议。
如果SRv6 SID属于通过某个路由协议公告的IPv6前缀,则称其为可路由的(routed)。否在SRv6 SID是非路由(non-routed)的。
看一个经典的例子:
节点N显式地(explicitly)配置了两个SID:2001:DB8:B:1:100::
和2001:DB8:B:2:101::
。
网络通过IGP了解到2001:DB8:B:1:/64
的路径,因此到2001:DB8:B:1:100::
的数据包将被路由到N。网络不会通过IGP了解到2001:DB8:B:2:/64
的路径,因此到2001:DB8:B:2:101::
的数据包将不会被路由到N。
通过使用SID列表<…, 2001:DB8:B:1:100::, 2001:DB8:B:2:101::, …>
将数据包导向非路由SID 2001:DB8:B:2:101::
其中,非路由SID前面是指向同一节点的路由SID。路由和非路由SRv6 SID分别是全局段和本地段的SRv6实例化RFC8402。
4. SR端点行为
每个FIB条目指示与SID实例及其参数相关联的行为。
下面是一组可以与SID关联的已知行为。
End | Endpoint功能prefix SID的SRv6实例化RFC8402 |
---|---|
End.X | 具有第3层交叉连接的EndpointAdj SID的SRv6实例RFC8402 |
End.T | 具有特定IPv6表查找的Endpoint |
End.DX6 | 具有解封装(decapsulation)和IPv6交叉连接的Endpoint例如IPv6-L3VPN(相当于每个CE VPN标签) |
End.DX4 | 具有解封装和IPv4交叉连接的端点例如IPv4-L3VPN(相当于每个CE VPN标签) |
End.DT6 | 具有解封装和IPv6表查找的Endpoint例如IPv6-L3VPN(相当于每个VRF VPN标签) |
End.DT4 | 具有解封装和IPv4表查找的Endpoint例如IPv4-L3VPN(相当于每个VRF VPN标签) |
End.DT46 | 带有解封装和IP表查找的Endpoint例如IP-L3VPN(相当于每个VRF VPN标签) |
End.DX2 | 具有解封装和L2交叉连接的Endpoint例如L2VPN用例 |
End.DX2V | 具有封头和VLAN L2表查找的Endpoint例如EVPN灵活的交叉连接用例 |
End.DT2U | 具有摘机和单播MAC L2table查找的Endpoint例如EVPN桥接单播用例 |
End.DT2M | 具有解封装和L2表泛洪的Endpoint例如具有ESI过滤功能的EVPN桥接BUM用例 |
End.B6.Encaps | 通过封装绑定到SRv6策略的Endpoint绑定SID的SRv6实例化 |
End.B6.Encaps.RED | 降低了SRH的End.B6.Encaps绑定SID的SRv6实例化 |
End.BM | 绑定到SR-MPLS策略的EndpointSR-MPLS绑定SID的SRv6实例化 |
这份列表并不详尽。实际上,任何函数都可以绑定到local SID:例如,节点N可以将SID定位到本地VM或容器,以对数据包做任何复杂的处理。
以下小节详细介绍了本文档中介绍的节点(N)绑定到SID(S)的行为。
第4.16节定义了其中一些行为的风格(flavors)。
4.1. End:Endpoint
端点行为(简称“End”)是最基本的行为。它是Prefix-SID RFC8402的实例化。
当N接收到IPv6 DA为S并且S为本地End SID的数据包时,N执行以下操作:
S01. When an SRH is processed {
S02. If (Segments Left == 0) {
S03. Send an ICMP Parameter Problem message to the Source Address
Code 4 (SR Upper-layer Header Error),
Pointer set to the offset of the upper-layer header.
Interrupt packet processing and discard the packet.
S04. }
S05. If (IPv6 Hop Limit <= 1) {
S06. Send an ICMP Time Exceeded message to the Source Address,
Code 0 (Hop limit exceeded in transit),
Interrupt packet processing and discard the packet.
S07. }
S08. max_LE = (Hdr Ext Len / 2) - 1
S09. If ((Last Entry > max_LE) or (Segments Left > Last Entry+1)) {
S10. Send an ICMP Parameter Problem to the Source Address,
Code 0 (Erroneous header field encountered),
Pointer set to the Segments Left field.
Interrupt packet processing and discard the packet.
S11. }
S12. Decrement Hop Limit by 1
S13. Decrement Segments Left by 1
S14. Update IPv6 DA with Segment List[Segments Left]
S15. Submit the packet to the egress IPv6 FIB lookup and transmission to the new destination
S16. }
注:
End行为在与数据包关联的同一FIB表(即VRF、L3 relay id)上操作。因此第S15行上的FIB查找就是在与ingress接口相同的FIB表中完成的。
4.1.1. Upper-Layer Header
在处理与本地实例化为SRv6 End SID的FIB条目匹配的数据包的上层报头(Upper-layer Header)时,如果本地配置允许上层报头处理(例如ICMPv6),则处理上层报头。否则,将ICMP参数问题消息发送到源地址并丢弃该数据包。错误代码为4(SR上层报头错误)指针值设置为上层报头的偏移量。
4.2. End.X:L3交叉连接(Cross-Connect)
“交叉连接到L3邻接阵列的Endpoint(Endpoint with cross-connect to an array of layer-3 adjacencies)”行为(简称End.X)是End行为的变体。
它是邻接SIDRFC8402的SRv6实例化,需要表示各种流量工程策略。
End.X行为的一个实例与一个或多个L3邻接的集合J相关联。
当N接收到发往S的分组并且S是本地End.X SID时,来自结束处理的S15行被替换为以下内容:
S15. 将数据包提交到IPv6模块,以便通过J的成员传输到新的目标
注:
S15. 如果集合J包含若干L3邻接,则对数据包头进行6.2中的哈希处理以散列选择出数组的一项。
如果一个节点N有30个端口分别可以去到30个邻接节点,通常操作者会显式地在N处实例化30个End.X SID,每个邻接到一个L3邻居。当然也可能会明确(explicitly)定义更多的End.X(同一个邻居或不同邻居的L3邻接组)。
注意,如果N有一个邻居Q,到Q有10个成员链接可以传出接口包I,则N可以分配至多11个End.X给本地SID:一个用于捆绑(LAG)本身,剩下的用于每个L2成员链接。
当End.X行为与BGP下一跳关联时,它是BGP对等段(BGP Peering Segments)RFC8402的SRv6实例化。
4.3. End.T:特定IPv6表查找
“具有特定IPv6表查找的Endpoint(Endpoint with specific IPv6 table lookup)”行为(简称End.T)是End行为的变体。
End.T行为用于核心中的多表操作。因此,End.T行为的实例与IPv6 FIB表T关联。
当N接收到发往S的分组并且S是本地End.T SID时,End处理流程的S15行被替换为以下内容:
S15.1. 将数据包的关联FIB表设置为T
S15.2. 将数据包提交到出口IPv6 FIB查找并传输到新目标
4.4. End.DX6:解封装和IPv6交叉连接
“具有解封装功能并交叉连接到邻接IPv6的Endpoint(Endpoint with decapsulation and cross-connect to an array of IPv6 adjacencies)”行为(简称End.DX6)是End.X行为的变体。
End.DX6行为的一个用例是L3VPNv6,其中不需要在出口PE处的特定租户(tenant)表中进行FIB查找。这相当于MPLS中的每个CE VPN标签(per-CE VPN label)RFC4364。
End.DX6 SID必须是SR策略中的最后一个段,并且它与一个或多个L3 IPv6邻接J相关联。
当N接收到一个发往S的数据包,而S是一个本地End.DX6 SID时,N执行以下处理:
S01. 当处理SRH时 {
S02. If (Segments Left != 0) {
S03. 将ICMP参数问题发送到源地址,
代码0(遇到错误的标头字段),
指针设置为Segments Left字段。
中断数据包处理并丢弃数据包。
S04. }
S05. 继续处理数据包中的下一个标头
S06. }
在处理与本地实例化为SRv6 End.DX6 SID的FIB项匹配的数据包的上层报头时,执行以下操作:
S01. If (Upper-Layer Header type != 41) {
S02. 按照[<u>4.1.1</u>](#_Upper-Layer Header)节的流程处理
S03. }
S04. 删除带有所有扩展头的外部IPv6头
S05. 将暴露的IPv6数据包转发到L3邻接J
注:
S01. 41是指互联网协议号的IANA分配所定义的IPv6封装。
S05. 如果End.DX6 SID绑定到一个L3邻接数组,则对数据包头进行6.2的哈希处理以选择出数组的一项。
4.5. End.DX4:具有解封装和与IPv4交叉连接功能
“具有解封装功能并交叉连接到IPv4邻接的Endpoint(Endpoint with decapsulation and cross-connect to an array of IPv4 adjacencies)”行为(简称End.DX4)是End.X的变体。
End.DX4行为的一个应用程序是L3VPNv4用例,其中不需要在出口PE处的特定租户表中进行FIB查找。这相当于MPLS中的每个CE VPN标签(per-CE VPN label)RFC4364。
End.DX4 SID必须是SR策略中的最后一个段,并且它与一个或多个L3 IPv4邻接J相关联。
当N接收到一个发往S的数据包,而S是一个本地End.DX4 SID时,N执行以下处理:
S01. When an SRH is processed {
S02. If (Segments Left != 0) {
S03. Send an ICMP Parameter Problem to the Source Address,
Code 0 (Erroneous header field encountered),
Pointer set to the Segments Left field.
Interrupt packet processing and discard the packet.
S04. }
S05. 继续处理数据包中的下一个标头
S06. }
处理与本地实例化为SRv6 End.DX4 SID的FIB条目匹配的数据包的上层标头时,将执行以下操作:
S01. If (Upper-Layer Header type != 4) {
S02. Process as per Section 4.1.1
S03. }
S04. Remove the outer IPv6 Header with all its extension headers
S05. Forward the exposed IPv4 packet to the L3 adjacency J
注:
S01. 4是指互联网协议号的IANA分配定义的IPv4封装
S05. 如果End.DX4 SID绑定到一个L3邻接数组,则根据数据包头部分6.2的哈希选择数组的一个条目。
4.6. End.DT6:具有解封装和特定IPv6表查找功能
“带解封装和特定IPv6表查找的Endpoint(Endpoint with decapsulation and specific IPv6 table lookup)”行为(简称End.DT6)是End.T行为的变体。
End.DT6行为的一个用例是L3VPNv6,其中需要在出口PE处的特定租户表中进行FIB查找。这相当于MPLS中的每个VRF VPN标签(per-VRF VPN label)RFC4364。
注意,可以为主IPv6表定义End.DT6,在这种情况下,End.DT6支持等效于IPv6inIPv6解封装(不包含VPN/租户含义)。
End.DT6 SID必须是SR策略中的最后一个段,并且SID实例与IPv6 FIB表T关联。
当N接收到一个发往S的数据包,而S是一个local End.DT6 SID时,N执行以下处理:
S01. When an SRH is processed {
S02. If (Segments Left != 0) {
S03. Send an ICMP Parameter Problem to the Source Address,
Code 0 (Erroneous header field encountered),
Pointer set to the Segments Left field.
Interrupt packet processing and discard the packet.
S04. }
S05. Proceed to process the next header in the packet
S06. }
当处理与本地实例化为SRv6 End.DT6 SID的FIB条目匹配的数据包的上层标头时,N执行以下操作:
S01. If (Upper-Layer Header type != 41) {
S02. Process as per Section 4.1.1
S03. }
S04. 删除带有所有扩展头的外部IPv6头
S05. 将数据包的关联FIB表设置为T
S06. 将数据包提交到出口IPv6 FIB查找并传输到新目的地
4.7. End.DT4:具有解封装和特定的IPv4表查找功能
“带解封装和特定IPv4表查找的端点”行为(简称End.DT4)是端点行为的变体。
End.DT4行为的一个应用程序是L3VPNv4用例,其中需要在出口PE处的特定租户表中进行FIB查找。这相当于MPLS中的每个VRF VPN标签RFC4364。
注意,可以为主IPv4表定义End.DT4,在这种情况下,End.DT4支持相当于IPv4inIPv6解封装(不包含VPN/租户含义)。
End.DT4 SID必须是SR策略中的最后一个段,并且SID实例与IPv4 FIB表T关联。
当N接收到一个发往S的数据包,而S是一个本地End.DT4 SID时,N执行以下处理:
S01. When an SRH is processed {
S02. If (Segments Left != 0) {
S03. Send an ICMP Parameter Problem to the Source Address,
Code 0 (Erroneous header field encountered),
Pointer set to the Segments Left field.
Interrupt packet processing and discard the packet.
S04. }
S05. Proceed to process the next header in the packet
S06. }
当处理与本地实例化为SRv6 End.DT4 SID的FIB条目匹配的数据包的上层标头时,N执行以下操作:
S01. If (Upper-Layer Header type != 4) {
S02. Process as per Section 4.1.1
S03. }
S04. Remove the outer IPv6 Header with all its extension headers
S05. Set the packet's associated FIB table to T
S06. 将数据包提交到出口IPv4 FIB查找并传输到新目的地址
4.8. End.DT46:具有解封装和特定IP表查找功能
“带解封装和特定IP表查找的Endpoint”行为(简称End.DT46)是End.DT4和End.DT6行为的变体。
End.DT46行为的一个应用程序是L3VPN用例,其中需要在出口PE处的特定IP租户表中进行FIB查找。这相当于MPLSRFC4364中的每个VRF VPN标签(用于IPv4和IPv6)。
注意,可以为主IP表定义End.DT46,在这种情况下,End.DT46支持相当于IPinIPv6解封装(不包含VPN/租户含义)。
End.DT46 SID必须是SR策略中的最后一个段,并且SID实例与IPv4 FIB表T4和IPv6 FIB表T6相关联。
当N接收到发往S的数据包,而S是本地端End.DT46 SID,N执行以下处理:
S01. When an SRH is processed {
S02. If (Segments Left != 0) {
S03. Send an ICMP Parameter Problem to the Source Address,
Code 0 (Erroneous header field encountered),
Pointer set to the Segments Left field.
Interrupt packet processing and discard the packet.
S04. }
S05. Proceed to process the next header in the packet
S06. }
当处理与本地实例化为SRv6 End.DT46 SID的FIB条目匹配的数据包的上层标头时,N执行以下操作:
S01. If (Upper-layer Header type == 4) {
S02. 删除带有所有扩展头的外部IPv6头
S03. 将数据包的关联FIB表设置为T4
S04. 将数据包提交到出口IPv4 FIB查找并传输到新目的地
S05. } Else if (Upper-layer Header type == 41) {
S06. 删除带有所有扩展头的外部IPv6头
S07. 将数据包的关联FIB表设置为T6
S08. 将数据包提交到出口IPv6 FIB查找并传输到新目的地
S09. } Else {
S10. Process as per Section 4.1.1
S11. }
4.9. End.DX2:具有解封装和与L2交叉连接功能
“具有解封装和第2层交叉连接到传出L2接口(OIF)的端点”(简称End.DX2)是端点行为的变体。
End.DX2行为的一个用例是L2VPN/EVPNRFC7432 VPWS。
End.DX2 SID必须是SR策略中的最后一个段,并且它与一个传出接口I相关联。
当N接收到一个发往S的数据包,而S是一个本地端.DX2 SID时,N执行以下操作:
S01. When an SRH is processed {
S02. If (Segments Left != 0) {
S03. Send an ICMP Parameter Problem to the Source Address,
Code 0 (Erroneous header field encountered),
Pointer set to the Segments Left field.
Interrupt packet processing and discard the packet.
S04. }
S05. Proceed to process the next header in the packet
S06. }
处理与本地实例化为SRv6 End.DX2 SID的FIB条目匹配的数据包的上层标头时,将执行以下操作:
S01. If (Upper-Layer Header type != 143) {
S02. Process as per Section 4.1.1
S03. }
S04. 删除外部IPv6标头及其所有扩展标头,然后将以太网帧转发到OIF I.
注:
S04. 可以自定义End.DX2期望的特定IEEE头(例如VLAN标记),并在传出接口上转发之前重写egress IEEE头。
4.10. End.DX2V:具有解封装和VLAN L2表查找功能
“带解封装和特定VLAN表查找的端点”行为(简称End.DX2V)是End.DX2行为的变体。
End.DX2V行为的一个应用是EVPN灵活的交叉连接用例。End.DX2V行为用于查找特定二级表中的以太网帧VLAN。End.DX2V行为的任何SID实例都与二级表T关联。
当N接收到IPv6 DA为S且S为local End.DX2 SID的数据包时,处理与End.DX2行为相同,但上层报头处理被修改如下:
S04. 删除外部IPv6头及其所有扩展头,
在L2表T中查找暴露的vlan,
并通过匹配的表条目转发。
注:
可以自定义End.DX2V期望的特定VLAN格式,并在传出接口上转发之前重写出口VLAN头。
4.11. End.DT2U:解封装和单播MAC L2表查找功能
“具有解封装和特定单播MAC L2表查找的端点”行为(简称End.DT2U)是端点行为的变体。
End.DT2U行为的应用之一是EVPN桥接单播。End.DT2U行为的任何SID实例都与二级表T关联。
当N收到IPv6 DA为S且S为本地End.DT2U SID的数据包时,该处理与End.DX2行为相同,除了上层报头处理如下:
S01. If (Upper-Layer Header type != 143) {
S02. Process as per Section 4.1.1
S03. }
S04. Remove the IPv6 header and all its extension headers
S05. 在L2表T中了解exposed MAC源地址
S06. 在L2表T中查找exposed MAC目标地址
S07. If (matched entry in T) {
S08. Forward via the matched table T entry
S09. } Else {
S10. Forward via all L2 OIFs entries in table T
S11. }
注:
S05. 在EVPN中,对裸露的(exposed)内部MAC SA的学习是通过控制平面完成的。
4.12. End.DT2M:解封装和L2表泛洪
“具有解封装和特定L2表泛洪的端点”行为(简称End.DT2M)是End.DT2U行为的变体。
End.DT2M行为的两个用例是带有ESI过滤的EVPN桥接BUM和EVPN ETREE。
此行为的任何SID实例都与L2表T关联。
此外,该行为可能需要一个参数:“Arg.FE2”。它是特定于EVPN ESI筛选和EVPN-ETREE的参数,用于从L2表T泛洪中排除特定的OIF(或一组OIF)。
当N接收到IPv6 DA为S且S为本地End.DT2M SID的数据包时,处理与End.DT2M行为相同,但上层报头处理如下:
S01. If (Upper-Layer Header type != 143) {
S02. Process as per Section 4.1.1
S03. }
S04. 删除IPv6标头及其所有扩展标头
S05. 在L2表T中了解暴露的内部MAC源地址
S06. 通过除Arg.FE2中指定的一个之外的所有所有L2 OIF转发
注:
S05. 在EVPN中,暴露的内部MAC SA的学习是通过控制平面完成的
Arg.FE2在SID中编码为(k*x)位值。这些位表示最多k个OIF的列表,每个OIF都用x位值标识。值k和x是在每端.DT2M SID的基础上定义的。接口标识符0表示接口列表中的一个空条目。
4.13. End.B6.Encaps:绑定到带有Encaps的SRv6策略的端点
这是End的变体。
其应用之一是跨多个域表达可伸缩的流量工程策略。它是绑定SID的SRv6实例之一RFC8402。
End.B6.Encaps SID永远不是SID列表中的最后一个段。任何SID实例化都与SR策略B和源地址A相关联。
当N接收到IPv6 DA为S且S为本地端的数据包时。B6.Encaps SID会:
S01. When an SRH is processed {
S02. If (Segments Left == 0) {
S03. Send an ICMP Parameter Problem message to the Source Address
Code 4 (SR Upper-layer Header Error),
指针设置为上层标头的偏移量。
中断数据包处理并丢弃数据包。
S04. }
S05. If (IPv6 Hop Limit <= 1) {
S06. Send an ICMP Time Exceeded message to the Source Address,
Code 0 (Hop limit exceeded in transit),
Interrupt packet processing and discard the packet.
S07. }
S08. max_LE = (Hdr Ext Len / 2) - 1
S09. If ((Last Entry > max_LE) or (Segments Left > (Last Entry+1)) {
S10. Send an ICMP Parameter Problem to the Source Address,
Code 0 (Erroneous header field encountered),
指针设置为Segment Left字段。
Interrupt packet processing and discard the packet.
S11. }
S12. 减少跃点限制1。
S13. 减少Segments Left by 1
S14. Push a new IPv6 header with its own SRH containing B
S15. Set the outer IPv6 SA to A
S16. Set the outer IPv6 DA to the first SID of B
S17. 设置外部Payload Length,Traffic Class,Flow Label和Next-Header字段
S18. 将数据包提交到出口IPv6 FIB查找并传输到新目的地
S19. }
注:
S14. 当SRv6策略B仅包含一个SID并且不需要使用任何标志、标记或TLV时,可以省略SRH。
S17. 根据RFC2473设置有效负载长度、流量类和下一个头字段。流量标签按RFC6437计算。
当处理与本地实例化为SRv6 End.B6.Encaps SID的FIB条目匹配的数据包的上层报头时,按照第4.1.1节处理该数据包。
4.14. End.B6.Encaps.Red:降低SRH的End.B6.Encaps
这是对End.B6.Encaps行为的优化。
Red通过排除新IPv6头的SRH中的第一个SID,将SRH的大小减少一个SID。因此,第一段只放在新IPv6报头的IPv6目标地址中,并且根据它转发数据包。
SRH Last Entry字段的设置如第4.1.1节所定义RFC8754。
当SRv6策略仅包含一个段并且不需要使用任何标志、标记或TLV时,可以省略SRH。
4.15. End.BM:绑定到SR-MPLS策略的终结点
“绑定到SR-MPLS策略的端点”是End行为的变体。
需要End.BM行为来表示跨多个域的可伸缩流量工程策略,其中一些域支持段路由的MPLS实例化。这是SR-MPLS绑定SID的SRv6实例化。
End.BM SID永远不是最后一个SID,任何SID实例化都与SR-MPLS策略B相关联。
当N接收到IPv6 DA为S且S为本地端的数据包时,BM SID会:
S01. When an SRH is processed {
S02. If (Segments Left == 0) {
S03. Send an ICMP Parameter Problem message to the Source Address
Code 4 (SR Upper-layer Header Error),
Pointer set to the offset of the upper-layer header.
Interrupt packet processing and discard the packet.
S04. }
S05. If (IPv6 Hop Limit <= 1) {
S06. 将“ ICMP超时”消息发送到源地址,
代码为0(在传输中超过了跃点限制),
处理中断数据包并丢弃该数据包。
S07. }
S08. max_LE = (Hdr Ext Len / 2) - 1
S09. If ((Last Entry > max_LE) or (Segments Left > (Last Entry+1)) {
S10. 将ICMP参数问题发送到源地址,
代码0(遇到错误的标头字段),
指针设置为Segment Left字段。
中断数据包处理并丢弃数据包。
S11. }
S12. 减少Hop限制1
S13. 减少Segments Left by 1
S14. 向B推送MPLS标签栈
S15. 将数据包提交给MPLS引擎以传输到最上面的标签。
S16. }
在处理与本地实例化为SRv6 End.BM SID的FIB条目匹配的数据包的上层报头时,请按照第4.1.1节处理该数据包。
4.16. Flavors
PSP、USP和USD是End、End.X和End.T行为的变体。对于这些行为中的每一种,SID可以单独或组合地支持这些风格。
4.16.1. PSP:Penultimate Segment Pop of the SRH(倒数第二段弹出)
SR段端点节点通过第8节中描述的控制平面协议公布在其上实例化的SID。不同的行为id被分配给调味和非调味SIDs表4。
同时提供PSP和非PSP风格行为的SR段端点节点将它们作为两个不同的SID进行广告宣传。SR Segment Endpoint节点仅在操作员在节点上启用此功能时播发PSP风格。
PSP操作由SR源节点确定地控制。当源SR节点需要指示SRH中列出的倒数第二SR段终结点节点从IPv6头中删除SRH时,它使用PSP风格的SID。
例如,PSP允许出口PE接收具有外部报头的DA中的段的分组,而无需处理SRH。例如,当SRH包含太多的SID时,与在
IGP第8.1节。在这种情况下,计算这些节点的SRv6策略需要考虑这些节点上游PSP功能的可用性。
SR段终结点节点接收IPv6数据包,IPv6头的目标地址字段等于其SID地址。倒数第二个SR段终结点节点是一个节点,作为SID处理的一部分,它将最后一个SID从SRH复制到IPv6目标地址,并将剩余的段值从1减为0。
PSP操作只发生在倒数第二SR段端点节点,不发生在任何传输节点。
在指令“S14”之后,修改了End、End.X和End.T行为的SRH处理。执行Update IPv6 DA with Segment List[Segments Left]”时,还必须执行以下指令:
S14.1. If (Segments Left == 0) {
S14.2. Update the Next Header field in the preceding header to the
Next Header value of the SRH
S14.3. Decrease the IPv6 header Payload Length by the Hdr Ext Len
value of the SRH
S14.4. Remove the SRH from the IPv6 extension header chain
S14.5. }
PSP的使用不会增加IPv6包的MTU,因此对PMTU发现机制没有任何影响。
作为提醒,RFC8754在第5节中定义了SR域内的SR部署模型RFC8402。在此框架中,身份验证头(AH)不用于保护SRH,如RFC8754第7.5节所述。
此行为不违反RFC8200的第4节,因为传入数据包的当前目标地址是执行PSP行为的节点的地址。
4.16.2. USP:Ultimate Segment Pop of the SRH
对End、End.X和End.T行为的SRH处理进行了修改:指令S02-S04替换为以下指令:
S02. If (Segments Left == 0) {
S03.1. 将前面的标头中的Next Header字段更新为SRH的Next Header值
S03.2. 通过SRH的Hdr Ext Len值减少IPv6标头有效负载长度
S03.3. 从IPv6扩展头链中删除SRH
S03.4. 继续处理数据包中的下一个标头
S04. }
4.16.3. USD:Ultimate Segment Decapsulation
对End、End.X和End.T行为的SRH处理进行了修改:指令S02-S04替换为以下指令:
S02. If (Segments Left == 0) {
S03. Skip the SRH processing and proceed to the next header
S04. }
进一步,对End,End.X和End.T行为的上层标头处理进行了如下修改:
End:
S01. If (Upper-layer Header type == 41 || 4) {
S02. Remove the outer IPv6 Header with all its extension headers
S03. 将数据包提交到出口IP FIB查找并传输到新目的地址
S04. } Else {
S05. Process as per Section 4.1.1
S06. }
End.T:
S01. If (Upper-layer Header type == 41 || 4) {
S02. Remove the outer IPv6 Header with all its extension headers
S03. Set the packet's associated FIB table to T
S04. 将数据包提交到出口IP FIB查找并传输到新目的地址
S05. } Else {
S06. Process as per Section 4.1.1
S07. }
End.X:
S01. If (Upper-layer Header type == 41 || 4) {
S02. Remove the outer IPv6 Header with all its extension headers
S03. Forward the exposed IP packet to the L3 adjacency J
S04. } Else {
S05. Process as per Section 4.1.1
S06. }
与USP flavor一起支持USD flavor的实现可以通过首先查看是否满足USD flavor的条件来优化包处理,在这种情况下,它可以继续进行USD处理或者执行USP处理。
5. SR策略前端行为
本节描述一组SR策略头端行为。
H.Encaps | SR策略中带有封装的SR头端行为 |
---|---|
H.Encaps.Red | 减少封装的H.Encaps |
H.Encaps.L2 | 适用于接收的L2帧H.Encaps |
H.Encaps.L2.Red | 适用于接收的L2帧H.Encaps.Red |
如果有任何新功能需要,可以扩展此列表。
5.1. H.Encaps:SRv6策略中包含封装的SR头端
节点N接收两个分组P1=(A,B2)和P2=(A,B2)(B3,B2,B1;SL=1)。B2既不是本地地址,也不是N的SID。
N将传输分组P1和P2引导到具有源地址T和段列表<S1、S2、S3>的SR策略中。
H.Encaps封装行为定义如下:
S01. 推送具有自己的SRH的IPv6标头(S3,S2,S1; SL = 2)
S02. 设置外部IPv6 SA = T和外部IPv6 DA = S1
S03. 设置外部payload length,traffic class和flow 标签
S04. 设置外部的Next-Header值
S05. 减少内部跳数限制或TTL
S06. 将数据包提交到IPv6模块以传输到S1
在H.Encaps行为之后,P1'和P2'分别如下所示:
(T, S1) (S3, S2, S1; SL=2) (A, B2)
(T, S1) (S3, S2, S1; SL=2) (A, B2) (B3, B2, B1; SL=1)
接收到的包被未经修改地封装(除了如RFC2473中所述减小的TTL或Hop限制)。
H.Encaps行为对任何类型的第三层流量都有效。此行为通常用于具有IPv4和IPv6部署的L3VPN。
它也可用于局部修复点的TI-LFA[I-D.ietf-rtgwg-segment-routing-TI-LFA]。
当SRv6策略只包含一个段并且不需要使用任何标志、标记或TLV时,可以省略SRH的推送。
S03:如RFC6437所述(IPv6流标签规范)
5.2. H.Encaps.Red:减少封装的H.Encaps
H.Encaps.Red行为是H.Encaps行为的优化。
H.Encaps.Red通过排除推送IPv6头的SRH中的第一个SID来缩短SRH的长度。第一个SID只放在推送IPv6头的Destination Address字段中。
在H.Encaps.Red行为之后,P1'和P2'分别看起来像:
(T, S1) (S3, S2; SL=2) (A, B2)
(T, S1) (S3, S2; SL=2) (A, B2) (B3, B2, B1; SL=1)
当SRv6策略只包含一个段并且不需要使用任何标志、标记或TLV时,可以省略SRH的推送。
5.3. H.Encaps.L2:用于接收到的L2帧的H.Encaps
L2行为将接收到的以太网IEEE.802.3_2012帧及其附加的VLAN头(如果存在)封装在带有SRH的IPv6数据包中。以太网帧成为新IPv6数据包的负载。
SRH的下一个头字段必须设置为143。
当SRv6策略只包含一个段并且不需要使用任何标志、标记或TLV时,可以省略SRH的推送。
封装节点必须在封装后从以太网帧中移除前导码或帧检查序列(FCS),而解封装节点必须在转发以太网帧之前重新生成前导码或FCS。
5.4. H.Encaps.L2.Red:用于接收的L2帧的H.Encaps.Red
Red行为是H.Encaps.L2行为的优化。
H.Encaps.Red通过排除推送的IPv6头的SRH中的第一个SID来缩短SRH的长度。第一个SID仅位于推送的IPv6头的目标地址字段中。
当SRv6策略只包含一个段并且不需要使用任何标志、标记或TLV时,可以省略SRH的推送。
6. 操作
6.1. 计数器
支持此文档的节点应为每个本地SID条目实现一个组合的流量计数器(数据包和字节),用于与该SID匹配并已正确处理的流量。
6.2. 基于流的哈希计算
当需要在集合内执行基于流的选择时,源地址、目标地址和流标签必须包含在基于流的哈希中。
当执行FIB查找并且存在到更新的目标地址的多个ECMP路径时,会发生这种情况。
当End.X、End.DX4或End.DX6绑定到一个邻接数组时,会发生这种情况。
当在选定路径具有多个SID列表的SR策略中引导数据包时,会发生这种情况。
此外,SRv6域中的任何传输路由器都在其ECMP负载平衡HashRFC6437中包含外部流标签。
7. 安全考虑
段路由的安全考虑在RFC8402中讨论。更具体地说,对于SRv6,安全考虑和保护SR域的机制在RFC8754中进行了讨论。它们一起描述了所需的安全机制,这些机制允许建立一个SR信任域来为内部流量操作基于SRv6的服务,同时防止任何外部流量访问或利用基于SRv6的服务。
本文档介绍了在网络中支持SRv6的节点上实现的SRv6端点和SR策略头端行为。
因此,本文档不引入任何新的安全考虑。
8. 控制平面
在SDN环境中,需要控制器显式地提供SID和/或作为服务发现功能的一部分来发现它们。然后,驻留在控制器顶部的应用程序可以发现所需的SID,并将它们组合起来形成一个分布式网络程序。
“SRv6网络编程”的概念是指应用程序将任何复杂程序编码为通过网络分布的一组单独函数的能力。一些功能与底层SLA相关,其他功能与overlay/tenant相关,其他功能与VM和容器中的复杂应用程序相关。
本节从较高的层次概述了与SRv6相关的控制平面协议及其规范。
8.1. IGP
End、End.T和End.X SIDs表示拓扑行为,因此预计将在IGP中与PSP、USP和USD一起发出信号。IGP还应该为每种类型的SRv6操作公布节点的最大SRv6 SID深度(MSD)能力。
特别是,SR源(例如,H.Encaps)、中间端点(例如,End,End.X)和最终端点(例如,End.DX4,End.DT6)行为。在SR策略计算期间,SR源节点(或控制器)会考虑这些功能。
在IGP中存在SID并不意味着这些SID所代表的地址有任何路由语义。到IPv6地址的路由可达性仅由包含定位器的非SID相关IGP前缀可达性信息控制。路由不受IGP中SID播发的任何影响。
这些SID为IGP构建基于TI-LFA[I-D.ietf-rtgwg-segment-routing-TI-LFA]的FRR解决方案和依赖IGP拓扑数据库构建SR策略的TE进程提供了重要的拓扑行为。
8.2. BGP-LS
BGP-LS提供了拓扑发现功能,包括节点的SRv6功能、它们的定位器和本地实例化的SID[I-D.ietf-idr-bgpls-srv6-ext]。这使控制器或应用程序能够构建一个域间拓扑,该拓扑可用于使用SRv6 SID计算SR策略。
8.3. BGP IP/VPN/EVPN协议
End.DX4、End.DX6、End.DT4、End.DT6、End.DT46、End.DX2、End.DX2V、End.DT2U和End.DT2M侧线可在BGP[I-D.ietf-bess-srv6-services]中发出信号。
8.4. 摘要
下表总结了在每个相应的控制平面协议中可以用信号发送的SID的行为。
IGP | BGP-LS | BGP IP/VPN/EVPN | |
---|---|---|---|
End.XT (PSP, USP, USD) | X | X | |
End.XT (PSP, USP, USD) | X | X | |
End.TX (PSP, USP, USD) | X | X | |
End.DX6 | X | X | X |
End.DX4 | X | X | X |
End.DT6 | X | X | X |
End.DT4 | X | X | X |
End.DT46 | X | X | X |
End.DX2 | X | X | |
End.DX2V | X | X | |
End.DX2U | X | X | |
End.DX2M | X | X | |
End.B6.Encaps | X | ||
End.B6.Encaps.Red | X | ||
End.B6.BM | X |
表1:SRv6本地实例化的SID信令
下表总结了在哪种信令协议中信令哪些SR策略头端功能。
IGP | BGP-LS | BGP IP/VPN/EVPN | |
---|---|---|---|
H.Encaps | X | X | |
H.Encaps.Red | X | X | |
H.Encaps.L2 | X | ||
H.Encaps.L2.Red | X |
表2:SRv6策略头端行为信令
上表描述了通用功能。它没有描述特定的实例化SR策略。
例如,H.Encaps行为的BGP-LS广告将描述节点N执行H.Encaps行为的能力,具体地说,它将描述N可以推送多少个SID而不会显著降低性能。
作为提醒,SR策略总是被分配一个绑定SIDRFC8402。BSID也在BGP-LS中公布,如表1所示。
因此,表2只关注与H.Encaps相关的通用功能。
9. IANA考虑
9.1. 以太网下一个报头类型
本文件要求IANA在“协议号”注册表(https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)中分配,具有以下定义的“以太网”的新值:IPv6头或任何扩展头的下一个头字段中的值143表示负载是以太网IEEE.802.3_2012。
IANA对143号协议进行了临时分配。
9.2. SRv6端点行为注册表
本文档要求IANA创建一个名为“段路由参数”的新顶级注册表。该注册表被定义为一个顶级注册表,用于保存所有其他段路由子注册表。
此外,将在顶级“段路由参数”注册表下创建一个新的子注册表“SRv6端点行为”。此子注册表维护SRv6端点行为的16位标识符。建立此注册表是为了为需要引用这些行为的控制平面协议提供一致性。
这些值不在SID内的函数位中编码。
注册表的范围是0-65535(0x0000-0xFFFF),并具有以下注册规则和分配策略:
Range | Hex | Registration procedure | Notes |
---|---|---|---|
0 | 0x0000 | Reserved | Invalid |
1-32767 | 0x0001-0x7FFF | FCFS | |
32768-65534 | 0x8000-0xFFFE | Reserved. Not to be allocated. | |
65535 | 0xFFFF | Reserved | Opaque |
表3:SRv6端点行为注册表
9.2.1. 首次注册
子登记处的初始登记如下:
Value | Hex | Endpoint behavior | Reference |
---|---|---|---|
0 | 0x0000 | Invalid | [This.ID] |
1 | 0x0001 | End (no PSP, no USP) | [This.ID] |
2 | 0x0002 | End with PSP | [This.ID] |
3 | 0x0003 | End with USP | [This.ID] |
4 | 0x0004 | End with PSP&USP | [This.ID] |
5 | 0x0005 | End.X (no PSP, no USP) | [This.ID] |
6 | 0x0006 | End.X with PSP | [This.ID] |
7 | 0x0007 | End.X with USP | [This.ID] |
8 | 0x0008 | End.X with PSP&USP | [This.ID] |
9 | 0x0009 | End.T (no PSP, no USP) | [This.ID] |
10 | 0x000A | End.T with PSP | [This.ID] |
11 | 0x000B | End.T with USP | [This.ID] |
12 | 0x000C | End.T with PSP&USP | [This.ID] |
13 | 0x000D | Reserved | [This.ID] |
14 | 0x000E | End.B6.Encaps | [This.ID] |
15 | 0x000F | End.BM | [This.ID] |
16 | 0x0010 | End.DX6 | [This.ID] |
17 | 0x0011 | End.DX4 | [This.ID] |
18 | 0x0012 | End.DT6 | [This.ID] |
19 | 0x0013 | End.DT4 | [This.ID] |
20 | 0x0014 | End.DT46 | [This.ID] |
21 | 0x0015 | End.DX2 | [This.ID] |
22 | 0x0016 | End.DX2V | [This.ID] |
23 | 0x0017 | End.DT2U | [This.ID] |
24 | 0x0018 | End.DT2M | [This.ID] |
25 | 0x0019 | Reserved | [This.ID] |
26 | 0x001A | Reserved | - |
27 | 0x001B | End.B6.Encaps.Red | [This.ID] |
28 | 0x001C | End with USD | [This.ID] |
29 | 0x001D | End with PSP&USD | [This.ID] |
30 | 0x001E | End with USP&USD | [This.ID] |
31 | 0x001F | End with PSP, USP & USD | [This.ID] |
32 | 0x0020 | End.X with USD [This.ID] | |
33 | 0x0021 | End.X with PSP&USD [This.ID] | |
34 | 0x0022 | End.X with USP&USD [This.ID] | |
35 | 0x0023 | End.X with PSP, USP & USD | [This.ID] |
36 | 0x0024 | End.T with USD | [This.ID] |
37 | 0x0025 | End.T with PSP&USD | [This.ID] |
38 | 0x0026 | End.T with USP&USD | [This.ID] |
39 | 0x0027 | End.T with PSP, USP & USD | [This.ID] |
40-32767 | Unassigned | [This.ID] | |
32768-65534 | Reserved | Change control under IETF | |
65535 | 0xFFFF | Opaque | [This.ID] |
表4:IETF-SRv6端点行为
来自FCFS范围内的分配请求必须包括一个联系点,最好还包括如何使用该值的简要说明。此信息可参考互联网草案或RFC,或在一些永久且容易获得的其他文件中提供。