SRv6网络编程自学系列 | 网络程序:SRv6扩展报文头

549 阅读11分钟

书籍来源:《SRv6网络编程:开启IP网络新时代》

这本书已经出了很多年了,但多年之后因为工作需要再来读一遍,除了温习之外,发现自己学到了更多的知识。一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:SRv6网络编程自学系列 | 汇总_COCOgsta的博客-CSDN博客


2.4.1 SRv6扩展报文头设计

为了实现SRv6,根据IPv6原有的路由扩展报文头定义了一种新类型的扩展报文头,称作SRH。该扩展报文头通过携带Segment List等信息显式地指定一条SRv6路径。

SRH的格式如图2-4所示。

图2-4 SRH格式

SRH各字段的说明如表2-1所示。

表2-1 SRH各字段的说明

Segment List[0]~Segment List[n]相当于计算机程序的指令,第一个需要执行的指令是Segment List[n]。Segments Left相当于计算机程序的PC(Program Counter,程序计数器)指针,指向当前正在执行的指令。SL初始值为n,每执行完一个指令,将SL的值减1,指向下一条要执行的指令。

SRH格式可以抽象为图2-5(a)的形式,进一步简化可以得到图2-5(b)的形式。

图2-5 SRH的抽象格式

2.4.2 SRv6扩展报文头TLV

为了提升转发效率,需要定义处理TLV的本地策略,确定是否处理TLV。例如,基于接口配置忽略处理所有的TLV,或者只处理某些类型的TLV等。

当前SRH定义了两种TLV,分别是Padding TLV和HMAC TLV。

  1. Padding TLV

SRv6扩展报文头定义了两种类型的Padding TLV,分别是PAD1 TLV和PADN TLV。Padding TLV没有实际意义,所以节点处理SRH的时候需要将其忽略。

PAD1 TLV:该TLV只定义了一个Type字段,用于填充单个字节,当需要填充两个或两个以上字节的时候,不能使用该TLV。

PADN TLV:用于填充多个字节。

  1. HMAC TLV

HMAC TLV被用来防止SRH的关键信息被篡改。

2.4.3 SRv6指令集:Endpoint节点行为

在IETF的SRv6 Network Programming文稿中定义了很多Behavior(行为),它们也被称为指令。每个SID都会与一个指令绑定,用于告知节点在处理SID时需要执行的动作。SRH可以封装一个有序的SID列表,为报文提供转发、封装和解封装等服务。

表2-4 常见指令的功能介绍

  1. End SID

End SID可指引报文转发到发布该SID的节点。当报文到达该节点后,该节点执行End指令来处理报文。

End指令执行的动作是将SL的值减1,并根据SL从SRH取出下一个SID更新到IPv6报文头的目的地址字段,再查表转发。其他的参数(如Hop Limit等)按照正常转发流程处理。

  1. End.X SID

End.X支持将报文从指定的链路转发到三层邻接,可用于TI-LFA(Topology Independent Loop Free Alternate,拓扑无关的无环路备份)、严格显式路径的TE等场景。

该指令执行的动作是将SL的值减1,并根据SL从SRH取出下一个SID放到IPv6报文头的目的地址字段,再直接将IPv6报文向End.X所绑定的三层邻接转发。

  1. End.T SID

End.T支持将报文在指定的IPv6路由表中进行查表转发,可用于普通IPv6路由和VPN场景。

该指令执行的动作是将SL的值减1,并根据SL从SRH取出下一个SID更新到IPv6报文头的目的地址字段,再将IPv6报文在指定的路由表中进行查表转发。

  1. End.DX6 SID

End.DX6支持解封装报文,并向指定的IPv6三层邻接转发报文,主要用于L3VPNv6场景,可作为基于CE(per-CE)的VPN标签使用。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,再将内层IPv6报文向End.DX6绑定的IPv6三层邻接转发出去。

  1. End.DX4 SID

End.DX4支持解封装报文,并向指定的IPv4三层邻接转发报文,主要用于L3VPNv4场景,可作为基于CE(per-CE)的VPN标签使用。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,再将内层IPv4报文向End.DX4绑定的IPv4三层邻接转发出去。

  1. End.DT6 SID

End. DT6支持解封装报文,在指定的IPv6路由表中进行查表转发,主要用于L3VPNv6场景,可作为基于VPN实例(per-VPN)的VPN标签使用。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,再将内层IPv6报文在End.DT6绑定的IPv6路由表中进行查表转发。

  1. End.DT4 SID

End. DT4支持解封装报文,在指定的IPv4路由表中进行查表转发,主要用于L3VPNv4场景,可作为基于VPN实例(per-VPN)的VPN标签使用。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,再将内层IPv4报文在End.DT4绑定的IPv4路由表中进行查表转发。

  1. End.DT46 SID

End.DT46支持解封装报文,在指定的IPv4或IPv6路由表中进行查表转发,主要用于L3VPN场景,可作为基于VPN实例(per-VPN)的VPN标签使用。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,再依据内层报文的三层协议类型,将内层IP报文在End.DT46绑定的IPv4或IPv6路由表中进行查表转发。

  1. End.DX2 SID

End.DX2全称为Decapsulation and L2 Cross-connect。End.DX2支持解封装报文,将报文从指定的二层出接口转发,主要用于L2VPN/EVPN VPWS [5]场景。

End.DX2指令可以被拆解为End + D + X2,D表示解封装,X2表示交叉连接,即向指定的二层接口直接转出报文。因此End.DX2 SID需要与一个二层出接口绑定。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,再将内层以太网帧从End.DX2绑定的二层出接口转发出去。

End.DX2 SID的逻辑伪码如下。

S01. If (Upper-Layer Header type != 143) { 
S02.   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 
S03. } 
S04. Remove the outer IPv6 Header with all its extension headers and forward the Ethernet frame to the specific outgoing L2 interface
  1. End.DX2V SID

End.DX2V支持解封装报文,在指定的二层表中用报文的内层VLAN信息进行查表转发,主要用于EVPN VPWS等EVPN灵活交叉连接的场景。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,再利用内层以太网帧的VLAN信息在End.DX2V绑定的二层表中进行查表转发。

  1. End.DT2U SIDE

End.DT2U支持解封装报文,学习内层源MAC地址并存入指定的二层表中,再利用内层目的MAC地址在该表中进行查表转发,主要用于EVPN桥接单播的场景。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,学习内层以太网帧的源MAC地址并存入End.DT2U SID绑定的二层表中,再利用内层以太网帧的目的MAC地址信息在End.DT2U绑定的二层表中进行查表转发。

  1. End.DT2M SID

End.DT2M支持解封装报文,学习内层源MAC地址并存入指定的二层表中,在排除指定的接口后向其他二层出接口转发。End.DT2M主要用于EVPN桥接BUM与EVPN E-Tree(Ethernet Tree,以太网树形)场景。

该指令执行的动作是将外层IPv6报文头和外层SRH移除后,学习内层以太网帧的源MAC地址并存入End.DT2M SID绑定的二层表中,最后对于内层以太网帧,排除End.DT2M SID所带参数指定的接口后,从其他二层出接口转出。

  1. End.B6.Insert SID

End.B6.Insert支持对报文应用指定的SRv6 Policy,用于可灵活扩展的跨多域实施TE的场景,是Binding SID在SRv6中的体现。

该指令执行的动作是在IPv6报文头后插入一个SRH(包含对应的Segment List),并设置目的地址为SRv6 Policy的第一个SID。最后对这个新的IPv6报文进行查表转发。

此外,End.B6.Insert.Red指令对End.B6 Insert指令进行了优化,二者的区别仅在于End.B6.Insert.Red添加的SRH不包含SRv6 Policy中的第一个SID,这种去掉第一个SID的SRH即Reduced SRH。

  1. End.B6.Encaps SID

End.B6.Encaps支持对报文应用指定的SRv6 Policy,用于可灵活扩展的跨多域实施TE的场景,是Binding SID在SRv6中的体现。

该指令执行的动作是首先将内层SRH的SL值减1,再将SL指向的SID复制到内层IPv6报文头的目的地址字段,然后封装上一层IPv6报文头与SRH,并设置源地址为当前节点的地址,目的地址为SRv6 Policy的第一个SID,此外还要设置好外层IPv6报文头的各个字段,最后对这个新的IPv6报文进行查表转发。

此外,End.B6.Encaps.Red指令对End.B6 Encaps指令进行了优化,二者的区别仅在于End.B6.Encaps.Red指令添加的是Reduced SRH。

  1. End.BM SID

End.BM支持对报文应用指定的SR-MPLS Policy,用于可灵活扩展的跨多个MPLS域实施TE的场景,是SR-MPLS Binding SID在SRv6中的体现。

该指令执行的动作是首先将内层SRH的SL值减1,然后在IPv6报文头前插入一个SR-MPLS Policy所包含的MPLS标签栈,最后对这个新的MPLS报文查MPLS标签转发表进行转发。

2.4.4 SRv6指令集:源节点行为

下面介绍SRv6源节点封装扩展报文头的几种模式,如表2-5所示。

表2-5 源节点行为

  1. H.Insert

H.Insert支持对IP报文在本地应用一个SRv6 Policy,使用一个新的路径进行转发,通常用于TI-LFA场景。

该行为需要执行的动作是在数据报文的IPv6报文头后插入一个SRH,并设置目的地址为SRv6 Policy的第一个SID,最后对这个新的IPv6报文进行查表转发。

此外,H.Insert.Red行为对H.Insert行为进行了优化,二者的区别仅在于H.Insert.Red行为添加的是Reduced SRH。

  1. H.Encaps

H.Encaps支持对IP报文在本地应用一个SRv6 Policy,使用一个新的路径进行转发,通常用于L3VPNv4或L3VPNv6场景。

该行为需要执行的动作是在数据报文的IP报文头外面封装一个IPv6报文头与SRH,并设置源地址为当前节点的地址,目的地址为SRv6 Policy的第一个SID,此外还要设置好外层IPv6报文头的各个字段,最后对这个新的IPv6报文进行查表转发。

此外,H.Encaps.Red行为对H.Encaps行为进行了优化,二者的区别仅在于H.Encaps.Red添加的是Reduced SRH。

  1. H.Encaps.L2

H.Encaps.L2支持对二层帧在本地应用一个SRv6 Policy,使用一个新的路径进行转发。此外,H.Encaps.L2要求SRv6 Policy中的最后一个SID必须是End.DX2、End. DX2V、End.DT2U或End.DT2M类型的指令。

该行为需要执行的动作是在二层帧外面封装上新的IPv6报文头,并添加SRH,使其在新的SRv6 Policy隧道中转发。

此外,H.Encaps.L2.Red行为对H.Encaps.L2行为进行了优化,二者的区别仅在于H.Encaps.L2.Red添加的是Reduced SRH。

2.4.5 SRv6指令集:Flavor附加行为

本节介绍3种为增强End系列指令而定义的附加行为。这些附加行为是可选项,它们将会增强End系列指令的执行动作,满足更丰富的业务需求。这些附加行为及其功能如表2-6所示。

表2-6 Flavor附加行为及其功能

  1. PSP

PSP是指在倒数第二个Endpoint节点执行移除SRH的动作。

该行为需要执行的动作是在执行完相应的End动作后,检查被End动作更新后的SL是否为0,若为0,则移除该SRH。

  1. USP

USP是指在最后一个Endpoint节点执行移除SRH的动作。

该行为需要执行的动作是在执行相应的End动作之前,检查当前的SL是否为0,若为0,则移除该SRH。

  1. USD

USD是指在最后一个Endpoint节点执行解封装外层IPv6报文头的动作。

该行为需要执行的动作是在执行相应的End指令之前,检查当前的SL是否为0,若为0,则跳过对该SRH的处理,直接处理下一个报文头。

当下一个报文头是下一层协议头时,检查是否是IPv4或IPv6报文头,若是,则将外层IPv6报文头解封装,对内层报文头执行End、End.X或End.T对应的查表、转发指令。

Flavor附加行为可以组合起来定义,例如,End SID 带上 PSP 和 USP,表明这个指令同时具备 PSP 与 USP的能力,当该 SID 被封装在 SRH 中的倒数第二个 SID 时,它能执行PSP 动作,当该 SID 被封装在 SRH 中的最后一个SID 时,它能执行 USP动作。