tracert 到底是怎么工作的?这篇文章带你彻底搞懂

部署运行你感兴趣的模型镜像

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部


你可能经常在排查网络问题时敲下这行命令:

tracert www.baidu.com

几秒之后,一串类似下面的东西滚出来:

1 &nbsp; &nbsp; <1 ms &nbsp; &nbsp;<1 ms &nbsp; &nbsp;<1 ms &nbsp; &nbsp;192.168.1.1
2 &nbsp; &nbsp; 3 ms &nbsp; &nbsp; 4 ms &nbsp; &nbsp; 3 ms &nbsp; &nbsp; 10.1.1.1
3 &nbsp; &nbsp; 10 ms &nbsp; &nbsp;11 ms &nbsp; &nbsp;12 ms &nbsp; &nbsp;123.125.81.1
...

大部分人看着这些跳数和 IP 地址,大致能判断走的路径。

但你知道背后到底怎么实现的吗?

为啥能一跳跳地追?每一跳到底发了几个包?是不是 ICMP 协议?

今天咱就来拆开说说。


一、tracert 的本质是什么?

一句话概括:

tracert 是通过设置 IP 包的 TTL 值,一跳跳触发路由器返回 ICMP 超时报文,从而推测出整条路径上的每个节点。

简单来说,它并不是什么“神奇指令”,而是借用了 IP 协议里的一个机制:

TTL 是啥?

TTL 全称是&nbsp;Time To Live(生存时间),是 IP 报文头里的一个字段。

  • 它的作用是防止数据包在网络里无限循环
  • 每经过一个三层设备(如路由器),TTL 就会减1。
  • 当 TTL 减为 0 时,当前设备就会丢弃这个包,并返回一个&nbsp;ICMP 类型为11的“超时”响应

也就是说,TTL 本质上是个“跳数倒计时器”

tracert 的核心思路就是:

  • 我先发一个 TTL=1 的包 → 第一个路由器收到后 TTL=0,返回“超时”响应
  • 然后我发 TTL=2 的包 → 经过第一跳,TTL=1 → 进入第二跳后 TTL=0,被丢弃 → 第二跳返回 ICMP
  • 以此类推...

这样一来,每一跳的设备都会被“激怒”,从而跳出来暴露它的 IP。


二、tracert 每一跳到底发几个包?

这是很多人没注意的小细节:

Windows 下:

默认每一跳发&nbsp;3 个探测包(其实就是 3 次 TTL 相同的数据包),目的是防止因丢包看不到路径,显示如下:

3 &nbsp; &nbsp;15 ms &nbsp; &nbsp;14 ms &nbsp; &nbsp;16 ms &nbsp; 10.10.10.1

这 3 个数字分别是&nbsp;3 次响应时间

如果你看到的是:

4 &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp;Request timed out.

可能是:

  • 当前节点设置了丢弃 ICMP
  • 该路径存在防火墙或 ACL 限制
  • 路由黑洞、不通

Linux 下(使用&nbsp;traceroute):

默认也是每跳发 3 个探测包,但更灵活:

  • 可以指定协议(ICMP / UDP / TCP SYN)
  • 可以指定端口范围
  • 默认使用&nbsp;UDP&nbsp;探测端口,并期待回一个端口不可达的 ICMP 报文(type 3, code 3)


三、tracert 和 ping 属于 ICMP 协议吗?

这是一个很多人有点混淆的点,我们来区分清楚:

所以说:

  • ping 是标准的 ICMP 协议应用
  • tracert 是利用 IP 层 TTL 行为 + ICMP 返回来“逼问出”每一跳的 IP
  • Windows 用的是 ICMP Echo 作为“探测包”内容
  • Linux 用的是 UDP/ICMP/TCP 三选一(看你怎么配置)


四、为什么有时候 tracert 跳着跳着就 timeout 了?

很常见,比如:

6 &nbsp; &nbsp;25 ms &nbsp; &nbsp;28 ms &nbsp; &nbsp;27 ms &nbsp; 10.1.1.1 &nbsp;
7 &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; Request timed out. &nbsp;
8 &nbsp; &nbsp;45 ms &nbsp; &nbsp;47 ms &nbsp; &nbsp;49 ms &nbsp; 220.181.57.1

这通常是:

  • 中间设备拒绝返回 TTL 超时报文(很多运营商骨干路由器配置了防 ICMP)
  • 该跳设备故障但还有旁路可通
  • ACL/防火墙策略丢弃了非业务相关的数据包

注意:timeout ≠ 不通,只能说那一跳不配合你玩 TTL 这套。


五、tracert 实战价值有哪些?

非常多,老网工排查必备工具之一:

路由路径排查

  • 判断访问目标地址到底经过哪些设备
  • 是从 A 出口走的,还是 B 出口走的
  • 哪个链路在兜圈子(发现三层环路)

网络性能诊断

  • 哪一跳延迟飙升?是不是出口/运营商链路压力太大?
  • 某一跳之后全部 timeout,是不是 NAT 或防火墙在搞鬼?

ACL/NAT 排查

  • tracert 被“断崖式”中断,说明 ICMP/TTL 响应被某处阻断
  • 可反查是否某跳设备配置了丢弃或限速 ICMP 报文


六、命令变体推荐(Windows / Linux / 华为设备)

Windows:

tracert -d www.baidu.com &nbsp; ← 不解析域名,加快速度 &nbsp;
tracert -h 10 1.1.1.1 &nbsp; &nbsp; &nbsp;← 限制最大跳数为10

Linux:

traceroute -I 8.8.8.8 &nbsp; &nbsp; &nbsp;← 用 ICMP 发包 &nbsp;
traceroute -T www.baidu.com ← 用 TCP SYN 代替 UDP

华为设备:

display traceroute www.baidu.com

支持类似参数配置,甚至可抓包观察 ICMP 响应。


一句话总结

tracert 并不是“问路工具”,而是“引蛇出洞”。

它靠着设置 TTL,诱使网络设备“暴露自己”返回 ICMP 报文,才让我们看到每一跳的路径。

网络排障中,一定要配合&nbsp;ping、display ip routing-table、display interface&nbsp;等命令一起用,才能真正还原“数据到底走了哪”。


原创:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### Traceroute 与 Tracert 的功能和使用场景差异 #### 功能对比 Traceroute 和 Tracert 是两种用于网络路径追踪的工具,其核心功能是确定数据包从源到目标之间的路径。以下是两者在功能上的具体差异: - **实现方式**: - Traceroute:通过发送有不同 TTL(Time To Live)值的 ICMP 或 UDP 数据包来逐步探测路径中的每一跳[^1]。 - Tracert:与 Traceroute 类似,但主要运行于 Windows 系统中,并使用 ICMP 协议进行路径探测[^2]。 - **协议支持**: - Traceroute:支持多种协议,包括 ICMP 和 UDP,并允许用户选择特定协议(如 TCP)以适应不同的网络环境[^1]。 - Tracert:仅支持 ICMP 协议,因此在某些受限环境中可能无法正常工作[^2]。 - **权限需求**: - Traceroute:由于涉及原始套接字操作,通常需要超级用户权限(如 Linux 下的 `sudo`)[^1]。 - Tracert:在 Windows 系统中运行时,一般不需要额外权限即可完成基本功能。 - **输出信息**: - Traceroute:提供详细的路径信息,包括每跳的 IP 地址、主机名以及往返时间(RTT)。 - Tracert:同样显示路径上的每个路由器 IP 地址及延迟时间,但在某些情况下可以禁用主机名解析以加快速度。 #### 使用场景分析 - **复杂网络诊断**: - Traceroute:适用于需要深入了解网络拓扑结构或测试特定协议连通性的场合。例如,在排查基于 TCP 的应用问题时,可以选择相应的协议选项。 - **日常监控与简单故障排查**: - Tracert:适合普通用户快速检查互联网连接状态或定位简单路由问题。由于其易用性和较低的权限要求,在家庭或小型办公环境中更为常用。 #### 示例代码 以下是一个简单的 Python 脚本,模拟了 traceroute 的基本功能: ```python import socket import struct def send_icmp_echo_request(dest_addr, ttl): """ 模拟发送 ICMP Echo Request 数据包。 参数: dest_addr (str): 目标地址 ttl (int): 数据包的 TTL 值 返回: str: 当前跳点的 IP 地址 """ try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_ICMP) sock.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl) sock.sendto(b'\x08\x00\x7d\x4b\x00\x00\x00\x00', (dest_addr, 33434)) current_addr = None current_name = None try: _, curr_addr = sock.recvfrom(512) current_addr = curr_addr[0] try: current_name = socket.gethostbyaddr(current_addr)[0] except socket.herror: current_name = current_addr except socket.error: pass finally: sock.close() return current_addr or "*" except Exception as e: return "*" # 示例调用 destination = "www.google.com" for ttl in range(1, 30): addr = send_icmp_echo_request(destination, ttl) print(f"{ttl}: {addr}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值