当前位置:首页 > 技术 > 正文内容

使用traceroute命令追踪网络路径

访客 技术 2026年9月6日 1

traceroute 是一个在网络诊断中广泛使用的命令行工具,主要功能是记录 IP 数据包从源主机到目标主机所经过的所有路由器(跃点)。它通过发送一系列特殊的数据包实现这一目的,这些数据包的"生存时间" (Time-To-Live, TTL) 值从 1 开始逐跳递增。当数据包到达某个路由器时,如果其 TTL 值变为 0,该路由器会向源主机返回一个 ICMP 时间超时(Time Exceeded)消息。traceroute 捕捉这些 ICMP 响应,从而识别出路径上的每一个路由器。

工具的工作原理如下:

  1. 发送第一个探测包,将 TTL 设为 1。
  2. 路径上的第一个路由器收到此包后,会将 TTL 减 1。由于 TTL 变为 0,该路由器会向源主机发送一个 ICMP 时间超时消息。
  3. 源主机记录下第一个路由器的 IP 地址及其往返时间 (RTT)。
  4. 接着发送下一个探测包,将 TTL 设为 2,以此类推。
  5. 这个过程持续进行,直到数据包成功到达目标主机(此时目标主机通常会返回一个 ICMP 端口不可达或 TCP RST 响应),或者达到预设的最大跳数(默认为 30 跳)。

traceroute 默认会为每个 TTL 值发送三个探测包,并在终端显示每一跳的序号、路由器 IP 地址(或主机名,如果可解析)以及三个探测包各自的往返时间。如果某个探测包在默认的 5 秒等待时间内没有收到响应,则会用 * 表示。如果同一跳的探测响应来自不同的网关,则会分别列出它们的地址。

命令语法

traceroute [-46dFITUnreAV] [-f first_ttl] [-g gate,...] [-i device]
           [-m max_ttl] [-p port] [-s src_addr] [-q nqueries]
           [-N squeries] [-t tos] [-l flow_label] [-w waittime]
           [-z sendwait] [-UL] [-D] [-P proto] [--sport=port] [-M method]
           [-O mod_options] [--mtu] [--back] host [packet_len]

常用参数说明

  • -4, --ipv4: 强制 traceroute 使用 IPv4 协议进行路径追踪。
  • -6, --ipv6: 强制 traceroute 使用 IPv6 协议进行路径追踪。在未明确指定时,traceroute 会尝试解析目标主机名,并根据解析结果自动选择合适的协议。如果一个主机名同时解析出 IPv4 和 IPv6 地址,则 traceroute 默认会优先选用 IPv4。
  • -I, --icmp: 使用 ICMP ECHO 请求作为探测包类型。
  • -T, --tcp: 使用 TCP SYN 包作为探测包类型。
  • -d, --debug: 启用套接字层面的调试输出,前提是内核支持此功能。
  • -F, --dont-fragment: 禁止对探测数据包进行分片。对于 IPv4,此选项还会设置 DF (Don't Fragment) 位,指示中间路由器不要对数据包进行远程分片。通过调整 packet_len 参数改变探测包大小,可手动获取网络路径上的 MTU 信息。此功能在 Linux 内核 2.6.22 及更高版本中才能正常工作。
  • -f first_ttl, --first=first_ttl: 指定探测开始的 TTL 值,默认为 1。
  • -g gate,..., --gateway=gate,...: instructs traceroute to add IP source routing options to the outgoing packet that tells the network to route the packet through the specified gateways (most routers have disabled source routing for security reasons). 通常可以指定多个网关,以逗号分隔。对于 IPv6,格式为 num,addr,addr,...,其中 num 是路由头类型(默认为类型 2)。
  • -i device, --interface=device: 指定 traceroute 应该通过哪个网络接口发送数据包。默认情况下,接口是根据路由表自动选择的。
  • -m max_ttl, --max-hops=max_ttl: 设定 traceroute 探测的最大跳数(即最大 TTL 值),默认是 30 跳。
  • -N squeries, --sim-queries=squeries: 指定同时发送的探测报文数量。同时发送多个探测可以显著提高路由追踪的速度,默认值为 16。请注意,某些路由器和主机可能会对 ICMP 消息进行速率限制,这种情况下设置过大的值可能导致响应丢失。
  • -n: 在显示 IP 地址时,不尝试将其解析为主机名。
  • -p port, --port=port: 对于 UDP 追踪,指定 traceroute 将使用的目的端口号,该端口号会随每个探测递增。对于 ICMP 追踪,指定初始的 ICMP 序列值(每个探测也会递增)。对于 TCP 和其他协议,此参数仅指定要连接的(恒定)目标端口。使用 tcptraceroute 封装器时,-p 用于指定源端口。
  • -q nqueries, --queries=nqueries: 设置每个跃点发送的探测数据包数量,默认值为 3。
  • -r: 绕过常规路由表,直接将数据包发送到直接连接网络上的主机。如果目标主机不在直接连接的网络上,则会返回错误。此选项可用于通过没有路由的接口对本地主机执行 ping 操作。
  • -s src_addr, --source=src_addr: 选择一个备用源 IP 地址。请注意,必须选择一个接口的现有地址,默认情况下使用传出接口的地址。
  • -t tos, --tos=tos: 对于 IPv4,设置服务类型 (TOS) 和优先级值。常用的值包括 16(低延迟)和 8(高吞吐量)。要使用某些 TOS 优先级值,可能需要超级用户权限。对于 IPv6,此参数用于设置流量类别 (Traffic Class) 值。
  • -w waittime, --wait=waittime: 设置等待每个探测响应的最长时间,单位为秒,默认为 5.0 秒。
  • -z sendwait, --sendwait=sendwait: 设置探测包之间的最小发送间隔时间。默认值为 0。如果此值大于 10,则表示毫秒;否则为秒。也支持浮点数值。当某些路由器对 ICMP 消息实行速率限制时,此选项非常有用。
  • -e, --extensions: 显示 ICMP 扩展字段。通用格式为 CLASS / TYPE,后跟十六进制转储。MPLS(多协议标签交换)数据会被解析,格式为 MPLS:L=label,E=exp_use,S=stack_bottom,T=TTL (多个对象以 / 分隔)。
  • -A, --as-path-lookups: 在路由注册表中执行 AS (Autonomous System) 路径查询,并将结果直接打印在相应地址之后。
  • -M name, --module=name: 使用指定的模块(内置或外部)执行 traceroute 操作。大多数方法都有其快捷方式,例如 -I 等同于 -M icmp
  • -O OPTS,..., --options=OPTS,...: 为 traceroute 模块指定特定于模块的选项 OPTS。允许使用多个选项,以逗号分隔。例如,如果 OPTShelp,则会打印帮助信息。
  • --sport=num: 为传出数据包设置源端口号。此选项隐含 -N 1
  • --fwmark=num: 为传出数据包设置防火墙标记。
  • -U, --udp: 使用 UDP 协议追踪路由到特定端口,而不是每个探测递增端口。默认端口为 53。
  • -UL: 使用 UDP LITE 协议追踪路由,默认目标端口为 53。
  • -D, --dccp: 使用 DCCP 请求追踪路由,默认端口为 33434。
  • -P prot, --protocol=prot: 使用指定协议的原始数据包进行路由追踪。
  • --mtu: 沿追踪路径发现 MTU (Maximum Transmission Unit)。此选项隐含 -F -N 1
  • --back: 推断并打印反向路径中的跳数,如果与正向路径不同。
  • -V, --version: 输出版本信息。
  • --help: 输出帮助信息。

实践示例

追踪到 www.google.com 的网络路径:

traceroute www.google.com

强制使用 IPv4 协议追踪到 www.google.com 的路径:

traceroute -4 www.google.com

指定从 TTL 值为 3 开始进行探测:

traceroute -f 3 www.google.com

在结果输出中不解析 IP 地址为域名:

traceroute -n www.google.com

设置每个跃点仅发送一个探测数据包:

traceroute -q 1 www.google.com

指定探测数据包的完整长度为 100 字节(默认通常为 60 字节):

traceroute www.google.com 100

设置目标端口号为 20292(默认通常为 33434):

traceroute -p 20292 www.google.com

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。