根据 Stevens(TCP/IP 说明),traceroute 程序将带有增量 TTL(1、2、3 等)的 UDP 数据包发送到目标主机,以从 ICMP TTL EXPIRED 消息中获取中间跃点信息。
“destination returned”条件是一个 ICMP PORT UNREACHABLE 消息,因为 Traceroute 会寻址一个具有高编号的随机端口(即:不太可能有人正在侦听)
所以我的问题是:是否存在技术原因(缺点、RFC 等)来使用 UDP 数据包,而不是使用例如 ICMP echo request 消息(随着 TTL 的增加)并使用 echo reply 答案作为结束条件?
我知道 ICMP 回显回复可能会被中间的防火墙或其他网络设备过滤掉,但我想这也可能发生在 UDP 数据包上;)
非常感谢
塞尔吉奥
这实际上是进行路由跟踪的“旧”方法。我猜主要动机是发送普通 UDP 数据包不需要特殊权限,而发送 ICMP 数据包则需要特殊权限(原始套接字或等效项)。这就是为什么例如
ping
通常将uid设置为root,这在安全方面是一个很大的风险。
现在
traceroute
也支持ICMP和TCP探测数据包,因此您更有可能潜入防火墙,而防火墙很可能在不考虑的情况下部署。这也意味着 traceroute
也可能在您的系统上 setuid root。请参阅其手册页,尤其是有关可用方法的部分:http://linux.die.net/man/8/traceroute
当 LBL 的 Van Jacobson 使用我的内核 ICMP 支持来编写 TRACEROUTE 时,我非常嫉妒,因为他意识到,通过调制 IP 生存时间 (TTL) 字段,他可以在 ping 时获得 ICMP 生存时间超出消息。我希望我能想到这一点! :-) 当然,真正的跟踪路由使用 UDP 数据报,因为路由器不应该为 ICMP 消息生成 ICMP 错误消息。