按照下图路径,报文需要从主机H1转发到主机H2,H1将报文发送给节点A处理。节点A、B、D和F均为支持SRv6的设备,节点C和节点E为不支持SRv6的设备。
我们在SRv6源节点A上进行了网络编程,希望报文经过B-C和D-E这两条链路,然后送达节点F,再经节点F送达主机H2。以下是报文从节点A到节点F的详细处理步骤。
-
节点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。 -
节点B收到报文,根据IPv6报文的目的地址A2::23查找本地SID表,命中End.X SID。节点B执行End.X SID指令动作,将SL的值减1,并将SL指示的SID更新到外层IPv6报文头的目的地址字段,
同时将报文从End.X SID绑定的链路发送出去。
-
当报文到达节点C后,节点C只支持处理IPv6报文头,无法识别SRH,此时节点C按照正常的IPv6报文处理流程,按照最长匹配原则查找IPv6路由表,将报文转发给当前的目的地址所代表的节点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报文。
- 中转节点E的处理。节点E只支持IPv6报文头处理,无法识别SRH,此时节点E按照正常的IPv6报文处理流程,按照最长匹配原则查找IPv6路由表,将报文转发给当前目的地址所代表的节点F。
6.节点F收到报文以后,根据外层IPv6目的地址A6::100查找本地SID表,命中End.DT4 SID。节点F执行End.DT4 SID的指令动作,解封装报文,去除IPv6报文头,再将内层IPv4报文在End.DT4 SID绑定的VPN实例的IPv4路由表中进行查表转发,最终将报文发送给主机H2。