ICMP 协议原理(Internet控制报文协议,网络层附属协议)
一、基础定位
ICMP 依附IP协议(协议号1),属于网络层,不独立封装链路头,报文封装在IP数据报的数据部分。
作用:差错报告 + 网络探测 + 控制通知,IP本身无差错纠错、报错能力,靠ICMP补全。
二、报文结构
IP首部 | ICMP首部(1B类型 + 1B代码 + 2B校验和 + 可变字段) | 原始IP报文前8字节
- 类型(Type):报文大类(差错/查询)
- 代码(Code):细分原因
- 校验和:校验整个ICMP报文
- 数据区:出错时携带原IP首部+原TCP/UDP头部前8字节(方便上层定位端口、进程)
三、两大分类:差错报文 / 查询报文
1. ICMP差错报告报文(被动触发,出错才发)
差错报文不会为ICMP报文、广播报文产生回复,防止风暴
- 目的不可达(Type=3)
- Code0:网络不可达;Code1:主机不可达;Code3:端口不可达
场景:目标主机关机、端口没开、路由无条目,路由器/目标主机回包。
- 源站抑制(Type=4)
路由器缓冲区满、拥塞,通知源主机降速发包(现在基本弃用,由TCP拥塞控制实现)。 - 重定向(Type=5)
网关告知主机:存在更优路由,让主机更新本地路由表。 - 超时(Type=11)
- TTL耗尽(traceroute原理);分片重组超时。
2. ICMP查询报文(主动收发,一问一答)
- 回显请求/应答(Type8请求 / Type0应答)→ ping核心
- ping发ICMP Echo Request,目标回Echo Reply,用来连通性+时延探测。
- 时间戳请求/应答(Type13/14):早期主机时钟同步,现已淘汰。
四、两个经典应用原理
1)ping 原理
- 源主机构造 ICMP Type8请求,封装IP发出;
- 目标收到后,构造 ICMP Type0应答原路返回;
- 源计算往返RTT、丢包率。
Linux/Windows ping 底层全靠ICMP。
2)traceroute(路由追踪)原理(TTL+ICMP超时)
- 第1跳:IP包TTL=1,经过第一个路由器TTL-1=0 → 丢弃,返回ICMP Type11超时报文,拿到一跳IP;
- 第2跳:TTL=2,第二台路由TTL变0返回超时;
- 持续递增TTL,直到抵达目标主机,目标返回端口不可达/echo应答,追踪结束。
五、关键特性
- ICMP基于IP,不可靠:ICMP报文出错不会再发ICMP报错,避免死循环;
- 防火墙常封禁入站ICMP:外部无法ping通内网主机(安全策略);
- 端口不可达(Type3-Code3):UDP收包无对应监听端口时回复,TCP不会(TCP自带RST报文)。
六、简易数据流示例
PC ping 192.168.1.1
PC(用户态程序)→构造ICMP请求→封装IP→网关收到→网关回ICMP应答→PC解析输出时延。
关联文档
- 网络面试题 — 网络协议面试题
- ../technology/eBPF 技术原理 — 网络观测与 eBPF