traceroute默认使用udp协议追踪路径,通过发送ttl值从1开始递增的udp探测包(端口从33434起递增),利用中间路由器ttl减至0时返回icmp time exceeded消息识别跳点,目标主机端口不可达时返回icmp port unreachable消息判定路径终结。

traceroute 使用 UDP 协议追踪路径,核心在于巧妙组合 TTL 递增 和 目标端口不可达响应 两个机制,而不是靠“收到回复就停”这种简单逻辑。
UDP 探测包的构造特点
Linux 和 macOS 默认用 UDP,不是随便选的协议——它有明确设计意图:
- 源主机发送 UDP 包,目标端口从 33434 开始逐跳递增(如第1跳发到33434,第2跳发到33435)
- 这些端口在绝大多数目标主机上未被监听,因此不会被应用层接收,而是由内核直接处理
- IP 头部 TTL 值从 1 开始,每轮探测都加 1,强制数据包在指定跳数后“寿终正寝”
中间路由器如何暴露自己
当 UDP 包经过路由器时,TTL 被减 1;一旦变为 0,路由器必须丢弃该包,并主动发回一个 ICMP 报文:
- 报文类型是 ICMP Time Exceeded(Type 11, Code 0)
- 该报文中携带了该路由器出接口的 源 IP 地址,这就是 traceroute 能识别“第几跳是谁”的依据
- 注意:这个响应是路由器自发行为,不依赖目标主机是否在线或是否开放服务
怎么知道已经到达目标主机
当 TTL 值足够大,UDP 包终于抵达目标主机时,流程发生关键变化:
- 目标主机收到 UDP 包,检查目标端口(比如 33450)——发现无进程监听
- 内核于是返回 ICMP Destination Unreachable: Port Unreachable(Type 3, Code 3)
- traceroute 检测到这个特定类型的 ICMP 响应,就判定“路径已通达”,停止后续探测
为什么常看到星号(*)
星号不代表“没信号”,而是说明某跳路由器没按规范返回 ICMP 超时报文,常见原因包括:
- 路由器配置为 静默丢弃 TTL=0 的包,不发任何 ICMP 回复
- 防火墙或 ACL 明确 过滤了 Type 11 ICMP 报文
- 设备负载过高,来不及生成并发送响应
- 注意:即使某跳显示 *,只要后续跳能响应,traceroute 仍会继续递增 TTL 向前探测











