ICMP · ping 与 traceroute 原理

网络出了问题的“报警器”与“探测器”,也是面试最爱问的排查工具

ICMP 差错报告 Echo Request / Reply TTL 递增 网络排查

①ICMP 是什么:IP 的“辅助与报警系统”

ICMP(Internet Control Message Protocol,网际控制报文协议)是网络层协议,用来在 IP 主机与路由器之间传递控制信息与差错报告。它不传输用户数据,而是告诉发送方“出了什么事”。

为什么需要它

IP 协议本身是尽力而为、无反馈的:包丢了就是丢了,发送方毫不知情。ICMP 补上了这个“回话”能力。

封装位置

ICMP 报文封装在 IP 数据报里,IP 头部的协议号字段为 1。它没有端口号,也不属于 TCP/UDP。

第几层

属于网络层。虽然它像 TCP/UDP 一样被 IP 承载,但功能上是IP 的辅助协议,不是传输层。

ICMP 报文的封装位置 以太网帧头(含 MAC 地址) IP 头部(协议号 = 1 表示 ICMP) ICMP 报文(类型 + 代码 + 校验和 + 数据)
重要认知:ICMP 是网络层协议,不使用 TCP 或 UDP,也没有端口概念。所以“ping 某个端口”这种说法本身就是错的——ping 通不通与 80/443 端口开不开没有直接关系。这是面试极常见的陷阱题。

②ICMP 报文的两大类

类别作用典型类型
差错报告报文向源主机报告传输中的错误目的不可达、超时、参数错误、重定向
查询报文主动询问并获取信息(一问一答)Echo 请求/应答(ping)、时间戳请求/应答

常见 ICMP 类型与代码

TypeCode含义谁会发
00Echo Reply(回显应答)目标主机回应 ping
80Echo Request(回显请求)ping 发起方
30~15目的不可达(网络/主机/端口/协议等)路由器或目标主机
110超时(TTL 减到 0)路由器(traceroute 依赖它)
50~3重定向(有更好的路由)路由器
120~2参数错误路由器或主机
traceroute 的关键就是 Type 11(TTL 超时);ping 的基础是 Type 8 / Type 0。这两个记住就够应付大多数问题。

③ping 的原理:一问一答算 RTT

ping 利用 ICMP 的 Echo Request(Type 8)与 Echo Reply(Type 0):源主机发出请求,目标主机收到后原样返回应答。源主机通过两者的时间差算出 RTT(往返时延)。

ping:Echo Request → Echo Reply,时间差即 RTT 源主机 192.168.1.10 目标主机 8.8.8.8 Echo Request(Type 8):记录发送时间 t1 Echo Reply(Type 0):记录收到时间 t2 RTT = t2 − t1 报文里带标识符与序号,用于配对请求与应答、识别丢包

一次 ping 输出怎么读

$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=117 time=15.3 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=14.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=16.1 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 3 packets received, 25.0% packet loss
round-trip min/avg/max/stddev = 14.8/15.4/16.1/0.5 ms
字段含义
icmp_seq序号。上例缺了 2 → 说明第 3 个包丢了(25% 丢包)。
ttl应答报文剩余 TTL。可用于粗略推断对方经过的跳数(初始值常见 64/128/255)。
time本次 RTT。
packet loss丢包率,网络质量的关键指标。
TTL 反推跳数:如果收到的 TTL 是 117,而对方初始 TTL 大概率是 128(Windows)或 64(Linux),那么 128 − 117 = 11,说明大约经过了 11 跳。

④traceroute 的原理:靠 TTL 递增“套出”每一跳

核心技巧:IP 报文每经过一个路由器,TTL 减 1;当 TTL 减到 0 时,路由器会丢弃该报文,并向源主机发一个 ICMP 超时报文(Type 11)——而这个报文里就带着该路由器的 IP。
于是:依次发 TTL=1, 2, 3, ... 的探测包,就能一跳一跳地拿到沿途每个路由器的 IP。
traceroute:TTL 从 1 开始递增,每跳返回 ICMP 超时 源主机 路由器 R1 路由器 R2 目标主机 TTL=1 TTL 归零 → ICMP 超时(拿到 R1 的 IP) TTL=2 到 R2 时 TTL 归零 → ICMP 超时(拿到 R2 的 IP) TTL=3 到达目标 → 返回 ICMP 端口不可达 / Echo Reply → 探测结束 每跳通常发 3 个探测包,因此会看到 3 个延时值
实现差异(常考):
  • Windows tracert:发的是 ICMP Echo Request,逐步增大 TTL。
  • Linux/macOS traceroute:默认发的是 UDP 报文(目的端口用较大的不常用端口),目标主机收到后返回 ICMP 端口不可达(Type 3, Code 3)作为结束信号。
两者中间跳都依赖 ICMP TTL 超时(Type 11)。
$ traceroute -n 8.8.8.8
 1  192.168.1.1      1.2 ms   1.1 ms   1.3 ms
 2  100.64.0.1       8.4 ms   7.9 ms   8.1 ms
 3  61.135.169.1     9.2 ms   9.5 ms   9.0 ms
 4  *  *  *                          # 星号:该跳设备不回应 ICMP,不代表故障
 5  8.8.8.8         15.1 ms  14.8 ms  15.3 ms
星号(*)不代表网络断了。很多运营商路由器为了安全和性能不回应 ICMP,所以 traceroute 拿不到它们的 IP。判断是否真的有问题,要看最终能否到达目标以及延时是否异常。

⑤ping 与 traceroute 的区别

对比项pingtraceroute
目的测是否可达 + RTT + 丢包率看经过了哪些跳,定位在哪一跳出问题
依赖ICMP Echo Request / ReplyTTL 递增 + ICMP 超时 / 端口不可达
输出通断、延时、丢包逐跳 IP 与延时
典型用途“能不能连上?”“卡在第几跳?”

⑥ping 不通,怎么一步步排查

  1. ping 127.0.0.1 → 验证本机 TCP/IP 协议栈是否正常。不通说明系统网络栈有问题。
  2. ping 本机 IP → 验证网卡是否正常工作。
  3. ping 同网段其他主机 → 验证局域网链路与交换机。不通可能是网线、VLAN、交换机端口问题。
  4. ping 网关 → 验证到出口路由器的链路。不通检查网关配置、ARP 是否正常。
  5. ping 外网 IP(如 8.8.8.8) → 验证出口与运营商链路。不通可能是 NAT、路由、运营商问题。
  6. ping 域名(如 google.com) → 验证 DNS 解析。IP 能通但域名不通 = DNS 问题。
  7. traceroute 目标 → 定位具体卡在哪一跳。
关键区分:
• 能 ping 通 IP 但打不开网页 → 多半是应用层/端口/防火墙问题(ping 用的是 ICMP,与 80/443 端口无关)。
• 能 ping 通 IP 但 ping 不通域名 → DNS 解析问题。
• ping 显示“Destination Host Unreachable” → 通常是同网段 ARP 没解析到或本机路由表无匹配项。
# 常用组合排查命令
ip addr / ifconfig          # 看本机 IP 与网卡状态
ip route / route -n         # 看路由表(有没有到目标的路由)
ip neigh / arp -a           # 看 ARP 缓存(网关 MAC 解析到没)
nslookup / dig 域名          # 测 DNS 解析
telnet host port / nc -zv   # 测 TCP 端口是否开放(ping 测不了这个)
traceroute host             # 看卡在第几跳

⑦面试高频追问

Q1:ICMP 是哪一层协议?
网络层。它封装在 IP 数据报中(协议号 1),是 IP 的辅助协议,用于差错报告与控制消息。不属于传输层,也没有端口概念。
Q2:ping 用的是 TCP 还是 UDP?
都不是。ping 用的是 ICMP 的 Echo Request(Type 8)与 Echo Reply(Type 0),走网络层,不涉及 TCP/UDP 端口。
Q3:为什么能 ping 通,但服务访问不了?
ping 通只说明 IP 层可达(ICMP 没被禁)。服务访问不了通常是传输层或应用层问题:端口未监听、防火墙拦截、服务进程异常。ping 通 ≠ 端口开放。
Q4:traceroute 的原理是什么?
利用 TTL 递增:每经过一跳 TTL 减 1,减到 0 时路由器丢弃报文并回 ICMP 超时(Type 11),其中携带该路由器 IP。依次发送 TTL=1,2,3... 的探测包,即可逐跳拿到路径。
Q5:traceroute 里出现 * * * 是什么意思?
该跳设备在超时时间内没有回应 ICMP(很多路由器为安全/性能禁用了 ICMP 响应)。不代表故障,需结合最终是否到达目标判断。
Q6:Windows 的 tracert 和 Linux 的 traceroute 有区别吗?
有。tracert 发 ICMP Echo Request;Linux traceroute 默认发 UDP 报文,靠目标返回 ICMP 端口不可达判定结束。中间跳都依赖 ICMP TTL 超时。
Q7:ping 的输出里 TTL 有什么用?
可粗略推断经过的跳数:用常见初始值(64/128/255)减去收到的 TTL。同时 TTL 也能粗略判断对方操作系统类型(Linux 常见 64,Windows 常见 128)。
Q8:为什么有些网站禁 ping?
禁用 ICMP Echo 可以减少被扫描发现的概率、降低 ICMP Flood 攻击面。所以禁 ping 不等于服务器宕机,排查时要用 telnet/nc 测端口。

✓一句话速记

ICMP 是网络层的报警与控制协议(协议号 1、无端口);ping 靠 Echo 请求/应答测可达与 RTT;traceroute 靠 TTL 递增触发 ICMP 超时,逐跳拿到路由路径。排查顺序:本机 → 网卡 → 同网段 → 网关 → 外网 IP → 域名 → traceroute 定位。