为啥 traceroute 发送 UDP 数据包而不是 ICMP 数据包?

Posted

技术标签:

【中文标题】为啥 traceroute 发送 UDP 数据包而不是 ICMP 数据包?【英文标题】:Why traceroute sends UDP packets and not ICMP ones?为什么 traceroute 发送 UDP 数据包而不是 ICMP 数据包? 【发布时间】:2012-05-05 22:36:02 【问题描述】:

根据 Stevens (TCP/IP Illustrated),traceroute 程序使用增量 TTL(1、2、3 等)向目标主机发送 UDP 数据包,以从中获取中间跃点信息ICMP TTL EXPIRED 消息。 “destination reached”条件是一个 ICMP PORT UNREACHABLE 消息,因为 traceroute 寻址一个具有高数字的随机端口(即:不太可能有人在那里监听) 所以我的问题是:是否有技术原因(缺点、RFC 等)使用 UDP 数据包而不是使用例如 ICMP echo request 消息(增加 TTL)并使用 echo reply回答作为结束条件? 我知道 ICMP 回显回复可能会被中间的防火墙或其他网络设备过滤掉,但我想这也可能发生在 UDP 数据包上;)

非常感谢 塞尔吉奥

【问题讨论】:

【参考方案1】:

这实际上是进行跟踪路由的“旧”方法。我想主要的动机是发送普通的 UDP 数据包不需要特殊权限,就像发送 ICMP 数据包一样(原始套接字或等效的)。这就是为什么例如ping 通常设置为 root,这在安全方面存在很大风险。

现在traceroute 也支持 ICMP 和 TCP 探测数据包,因此您更有可能偷偷穿过防火墙,而这些防火墙很可能在没有考虑的情况下部署。这也意味着traceroute 很可能也是您系统上的setuid root。请参阅其手册页,尤其是有关可用方法的部分:http://linux.die.net/man/8/traceroute

【讨论】:

以上是关于为啥 traceroute 发送 UDP 数据包而不是 ICMP 数据包?的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu NAT traceroute只显示一行

traceroute ping 开放(icmp|udp)

ICMP的应用--Traceroute

[svc]traceroute

为啥 Java DatagramSocket 没有收到客户端发送的所有 udp 数据包?

Gstreamer:为啥我不能在 localhost 上通过 UDP 发送数据?