traceroute维基百科页面的实现部分摘录:
“...到目的地之前,如果正在使用UDP数据包,则返回ICMP Destination Unreachable消息;如果正在使用ICMP Echo消息,则返回ICMP Echo Reply消息。”
它说,在最后一跳traceroute期待ICMP“目标无法访问”,当我期望它使用ICMP“Echo Reply”时。
我看到了这个页面的历史,并被一个名叫'Guy Harris'的人改变了。他说:“......如果你使用UDP数据包,正如traceroute默认做的那样,最后一跳返回ICMP目的地无法到达(除非你不幸发送UDP数据包到一个带有监听器的端口),而不是ICMP Echo答复。”
有人可以对此有所启发吗?
因为当UDP数据报到达目的地时,traceroute需要获取消息。
Traceroute的工作原理如下:
Traceroute设计将UDP数据报发送到主机端口,并且几乎不可能监听端口(例如33435
)。目标主机接收UDP数据报,发现数据报的目标端口未被侦听,然后返回“目标无法访问”消息 - 更准确地说,“端口无法访问”。
这就是为什么traceroute期望在最后一跳的“目的地无法到达”消息确定UDP数据报已经到达目的地的原因。
顺便说一句,如果在目标主机上意外收听了目标端口,那就是Guy Harris所描述的场景:“除非你不幸的是将UDP数据包发送到带有监听器的端口”