ICMP(Internet 控制报文协议)属于网络层协议,封装在 IP 数据包内,用于网络设备之间传递差错报告、状态与控制信息,本身不传输业务数据,是排查网络连通性、延迟、路径故障的核心,ping、traceroute/tracert 底层全部基于 ICMP 实现。
ICMP 两类核心报文
差错报告报文:设备遇到异常,主动回告出错原因
询问报文:主动发起请求,获取对方网络状态

典型故障检测场景
1. ping:测试连通性、丢包、时延
使用 ICMP 回送请求(Echo‑Request) 和 回送应答(Echo‑Reply)
源主机发送 ICMP Echo‑Request 给目标 IP
目标正常可达,返回 Echo‑Reply;源计算往返时间 RTT、统计丢包
现象解读:
能收到应答:三层 IP 连通正常,但不代表端口通(ICMP 与 TCP/UDP 端口无关)
请求超时:可能防火墙拦截 ICMP、目标不可达、链路丢包
部分系统 / 服务器防火墙禁止 ICMP,会 ping 不通,但业务 TCP 端口可以通
2. tracert /traceroute:定位哪一跳网络故障
利用 ICMP 时间超过(Time‑Exceeded) 报文 + TTL 机制
数据包 TTL(生存时间)从 1 开始,每经过一台路由器 TTL‑1,TTL=0 路由器丢弃报文,并返回ICMP 超时报文给源主机
tracert 依次发送 TTL=1、2、3… 的数据包,拿到每一跳路由器的回复,完整打印出整条路由路径
故障定位价值:看在哪一跳开始全部请求超时,故障点就在这一跳设备 / 链路
Windows:
tracert ip;Linux:traceroute ip
3. ICMP 差错报文,定位各类网络故障
重点:目标不可达细分
网络不可达:路由器没有目标网段路由,路由缺失
主机不可达:路由可达,但目标主机离线、ARP 解析失败
端口不可达:UDP 访问一个不存在端口时返回;TCP 不会用 ICMP,直接 RST 复位

ICMP 排查故障的局限性
ICMP 可以正常,不代表 TCP/UDP 业务可用:防火墙放行 ICMP,但封禁业务端口;
很多防火墙、云安全组会丢弃 ICMP 报文:ping、tracert 失效,但业务正常;
ICMP 只工作在 IP 层,无法检测应用层问题(例如服务宕机、HTTP 报错);
部分中间设备对 ICMP 报文做限速,会出现 ping 丢包,但业务流量正常的假象。
简单总结工作逻辑
ICMP 就相当于网络世界的 “故障回执单”:
我发探测包问对方在不在(ping)
沿路路由器遇到报错,把错误原因写在 ICMP 报文中回传给源主机
通过回执,可以判断:通不通、延迟多大、丢不丢包、故障出现在路径第几跳、是路由问题还是主机下线。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢