「VPN」- SRv6: Ping and Tracert

SRv6 Ping/Tracert 介绍

Flags 详细格式:

| | |O-bit|Reserved|

方案一:SRH 里的 O-bit

由于 O-bit 处于 SRv6 报文头中,每一个 SRv6 Endpoint 节点都需要处理并响应 ICMPv6 Ping&Tracert 请求;

所以基于 O-bit=1,就可以实现逐段(Segment-by-Segment)检测;

方案二:利用 End.OP SID

End.OP SID 可以指示将数据包上送到控制平面进行 OAM 处理;

检测 SRv6 Policy 时,头节点会将 End.OP SID 编入 Segment List;

由于只有生成了 End.OP SID 的 SRv6 Endpoint 节点才能处理 ICMPv6 Ping&Tracert 请求报文,所以基于 End.OP SID,就可以实现端到端(End-to-End)检测;

实现方式

当前实现 SRv6 的 Ping&Tracert 有两种方法:

一种是在 SRH 中引入了 OAM 比特位,由于 O-bit 处于 SRv6 报文头中,每一个 SRv6 Endpoint 节点都需要处理并响应 ICMPv6 Ping&Tracert 请求,所以基于 O-bit 可以实现逐段检测,通过 ping ipv6-sid 和 tracert ipv6-sid 命令可以检测单个或多个 SID;

另一种是引入 End.OP SID,End.OP SID 可以指示将数据包上送到控制平面进行 OAM 处理。检测 SRv6 Policy 时,头节点会将 End.OP SID 会编入 Segment List。由于只有生成了 End.OP SID 的 SRv6 Endpoint 节点才能处理 ICMPv6 Ping&Tracert 请求报文,所以基于 End.OP SID 可以实现端到端检测;

这种情况下,又进一步分为两种形式:
其一是在 ping ipv6-sid 和 tracert ipv6-sid 命令中通过增加 End.OP 类型的 SID,实现对 SID 栈的检测;

其二是在 ping srv6-te policy 和 tracert srv6-te policy 命令中通过指定 end-op 参数,实现对 SRv6 Policy 的检测;

SRv6 Ping 工作原理

SRv6 Ping 可以分为逐段 Ping 测试与非逐段 Ping 测试

对于逐段检测的情况:
PE1 向 PE2 发起 Ping,携带 P1 的 SRv6 SID(End SID 和 End.X SID)和 PE2 的 End SID,构造并发送 ICMPv6 请求报文;
P1 收到 ICMPv6 请求报文后,会向 PE1 发送 ICMPv6 应答报文,并且向 PE2 转发 ICMPv6 请求报文;
PE2 收到 ICMPv6 请求报文后,向 PE1 发送 ICMPv6 应答报文;

对于非逐段检测的情况:
PE1 向 PE2 发起 Ping,携带 PE2 的 End SID,构造并发送 ICMPv6 请求报文;
P1 收到 ICMPv6 请求报文后,会向 PE2 转发 ICMPv6 请求报文;
PE2 收到 ICMPv6 请求报文后,向 PE1 发送 ICMPv6 应答报文。此时发送端 PE1 上可以查看 Ping 操作的详细信息;

SRv6 Tracert 工作原理

SRv6 Tracert 可以分为 Overlay Tracert 与非 Overlay Tracert;

对于 Overlay 检测的情况:
PE1 向 PE2 发起 Tracert,携带 P1 的 SRv6 SID(End SID 和 End.X SID)和 PE2 的 End SID,构造 UDP 报文,封装 SRH 扩展头并进行转发。此时 IPv6 报文首部的 Hop Limit(等同于 IPv4 中的 TTL)字段的取值设置为 64,每经过一个设备,Hop Limit 字段的取值都会减 1,当该字段的值为 0 时,数据包就被丢弃,并向 PE1 发送 ICMPv6 超时报文;
P1 收到 UDP 报文后,Hop Limit 字段的值变成 63,会向 PE1 发送 ICMPv6 端口不可达报文,并将 UDP 报文向 PE2 转发;
PE2 收到 UDP 报文后,Hop Limit 字段的值变成 62,会向 PE1 发送 ICMPv6 端口不可达报文;

对于非 Overlay 检测的情况:
PE1 向 PE2 发起 Tracert,携带 P1 的 SRv6 SID 和 PE2 的 End SID,构造 UDP 报文,封装 SRH 扩展头并进行转发。此时 IPv6 报文首部的 Hop Limit 字段的取值设置为 1,每经过一个设备,Hop Limit 字段的取值都会减 1,当该字段的值为 0 时,数据包就被丢弃,并向 PE1 发送 ICMPv6 超时报文;
P1 收到 UDP 报文后,Hop Limit 字段的值变成 0,会向 PE1 发送 ICMPv6 超时报文;
PE1 收到 P1 发送的 ICMPv6 超时报文后,将 Hop Limit 字段的取值加 1(此时设置为 2),继续发送 UDP 报文;
P1 收到 UDP 报文后,Hop Limit 字段的值变成 1,会向 PE2 转发 UDP 报文;
PE2 收到 UDP 报文后,Hop Limit 字段的值变成 0,确认 SID 类型为 End SID,并校验上层协议头是否为 UDP 或 ICMPv6;