SRv6基本知识盘点

时间:2021-09-15 00:48:52

SRv6将网络功能指令化,将表达网络功能的指令嵌入128 bit的IPv6地址中。在SRv6网络里,业务需求可以被翻译成有序的指令列表,由沿途的网络设备去执行,达到网络业务的灵活编排和按需定制。

1、SRv6 Segment

通常一条计算机指令包括两方面的内容:Opcode(操作码)和Operand(操作数),其中Opcode决定要完成的操作,Operand指参加运算的数据及其所在的单元地址。同样,我们在进行SRv6网络编程的时候,也需要定义网络指令:SRv6Segment。标识SRv6 Segment的ID被称为SRv6 SID ,SRv6SID是一个128 bit的值,它通常由3个部分组成Locator、Function、Arguments。

  • Locator的作用就是将报文路由到执行该指令的网络设备中,实现网络指令的可寻址。Locator标识的位置信息有两个重要的属性:可路由和可聚合。Locator对应的路由会由节点通过IGP发布到网络中,用于帮助其他设备将报文转发到发布该Locator的节点。此外,Locator对应的路由也是可聚合的。Locator的长度可变,用于适配不同规模的网络。
  • Function用来表达该指令要执行的转发动作,相当于计算机指令的Opcode。在SRv6网络编程中,不同的转发行为由不同的Function来表达。和计算机的指令类似,按照不同功能将Function定义成不同类型的SID,表达对应的转发行为,如转发报文到指定链路,或在指定表中进行查表转发等。
  • Arguments(Args)字段是一个可选字段。它是指令在执行时对应的参数,这些参数可能包含流、服务或任何其他相关的信息。
2、SRv6节点

在SRv6网络中存在多种类型的节点角色,基本上分为以下3类:

  • SRv6源节点:生成SRv6报文的源节点,源节点将数据包引导到SRv6 Segment List中,如果SRv6Segment List只包含单个SID,并且无须在SRv6报文中添加信息或TLV,则SRv6报文的目的地址字段设置为该SID,可以不封装SRH。源节点可以是生成IPv6报文且支持SRv6的主机,也可以是SRv6域的边缘设备。
  • 中转节点:在SRv6报文转发路径上不参与SRv6处理的IPv6节点,即中转节点只执行普通的IPv6报文转发。当节点收到SRv6报文以后,会解析报文的IPv6 DA(Destination Address,目的地址)字段。如果IPv6目的地址既不是本地配置的SRv6SID,也不是本地接口地址,则节点将SRv6报文当作普通的IPv6报文,按照最长匹配原则查找IPv6路由表,进行处理和转发,不处理SRH,此时该节点就是中转节点。中转节点可以是普通的IPv6节点,也可以是支持SRv6的节点。
  • SRv6段端点节点:在SRv6报文转发过程中,节点接收的报文的IPv6目的地址是本地配置的SID,则该节点被称为端点节点。该节点需要处理SRv6 SID和SRH。
3、SRv6扩展报文头

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

SRv6基本知识盘点

SRH各字段的说明如下:

SRv6基本知识盘点

SRv6指令的命名规则如下:

  • End:End是最基础的Segment Endpoint执行指令,表示当前指令的终止,开始执行下一个指令。对应的转发动作是将SL的值减1,并将SL指向的SID复制到IPv6报文头的目的地址字段。
  • X:指定一个或一组三层接口转发报文。对应的转发行为是按照指定出接口转发报文。
  • T:查询路由转发表并转发报文。
  • D:解封装。移除IPv6报文头和与它相关的扩展报文头。
  • V:根据VLAN(Virtual Local Area Network,虚拟局域网)查表转发。
  • U:根据单播MAC查表转发。
  • M:查询二层转发表,进行组播转发。
  • B6:应用指定的SRv6 Policy。
  • BM:应用指定的SR-MPLS Policy。

所有指令都是由上述一个或多个原子功能组合而成的。

4、SRv6报文转发

SRv6节点维护一个本地SID表,该表包含所有在该节点生成的SRv6 SID信息。本地SID表有以下用途。

  • 存储本地生成的SID,例如End.X SID。
  • 指定绑定到这些SID的指令。
  • 存储和这些指令相关的转发信息,例如VPN实例、出接口和下一跳等。

SRv6基本知识盘点

假设现在有报文需要从主机H1转发到主机H2,H1将报文发送给节点A处理。节点A、B、D和F均为支持SRv6的设备,节点C和节点E为不支持SRv6的设备。

在SRv6源节点A上进行了网络编程,希望报文经过B-C和D-E这两条链路,然后送达节点F,再经节点F送达主机H2。以下是报文从节点A到节点F的详细处理步骤。

1)SRv6源节点A的处理。节点A将SRv6路径信息封装在SRH中,指定B-C链路和D-E链路的End.X SID。另外,节点A上还要封装节点F发布的End.DT4 SID A6::100,这个End.DT4 SID对应于节点F的一个IPv4 VPN。按照逆序形式压入SID序列,由于有3个SID,所以节点A封装后的报文的初始SL=2。SL指向当前需要处理的操作指令,也就是Segment List[2]字段,节点A将其值A2::23复制到外层IPv6报文头的目的地址字段,并且按照最长匹配原则查找IPv6路由表,将报文转发到节点B。

2)Endpoint节点B的处理。节点B收到报文以后,根据IPv6报文的目的地址A2::23查找本地SID表,命中End.X SID。节点B执行End.X SID的指令动作,将SL的值减1,并将SL指示的SID更新到外层IPv6报文头的目的地址字段,同时将报文从End.X SID绑定的链路发送出去。

3)中转节点C的处理。当报文到达节点C后,节点C只支持处理IPv6报文头,无法识别SRH,此时节点C按照正常的IPv6报文处理流程,按照最长匹配原则查找IPv6路由表,将报文转发给当前的目的地址所代表的节点D。

4)Endpoint节点D的处理。节点D收到报文以后,根据IPv6报文的目的地址A4::45查找本地SID表,命中End.X SID。节点D执行End.X SID的指令动作,将SL的值减1,并将SL指示的SID更新到外层IPv6报文头的目的地址字段,同时将报文从End.X SID绑定的链路发送出去。如果A4::45是PSP Flavor的SID,则此时可以根据PSP的指示将SRH弹出,报文就变成了普通的IPv6报文。

5)中转节点E的处理。节点E只支持IPv6报文头处理,无法识别SRH,此时节点E按照正常的IPv6报文处理流程,按照最长匹配原则查找IPv6路由表,将报文转发给当前目的地址所代表的节点F。

6)Endpoint节点F的处理。节点F收到报文以后,根据外层IPv6目的地址A6::100查找本地SID表,命中End.DT4 SID。节点F执行End.DT4 SID的指令动作,解封装报文,去除IPv6报文头,再将内层IPv4报文在End.DT4 SID绑定的VPN实例的IPv4路由表中进行查表转发,最终将报文发送给主机H2。