0

摘自 Wikipedia page 的traceroute实现部分:

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

它说,当我期望它使用 ICMP“Echo 回复”时,在最后一跳 traceroute 期望 ICMP“Destination Unreachable”。

我看到了页面的历史,它被一个名叫“盖伊哈里斯”的人改变了。他说:

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

有人可以对此有所了解吗?

4

2 回答 2

4

因为 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 数据包发送到带有监听器的端口”

于 2019-03-05T15:06:36.150 回答
0

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

上面的链接是我昨天在尝试用 C 语言创建 ping 和 traceroute 函数时发现的。在那里,它很好地解释了 traceroute 的工作方式,所以我建议每个想要更好地理解该主题的人阅读那篇文章.

但是为了对您的问题提供简短的回答,有很多方法可以实现 traceroute。文章说有 3 个。在 Linux 上使用实现 traceroute 的 UDP 风格,而在 Windows 上使用 ICMP 风格。所以你并没有完全错,但答案有点复杂。

于 2021-11-28T14:28:11.463 回答