实验概述
本实验通过 ping 和 tracert 两个工具,验证 ICMP 协议在网络连通性检测中的核心作用。
一、Ping 实验
ping 是基于 ICMP(Internet Control Message Protocol,互联网控制报文协议) 实现的网络诊断工具。工作时,ping 向目标主机发送 ICMP Echo 请求报文,若目标主机在线且允许 ICMP,则返回 ICMP Echo 回复报文,借此判断两台主机间的 IP 层连通性。
ping命令首先会构建一个固定格式的ICMP请求数据包echo request,发给远端计算机 ;
远端计算机收到后,构造一个ICMP应答包echo reply,发送回本机;
本机收到应答包后,即可判断出目的主机是否开机,并根据发送包和应答包携带的时间信息计算出网络延迟。
1.1 TTL工作原理
TTL(Time To Live) 是 IP 报文头部字段,在现代网络里代表路由跳数—— 数据包每经过一台路由器转发,TTL 自动 -1;TTL 减到 0 时,设备直接丢弃报文,防止路由环路。
- 当路由器收到数据包,转发前先把 TTL
-1; - 若递减后 TTL = 0:路由器不再转发数据包,直接丢弃,并向源主机返回一条 ICMP 超时(Time Exceeded) 回应包;
- 若递减后 TTL > 0:正常转发给下一跳设备。
你在 Ping 结果里看到的 TTL=xx,不是你本机发出去的请求包剩余 TTL,而是目标服务器回传给你的应答包,到达本机时剩下的 TTL
步骤 1:本机发送请求包
你的 Windows 电脑构造 ICMP 请求包,Windows 系统默认出站初始 TTL = 128。
数据包一路路由转发,每过一跳 TTL 减 1,最终到达目标节点。
这一段的剩余 TTL 不会展示在 Ping 结果中。
步骤 2:目标主机生成应答包(最关键环节)
目标服务器 / CDN 节点收到请求后,会新建一个全新的 IP+ICMP 应答包,不会沿用原请求包的 TTL
这个新应答包的初始 TTL,由目标设备的操作系统决定,这是判断对方系统的依据:
- Linux / 云服务器 / CDN 节点:默认初始 TTL = 64(互联网绝大多数网站、CDN 都是这个值)
- Windows 服务器:默认初始 TTL = 128
- 交换机、防火墙等网络设备:默认初始 TTL = 255
步骤 3:应答包回传 + TTL 递减
应答包从目标节点发回你的电脑,沿途每经过一台路由器,TTL 继续逐跳 -1。
步骤 4:本机展示最终 TTL
最终你看到的 TTL,就是这个回程应答包经过多跳转发后,剩余的数值。
1.2 使用域名测试
操作步骤:按下 Win + R,输入 cmd 打开命令提示符窗口。
关键知识点:
ping命令不直接识别域名,首先通过 DNS 解析 将域名www.baidu.com转换为公网 IP183.2.172.177。www.a.shifen.com是百度的真实域名,www.baidu.com是其 CNAME 别名,DNS 解析后会显示实际主机名。- 「32 字节的数据」:Windows
ping默认发送 32 字节 填充数据,用于完整性校验。
返回字段解析:
| 字段 | 含义 |
|---|---|
来自 183.2.172.177 的回复 |
目标主机收到 ICMP Echo 请求并成功响应,说明 IP 层连通正常 |
字节=32 |
响应报文数据部分与发送数据一致,验证传输完整性 |
时间=49ms |
往返时间(RTT):请求发出到收到响应的时间,反映网络延迟 |
TTL=47 |
生存时间(Time To Live):每经一个路由器减 1,防止环路。本例初始 TTL=64(Linux 默认),经过 64-47=17 个路由到达本地 |
1.2 使用公网服务器测试
注意:远端服务器默认关闭 ICMP 响应,原因如下:
- 防 DDoS:ICMP 洪水攻击可耗尽带宽;
- 隐藏存活:禁 ICMP 后攻击者无法通过 ping 探测服务器在线状态。
二、Tracert 实验
tracert(Windows,Linux 下为 traceroute)利用 ICMP + TTL 递减机制,探测数据包从源主机到目标主机所经历的完整路由路径(各跃点)。
1.1 tracert 原理介绍
步骤 1:发送 TTL=1 的包,拿到第 1 跳路由器 IP
Tracert 程序首先发送 TTL 为 1 的请求数据包,该包经过第一个路由设备后 TTL 减 1 为 0,第一个路由设备就将给源主机发回 “ICMP 已超时” 的消息;源主机的 tracert 命令通过该消息中的 IP 信息就获得了第一个路由设备的 IP。
通俗拆解:
- 你构造一个「只能走 1 跳」的 ICMP 包(TTL=1),发给目标主机;
- 第 1 跳路由器(比如你家的小米路由器
192.168.31.1)收到包,先把 TTL 减 1 → 变成 0; - 路由器一看 TTL=0:“这个包不能再转发了,丢了吧!”,同时给你发一条 「ICMP 超时包」,包里写着路由器自己的 IP 地址;
- tracert 收到这个超时包,立刻记下:第 1 跳是
192.168.31.1。
步骤 2:TTL 依次 + 1,依次拿到第 2、3、4… 跳 IP
在随后的每次发送过程将 TTL 依次递增 1,直到目标响应或 TTL 达到最大值,从而确定从源主机到目的主机中间的路由。
通俗拆解:
- 第 2 轮:发送 TTL=2 的包 → 第 1 跳 TTL 减 1 变 1,转发给第 2 跳;第 2 跳收到后 TTL 减 1 变 0,发回超时包 → 你拿到第 2 跳 IP(比如你输出里的
172.16.0.1); - 第 3 轮:发送 TTL=3 的包 → 走到第 3 跳超时,拿到第 3 跳 IP;
- …… 以此类推,TTL 每 + 1,就能 “逼出” 下一跳路由器的超时包,拿到它的 IP。
步骤 3:停止探测条件
场景 1:包成功到达目标主机:
当 TTL 足够大时(比如你输出里的 TTL=8),包一路转发,TTL 还没减到 0 就到达了目标主机(117.177.133.107)。
目标主机收到 ICMP 请求包后,不会发「超时包」,而是直接回一个 「ICMP 应答包」(和 ping 的回包一样)。
tracert 收到这个应答包,立刻知道:“到终点了!不用再发了”,停止探测。
场景 2:TTL 达到最大值(比如 Windows 默认 30 跳)
如果 TTL 加到 30 还没到目标,说明要么目标不存在,要么出现了路由环路(包在几个路由器之间死循环),tracert 会强制停止,显示 “跟踪完成”。
1.2 ping 和 tracert TTL的区别
ping靠应答包 TTL 算出的:回程(目标 CDN → 本机)跳数tracert主动探测的:去程(本机 → 目标 CDN)跳数
互联网骨干网、城域网普遍存在 非对称路由:
数据包去的时候走一批路由器、线路、网关;回来的时候走另一批设备和线路,来回路径不一样,跳数自然不同。
ping 112.45.115.221 # 确认目标IP(豆包CDN节点)
tracert 112.45.115.221 # 探测到该IP的去程路径
1.2使用域名测试
工作原理:
- TTL=1 探测:发送 TTL=1 的 ICMP Echo 请求,第一跳路由器将 TTL 减为 0 后丢弃数据包,返回 ICMP 超时报文(类型 11),由此获知第一跳 IP 和延迟;
- TTL 递增探测:逐步增加 TTL 值,逐跳探测直至到达目标;
- 到达目标:目标主机返回 ICMP Echo 回复(类型 0),追踪结束。
2.1 使用公网服务器测试
IP = 117.72.201.198
最终成功追踪到目标服务器(京东云)的数据中心路径。
三、简单扩展
tracert 只是最基础的工具,VPS 运维中更常用的工具,比如traceroute(Linux)、mtr、tcptrace,底层都是TTL 递增 + 触发 ICMP/TCP 超时,只是包的类型和统计方式不同:
| 工具 | 包类型 | 核心优势 | 原理和tracert的关系 |
|---|---|---|---|
tracert(Windows) |
ICMP Echo Request | 系统自带,无需额外安装 | 完全一致,用 ICMP 包触发超时 |
traceroute(Linux) |
默认 UDP 包,也支持 ICMP/TCP 模式 | 跨平台通用,可切换包类型 | 逻辑一致,只是用 UDP 包触发超时 |
mtr(Linux/Windows) |
ICMP/UDP 包 | 持续探测,统计每一跳的丢包率、延迟,是 VPS 排查神器 | 核心逻辑和tracert一致,只是增加了持续发包和统计功能 |
tcptrace/tcptraceroute |
TCP SYN 包 | 绕过运营商 ICMP 拦截,直接追踪 TCP 端口路径 | 用 TCP 包触发超时,原理还是 TTL 递增 |
traceroute 223.87.27.250
223.87.27.250 成都的一个IP节点路由为例。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com