一文简述:SRv6 基本原理
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 的格式如下:
SRH 各字段的说明如下:
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 实例、出接口和下一跳等。
假设现在有报文需要从主机 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。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/7c16f2fad51f1487554fd29cf】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论