为什么 traceroute 在通过 UDP 运行时期望在最后一跳 "Destination Unreachable" 而不是 "Echo Reply" ?

Why does traceroute expect "Destination Unreachable" at the final hop instead of "Echo Reply" when it runs over UDP?

摘自 traceroute 的维基百科页面的实施部分:

. . . until the destination is reached and returns an ICMP Destination Unreachable message if UDP packets are being used or an ICMP Echo Reply message if ICMP Echo messages are being used.

它说在最后一跳 traceroute 期待 ICMP“Destination Unreachable”,而我期待它使用 ICMP“Echo Reply”。

我看到了该页面的历史,它被一个名叫 'Guy Harris' 的人更改了。他说:

. . . If you use UDP packets, as traceroute does by default, the final hop returns ICMP Destination Unreachable (unless you're unlucky enough to have send a UDP packet to a port with a listener), not ICMP Echo Reply.

有人可以解释一下吗?

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

Traceroute 的工作原理如下:

  1. 将 TTL 为 1 的 UDP 数据报发送到目的地 host.The 路由器读取数据报,递减 TTL 并发回 ICMP 超时消息。
  2. Traceroute接收到上述消息,并发送另一个TTL为2的UDP数据报。互联网上的路由器读取此数据报,各自递减TTL,最后发回ICMP超时消息。
  3. 继续以上步骤,最终TTL为N,UDP数据报到达目的主机。那么,宿主return应该怎么办?它不能像以前一样发回 ICMP 超时消息——没有超过 TTL。

Traceroute 设计将UDP 数据报发送到主机的某个端口,并且该端口几乎不可能被侦听(例如33435)。目的主机收到UDP数据报,发现数据报的目标端口没有被监听,然后return"Destination Unreachable"报文——更准确的说,"Port Unreachable".

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

顺便说一句,如果不小心在目标主机上监听了目标端口,那只是 Guy Harris 描述的场景:"unless you're unlucky enough to have send a UDP packet to a port with a listener"

https://www.slashroot.in/how-does-traceroute-work-and-examples-using-traceroute-command

上面的 link 是我昨天在尝试用 C 编写 ping 和 traceroute 函数时发现的。在那里,它很好地解释了 traceroute 的工作方式,所以我推荐大家想更好地理解阅读那篇文章的主题。

但是为了对您的问题提供一个简短的答案,有很多方法可以实现 traceroute。文章说有 3 个。在 Linux 上使用 UDP 样式来实现跟踪路由,而在 Windows 上使用 ICMP 样式。所以你并不完全错,但答案有点复杂。