基本概念
基本定位
- 所属层级 :网络层协议(虽然基于 IP 封装,但功能是辅助 IP 层,而非传输层)
- 诞生背景 :IP 协议本身是不可靠、无连接的,丢包时无法通知上层原因,ICMP 就是为了弥补这个缺陷而设计的。
核心功能
- 确认可达性 :验证 IP 报文是否成功送达目标地址 (比如
ping命令就是基于 ICMP 的 Echo 请求/应答)。 - 差错通知 :当 IP 报文被丢弃时,向源主机发送差错报文,告知丢包原因(比如目标不可达、超时、需要分片但 DF=1 等)。
- 辅助 IP 层 :为 IP 协议提供控制、诊断、差错报告能力,不参与数据传输。
关键细节
- 依赖关系 :ICMP 报文封装在 IP 数据报中传输,所以它是基于 IP 协议工作的。
- 层级归属 :因为它是为 IP 层服务的控制协议,而非为应用层提供端到端传输,所以归类为网络层,而非传输层。

总结
ICMP 是 IPv4 网络层的控制与诊断协议 ,核心作用是报告 IP 传输的可达性与丢包原因 (ICMP允许距离事故发生地最近的主机返回应答),弥补了 IP 协议不可靠的缺陷,是 ping、traceroute 等网络诊断工具的底层基础。
ICMP报文格式
ICMP 报文封装在 IP 数据报 中,整体分为 首部(固定 8 字节) 和 数据部分。

报文整体结构
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 类型(Type) | 1 | 定义报文功能(如 Echo 请求、目标不可达等) |
| 代码(Code) | 1 | 同一类型下的细分原因(如目标不可达分网络不可达/主机不可达) |
| 校验和(Checksum) | 2 | 对整个 ICMP 报文做差错校验 |
| 内容(可变) | 4 | 随类型不同而变化(如 Echo 报文里是标识符+序列号) |
| 数据部分 | 可变 | 差错报文会携带出错 IP 数据报的首部 + 前 8 字节数据 |
关键字段详解
(1)类型(Type)
常见类型值:
0:Echo 应答(ping 响应)8:Echo 请求(ping 探测)3:目标不可达11:超时(TTL 耗尽)5:重定向
(2)代码(Code)
对类型的进一步细分,例如:
- 类型
3(目标不可达):0:网络不可达1:主机不可达2:协议不可达3:端口不可达4:需要分片但 DF=1
(3)校验和(Checksum)
- 覆盖整个 ICMP 报文(首部 + 数据)
- 用于检测传输过程中的比特错误
两种典型报文格式
(1)Echo 请求/应答(ping 用)

- 类型:请求为
8,应答为0 - 代码:固定为
0 - 数据:通常填充任意字节(如 ASCII 字符)
(2)目标不可达/超时等差错报文

- 数据部分:携带触发差错的原始 IP 数据报首部 + 前 8 字节,方便源端定位是哪个报文出了问题