linux traceroute默认用udp,强制启用icmp模式需加-i参数:发送icmp echo request,ttl从1递增,每跳3包,中间节点返回icmp time exceeded(type 11),目标返回icmp echo reply(type 0),需root权限或cap_net_raw。

traceroute 默认在不同系统中行为不同:Linux 下默认用 UDP(端口 33434 起),而 Windows 的 tracert 始终基于 ICMP Echo Request。若需在 Linux 或类 Unix 系统中**强制使用 ICMP 协议**,必须显式指定参数,否则无法触发 ICMP 模式。
如何启用 ICMP 模式
使用 -I(大写 i)选项即可让 traceroute 发送 ICMP Echo Request 报文,而非默认的 UDP 包:
- traceroute -I www.example.com —— 启用 ICMP,TTL 从 1 开始递增,每跳发 3 个探测包
- traceroute -I -n -w 500 -h 15 example.com —— 同时禁用 DNS 解析(-n)、设超时 500ms(-w)、限制最大跳数为 15(-h)
为什么需要强制 ICMP
某些网络环境会过滤或限速 UDP 探测包,但允许 ICMP Echo 流量;另外,部分防火墙或中间设备对 ICMP Time Exceeded(超时)响应更稳定。启用 -I 后,路径反馈更接近真实 ping 行为,也便于与 tracert 结果横向比对。
ICMP 模式下的响应逻辑
每跳路由器收到 TTL=1 的 ICMP Echo Request 后,TTL 减至 0,随即丢弃并返回 ICMP Time Exceeded 报文(类型 11,代码 0)。目标主机最终收到 TTL 足够的报文后,不返回 Time Exceeded,而是发送 ICMP Echo Reply(类型 0)。traceroute 正是靠识别这两种 ICMP 类型,来区分“中间节点”和“终点”。
注意事项
- 需要 root 权限(或 CAP_NET_RAW)才能发送原始 ICMP 包,普通用户执行 traceroute -I 可能失败,提示 “Operation not permitted”
- 部分精简版系统(如 Alpine Linux)默认不带 ICMP 支持,需安装完整版 traceroute(如 traceroute-ng 或启用 iputils-tracepath)
- ICMP 模式下不会出现 “port unreachable” 提示——那是 UDP 模式到达终点时的典型响应











