跳到主要内容

9.2. IPv4 Traceroute

9.2. IPv4 Traceroute

对于 IPv4 traceroute, 我们无法遵循上述过程, 因为 IPv4 ICMP Time Exceeded 消息仅包含触发 IP 头部和 IP 头部后的 8 个八位字节。因此, 当核心路由器向 ITR 发送 IPv4 Time Exceeded 消息时, ITR 在 ICMP 有效负载中所拥有的只是它添加的封装头部, 后跟 UDP 头部。原始触发 IP 头部以及 traceroute 源的身份丢失。

我们提出的解决此问题的方案是在 ITR 中缓存 traceroute IPv4 头部, 并将它们与从核心路由器和 ETR 接收的相应 IPv4 Time Exceeded 消息匹配。ITR 将使用循环缓冲区来缓存 traceroute 数据包的 IPv4 和 UDP 头部。它将选择一个 16 位数字作为密钥, 以便稍后在接收到 IPv4 Time Exceeded 消息时找到它们。当 ITR 封装 IPv4 traceroute 数据包时, 它将使用 16 位数字作为封装头部中的 UDP 源端口。当 ICMP Time Exceeded 消息返回到 ITR 时, 封装头部的 UDP 头部存在于 ICMP 有效负载中, 从而允许 ITR 找到 traceroute 源的缓存头部。ITR 将缓存的头部放入有效负载中, 并将 ICMP Time Exceeded 消息发送到 traceroute 源, 保留原始 ICMP Time Exceeded 消息的源地址 (核心路由器或 traceroute 目标站点的 ETR)。

traceroute 数据包的签名有两种形式。第一种形式编码为 UDP 消息, 其中检查目标端口的值范围。第二种形式编码为 ICMP 消息, 其中检查 IP 标识字段的已知值。