如何在Windows、Mac和Linux上运行Traceroute
traceroute 是一种网络诊断工具,用于映射 IP 数据包从您的计算机到目标主机所经过的确切路径,记录沿途每个中间路由器(跳点),并测量到每个跳点的往返时间(RTT)。它是隔离延迟峰值、丢包或路由异常是否源于本地网络、ISP 基础设施、传输骨干网或目标服务器本身的最有效工具。
当您运行 traceroute 时,您的系统会发送一系列具有递增 TTL(生存时间)值的探测数据包。每个将 TTL 递减至零的路由器都会返回 ICMP “超时”消息,从而揭示其身份和响应时间。这一机制使 traceroute 与简单的 `ping` 有着本质区别——它暴露了完整的路由拓扑,而不仅仅是端到端的可达性。
Traceroute 的底层工作原理
了解底层机制可以防止对结果的误解——即使是经验丰富的管理员也会犯这种错误。
- Windows(`tracert`)默认发送 ICMP Echo Request 数据包。
- Linux 和 macOS(`traceroute`)默认向高编号端口(33434+)发送 UDP 数据报,但这是可配置的。
- 每个探测每跳发送三次,每行产生三个 RTT 测量值。
- 对 ICMP/UDP 进行速率限制或丢弃的路由器将显示星号(`* * *`),但这并不一定意味着其后的路径已中断。
操作系统之间的这种行为差异至关重要:在 Linux 上显示无响应的跳点在 Windows 上可能正常响应,这仅仅是因为路由器的 ACL 阻止了 UDP 但允许 ICMP。
如何在 Windows 上运行 Traceroute
第一步:打开命令提示符
按 `Win + R`,输入 `cmd`,然后按 Enter。或者在开始菜单中搜索命令提示符。对于 ICMP 受限的环境,请考虑以管理员身份运行。
第二步:执行命令
“`
tracert example.com
“`
将 `example.com` 替换为目标域名或 IP 地址。Windows 在发送第一个探测之前会将主机名解析为 IP。
第三步:读取输出
“`
Tracing route to example.com [93.184.216.34] over a maximum of 30 hops:
1 <1 ms <1 ms <1 ms 192.168.0.1
2 10 ms 11 ms 10 ms 10.0.0.1
3 15 ms 16 ms 15 ms isp.gateway.net [203.0.113.1]
4 * * * Request timed out.
5 22 ms 21 ms 23 ms core1.backbone.net [198.51.100.5]
“`
Windows 上的 `tracert` 关键选项
| 标志 | 功能 |
|---|---|
| — | — |
| `-d` | 跳过反向 DNS 查找,显著加快输出速度 |
| `-h <max_hops>` | 设置最大跳数(默认:30) |
| `-w <timeout>` | 设置每个探测的等待时间(毫秒)(默认:4000 ms) |
| `-4` | 强制使用 IPv4 |
| `-6` | 强制使用 IPv6 |
带选项的示例:
“`
tracert -d -h 20 -w 2000 example.com
“`
专业提示:在 Windows 上,当您只关心 IP 级路由而不关心主机名时,`tracert -d` 是获取结果的最快方式。在拥塞的网络上,反向 DNS 查找每跳可能增加数秒时间。
如何在 macOS 上运行 Traceroute
第一步:打开终端
按 `Command + Space`,输入终端,然后按 Enter。或导航至应用程序 > 实用工具 > 终端。
第二步:执行命令
“`
traceroute example.com
“`
macOS 预装了 `traceroute`,作为其 BSD 网络工具包的一部分。无需额外安装。
第三步:读取输出
“`
traceroute to example.com (93.184.216.34), 64 hops max, 52 byte packets
1 192.168.0.1 (192.168.0.1) 1.206 ms 0.930 ms 0.799 ms
2 10.0.0.1 (10.0.0.1) 10.123 ms 10.456 ms 10.678 ms
3 isp.gateway.net (203.0.113.1) 15.789 ms 15.012 ms 15.234 ms
“`
请注意,macOS 默认最大跳数为 64,而 Windows 为 30——在追踪地理位置较远或网络目标复杂的路径时,这一点很重要。
macOS 上的 `traceroute` 关键选项
| 标志 | 功能 |
|---|---|
| — | — |
| `-n` | 禁止主机名解析,仅显示原始 IP |
| `-q <nqueries>` | 更改每跳的探测次数(默认:3) |
| `-m <max_ttl>` | 设置最大 TTL / 跳数 |
| `-w <waittime>` | 每个探测的超时时间(秒) |
| `-I` | 使用 ICMP Echo 代替 UDP(在 UDP 被阻止时有用) |
| `-T` | 使用 TCP SYN 探测(需要 root 权限;可绕过许多防火墙) |
示例——ICMP 模式绕过 UDP 过滤:
“`
sudo traceroute -I example.com
“`
示例——端口 80 上的 TCP SYN 模式(最友好的防火墙模式):
“`
sudo traceroute -T -p 80 example.com
“`
如何在 Linux 上运行 Traceroute
第一步:打开终端
按 `Ctrl + Alt + T` 或在应用程序启动器中找到终端。
第二步:如有需要,安装 `traceroute`
在许多最小化或服务器级 Linux 发行版中,`traceroute` 默认未安装。
Debian / Ubuntu:
“`
sudo apt-get install traceroute
“`
CentOS / RHEL / AlmaLinux / Rocky Linux:
“`
sudo yum install traceroute
“`
Fedora:
“`
sudo dnf install traceroute
“`
Arch Linux:
“`
sudo pacman -S traceroute
“`
第三步:执行命令
“`
traceroute example.com
“`
第四步:读取输出
“`
traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets
1 192.168.0.1 (192.168.0.1) 0.728 ms 0.457 ms 0.373 ms
2 10.0.0.1 (10.0.0.1) 9.862 ms 9.946 ms 10.123 ms
3 isp.gateway.net (203.0.113.1) 14.987 ms 14.123 ms 15.456 ms
“`
Linux 上的 `traceroute` 关键选项
| 标志 | 功能 |
|---|---|
| — | — |
| `-n` | 禁用反向 DNS 解析 |
| `-I` | 发送 ICMP Echo 探测(需要 root 权限) |
| `-T` | 发送 TCP SYN 探测(需要 root 权限) |
| `-U` | 发送 UDP 探测(默认行为) |
| `-p <port>` | 指定目标端口 |
| `-m <max_ttl>` | 最大跳数 |
| `-q <nqueries>` | 每跳的探测次数 |
| `-A` | 在每个跳点旁打印 AS(自治系统)编号 |
`-A` 标志在诊断 AS 间路由问题时特别强大——它显示每个跳点归属于哪个 ISP 或网络运营商,让您能够精确定位运营商之间的切换点导致延迟的位置。
“`
traceroute -A example.com
“`
`mtr`——Linux 上的优越替代方案
对于持续或交互式诊断,`mtr`(Matt’s Traceroute)将 `ping` 和 `traceroute` 结合为一个持续刷新的显示界面。它是网络工程师进行实时丢包分析的首选工具。
“`
sudo apt-get install mtr
mtr example.com
“`
`mtr` 随时间积累统计数据,使间歇性丢包可见——这是单次 `traceroute` 完全无法发现的。
跨平台比较:tracert 与 traceroute
| 功能 | Windows(`tracert`) | macOS(`traceroute`) | Linux(`traceroute`) |
|---|---|---|---|
| — | — | — | — |
| 默认探测协议 | ICMP Echo Request | UDP | UDP |
| 默认最大跳数 | 30 | 64 | 30 |
| 每跳默认探测次数 | 3 | 3 | 3 |
| 数据包大小(默认) | 40 bytes | 52 bytes | 60 bytes |
| ICMP 模式 | 默认 | `-I` 标志(root) | `-I` 标志(root) |
| TCP SYN 模式 | 原生不可用 | `-T` 标志(root) | `-T` 标志(root) |
| AS 编号查询 | 不可用 | 不可用 | `-A` 标志 |
| IPv6 支持 | `-6` 标志 | `traceroute6` 命令 | `-6` 标志 |
| 内置于操作系统 | 是 | 是 | 通常需要安装 |
理解 Traceroute 输出:技术详解
跳点编号
每一行代表路径中的一个路由器。跳点 1 几乎总是您的默认网关(家用路由器或局域网交换机)。跳点 2 通常是您 ISP 的第一个汇聚点。
响应时间(RTT)
每跳显示三个 RTT 值。健康的值通常随着跳点积累地理距离而逐渐增加。在特定跳点出现 50+ ms 的突然跳升且在所有后续跳点中持续存在,表明该节点存在真正的瓶颈。
解读 `* * *`(星号)
星号表示探测超时——路由器未在等待窗口内返回 ICMP 响应。这不一定是问题。许多企业路由器和骨干节点出于安全原因会降低优先级或静默丢弃 ICMP/UDP 探测数据包,同时仍正常转发流量。如果星号之后的跳点显示正常的 RTT,则路径完好。
单跳高延迟
如果跳点 7 显示 200 ms 但跳点 8 显示 25 ms,则 200 ms 的读数几乎可以肯定是跳点 7 路由器的 ICMP 速率限制——而非真正的瓶颈。该路由器以低优先级处理探测,同时以全速转发实际流量。始终评估整个路径的延迟趋势,而不是孤立地看待单个跳点。
非对称路由
Traceroute 仅映射正向路径。返回数据包可能走完全不同的路由。这意味着您观察到的延迟峰值可能源于返回路径,而非显示的正向路径。需要在两个方向(从源端和目标端)使用 `traceroute` 等工具才能获得完整的可见性。
路由环路
如果同一 IP 地址出现在多个连续跳点中,则存在路由环路。数据包在两个路由器之间被无限转发,直到 TTL 过期。这是一种配置错误,将导致到该目标的完全连接失败。
常见 Traceroute 场景及其含义
场景 1:从跳点 2 开始出现高延迟
您 ISP 的第一个汇聚点发生拥塞。这超出您的控制范围。记录带时间戳的输出,并向您的 ISP 提供证据进行联系。
场景 2:跳点 5 之后的所有跳点显示 `* * *`,但目标仍响应 ping
目标的上游路由器阻止了 ICMP 探测。切换到 TCP SYN 模式(`-T -p 443`)以穿越防火墙进行追踪。
场景 3:延迟峰值出现在意外国家的跳点
您的流量在到达本地目标之前被路由到国际——这是 BGP 路由异常。这在配置错误的任播或对等关系较差的 ISP 中很常见。
场景 4:Traceroute 完成但网站仍然缓慢
瓶颈可能在服务器端:CPU 过载、应用响应缓慢或数据库延迟。Traceroute 仅测量网络层性能。如果您在 VPS 上托管并遇到此问题,请使用 `top`、`htop` 或 `vmstat` 调查服务器资源利用率。
场景 5:Traceroute 从未完成(在特定跳点无限期停止)
防火墙正在丢弃您的探测,且目标不可达。使用 `ping` 向目标确认。如果 ping 也失败,则主机已宕机或阻止了所有 ICMP。如果 ping 成功,则只有探测协议被阻止——请切换协议。
服务器和托管诊断中的 Traceroute
在诊断基础设施与终端用户之间或服务之间的连接问题时,Traceroute 不可或缺。如果您在独立服务器上运行应用程序,从多个地理分布的观测点进行 traceroute 可以揭示延迟是否局限于特定地区或 ISP。
对于通过控制面板管理的虚拟主机环境,从客户端追踪到服务器 IP 的路由有助于区分托管层问题和网络传输问题。使用 带 cPanel 的 VPS 的管理员可以将 traceroute 数据与服务器端访问日志交叉参考,以全面了解连接投诉。
在诊断邮件投递失败或 SMTP 超时时,在调查 SPF/DKIM 记录之前,对邮件服务器 IP 运行 traceroute 是合乎逻辑的第一步。如果您使用专用的邮件托管服务,这有助于确认问题是网络层面还是配置层面。
对于在 GPU 托管上运行的机器学习推理或渲染管线等对延迟敏感的工作负载,traceroute 有助于验证客户端与 GPU 节点之间的网络路径是否经过最优路由,没有意外的传输跳点。
高级技术:在线和分布式 Traceroute
单点 traceroute 仅显示来自您计算机的路径。对于全面的网络分析:
- Looking Glass 服务器:许多 ISP 和 IXP 运营公共 looking glass 服务器,让您可以从其网络边缘运行 traceroute,从运营商角度揭示路径。
- BGP.tools / RIPE Atlas:分布式测量平台,可同时从数百个全球观测点运行 traceroute,暴露从单一位置无法发现的区域路由异常。
- PathPing(Windows):一个内置的 Windows 工具,将 `ping` 和 `tracert` 结合,对每个跳点运行持续探测并计算丢包统计数据。运行方式:`pathping example.com`
- WinMTR:`mtr` 的图形化 Windows 等效工具,提供实时每跳丢包和延迟统计数据。
实用决策矩阵:选择使用哪种工具
| 情况 | 推荐工具 |
|---|---|
| — | — |
| Windows 上的快速一次性路径检查 | `tracert -d target` |
| Linux/macOS 上的快速一次性路径检查 | `traceroute -n target` |
| 持续/实时丢包分析 | `mtr target` |
| 目标位于阻止 ICMP/UDP 的防火墙后 | `traceroute -T -p 443 target`(Linux/macOS) |
| 识别每个跳点归属的 ISP | `traceroute -A target`(Linux) |
| 从多个全球位置进行诊断 | RIPE Atlas 或 BGP.tools |
| Windows 持续丢包统计 | `pathping target` |
| 比较正向和返回路径 | 从两端运行 traceroute |
关键技术要点
- 始终首先使用 `-n` 或 `-d`,以消除 DNS 解析延迟并更快获得原始结果。
- 显示 `* * *` 的跳点并不表示路径中断——评估其后的跳点。
- 单个中间跳点的延迟通常是 ICMP 速率限制,而非真正的瓶颈。
- 遇到持续超时时,切换探测协议(ICMP、UDP、TCP SYN)——防火墙对协议具有选择性。
- 对于超过单次检查的任何诊断会话,使用 `mtr` 而非 `traceroute`。
- Traceroute 仅揭示正向路径。非对称路由需要双向分析。
- Linux traceroute 上的 `-A` 标志添加 AS 编号注释,这对于多 ISP 路由分析至关重要。
- 向 ISP 提交支持工单时,记录带时间戳的 traceroute 输出——运营商需要此数据来调查 BGP 级别的问题。
常见问题解答
为什么 traceroute 对某些跳点显示 `* * *`,但目标仍然可达?
路径上的路由器被配置为丢弃或速率限制 ICMP TTL 超时消息,同时继续正常转发流量。这是大多数企业和运营商级路由器上的一种有意为之的安全和性能策略。它并不表示数据路径上存在丢包。
Windows 上的 `tracert` 与 Linux 上的 `traceroute` 有什么区别?
核心区别在于默认探测协议:`tracert` 使用 ICMP Echo Request,而 Linux/macOS `traceroute` 使用 UDP 数据报。这意味着它们与防火墙和 ACL 的交互方式不同。Linux `traceroute` 还支持 TCP SYN 探测和 AS 编号查询,而 `tracert` 不支持。
如何通过阻止 UDP 和 ICMP 的防火墙运行 traceroute?
使用 TCP SYN 模式,并指定目标上几乎肯定开放的端口,例如端口 80 或 443:`sudo traceroute -T -p 443 example.com`。TCP SYN 探测可以穿越大多数有状态防火墙,因为它们类似于合法连接的开始。
当 traceroute 延迟突然跳升并在所有剩余跳点保持高位时意味着什么?
从特定跳点开始的持续延迟增加表明该路径点或其紧后链路存在真正的瓶颈或拥塞。这与单跳峰值不同(通常是速率限制)。持续增加意味着所有流量都在该节点或其紧后链路处被延迟。
Traceroute 能诊断网站性能缓慢吗?
Traceroute 仅诊断网络层延迟和路由问题。如果网络路径看起来正常但网站仍然缓慢,则问题在服务器端——应用处理时间、数据库查询延迟或资源耗尽。结合服务器监控工具和 traceroute 才能进行完整诊断。
