当traceroute 通过 UDP 运行时,为什么在最后一跳期望“目标无法到达”而不是“回显回复”?

2 implementation wikipedia traceroute icmp icmpv6

摘自 Wikipedia 页面的Traceroute实现部分:

。。。直到到达目的地,如果正在使用 UDP 数据包,则返回 ICMP Destination Unreachable 消息;如果正在使用 ICMP Echo 消息,则返回 ICMP Echo Reply 消息。

它说在最后一跳traceroute 期待 ICMP“目标无法到达”,而我希望它使用 ICMP“回显回复”。

我查看了该页面的历史记录,它被一个名叫“Guy Harris”的人更改了。他说:

。。。如果您使用 UDP 数据包(如 Traceroute 默认情况下所做的那样),最后一跳将返回 ICMP Destination Unreachable(除非您不幸将 UDP 数据包发送到具有侦听器的端口),而不是 ICMP Echo Reply。

有人可以解释一下吗?

sha*_*ncs 8

因为traceroute需要在UDP数据报到达目的地时获取消息。

Traceroute 的工作原理如下:

  1. 向目标主机发送 TTL 为 1 的 UDP 数据报。路由器读取数据报,减少 TTL 并发回 ICMP 超时消息。
  2. Traceroute 收到上述消息后,又发送一个 TTL 为 2 的 UDP 数据报。互联网上的路由器读取该数据报,各自递减 TTL,最后发回 ICMP 超时消息。
  3. 继续上述步骤,最后,TTL为N时,UDP数据报已到达目的主机。那么,主机应该返回什么呢?它无法像以前一样发回 ICMP 超时消息 - 未超出 TTL。

Traceroute设计将UDP数据报发送到主机的某个端口,而该端口几乎不可能被监听(33435例如)。目的主机收到UDP数据报,发现数据报的目标端口没有被监听,然后返回“Destination Unreachable”消息——更准确地说,“Port Unreachable”。

这就是为什么 Traceroute 期望在最后一跳出现“Destination Unreachable”消息来确定 UDP 数据报已经到达目的地。

顺便说一句,如果目标端口在目标主机上被意外侦听,这就是 Guy Harris 描述的场景:“除非您很不幸向具有侦听器的端口发送了 UDP 数据包”