首页 > 解决方案 > 为什么在 UDP 上运行时,traceroute 在最后一跳期望“Destination Unreachable”而不是“Echo Reply”?

问题描述

摘自 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。

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

标签: implementationwikipediaicmptracerouteicmpv6

解决方案


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


推荐阅读