ICMP(Internet Control Message Protocol,互联网控制报文协议)是 TCP/IP 协议簇中的核心协议之一,主要用于在 IP 网络中传递控制信息与诊断网络故障。
ICMP 位于 OSI 模型的第三层——网络层。

ICMP协议的功能
- 确认 IP 包是否成功到达目标地址
- 通知 IP 包在发送过程中被丢弃的原因

工作原理
在 IP 通信中,如果某个 IP 包未能到达目标地址,具体原因会由 ICMP 负责通知。
示例说明:
核心要点
- ICMP 报文不会独立传输,而是封装在 IP 数据包中(IP 首部协议字段值为 1)。
- 差错报告:当数据包传输失败(如目标不可达、超时、参数错误)时,路由器或主机会向源端发送差错报文。
- 网络诊断:支持 Ping(ICMP 回显请求/应答)、Traceroute(路由追踪)等网络诊断工具。
- 控制功能:如 ICMP 重定向,帮助主机优化路由路径。
- 回显请求(Type 8)/回显应答(Type 0):用于 Ping 测试。
- 目标不可达(Type 3):如主机不可达、端口不可达等。
- 超时(Type 11):当数据包生存时间(TTL)耗尽时触发。
- ICMP 报文结构包括:ICMP头部和ICMP数据部分。不同类型的 ICMP 报文有不同的格式,但都包含一个基础的头部结构。

ICMP 报文结构
ICMP报文的格式可以分为两部分:
- ICMP头部
- ICMP数据部分
不同类型的ICMP报文格式略有不同,但所有报文均包含基础头部结构。

直观理解
- ICMP 报文是封装在 IP 包里的。
- ICMP 通知消息通过 IP 进行发送。
- 路由器返回的 ICMP 包会按常规路由经过其他路由器再转发给源主机。
- 主机收到 ICMP 包后,解析其首部和数据域,得知发生问题的具体原因。

IP数据包与ICMP关系
IP数据包结构:
- IP头(20字节固定)+ ICMP报文(ICMP头 + 可变数据)
- IP头负责寻址、路由和传输控制。
- ICMP报文作为 IP 数据部分,被协议字段(值=1)标识为 ICMP 协议。
报文大小限制
- ICMP 封装在 IP 数据包中,IP 的总长度字段为 16 位(最大 65535 字节)。
- 这一限制导致了经典的网络攻击——Ping of Death。
ICMP 包头类型分类
ICMP 包头的类型字段,大致可以分为两大类:
- 一类是用于诊断的查询消息,也就是「查询报文类型」
- 另一类是通知出错原因的错误消息,也就是「差错报文类型」
ICMP 包头的类型字段,确实可以分为两大类:查询报文类型和差错报文类型,下面是详细说明:
一、查询报文类型
这类报文是双向交互的,用于主动探测网络状态,常见类型有:
- 回显请求(Type=8)/ 回显应答(Type=0):ping 命令的底层实现,用于测试网络连通性。
- 时间戳请求(Type=13)/ 时间戳应答(Type=14):用于网络时间同步。
- 地址掩码请求(Type=17)/ 地址掩码应答(Type=18):用于获取子网掩码(现已较少使用)。
二、差错报文类型
这类报文是单向的,由路由器或目标主机在处理IP数据报出错时发送,常见类型有:
- 目标不可达(Type=3):如网络不可达、主机不可达、端口不可达等。
- 源抑制(Type=4):通知源主机降低发送速率(现已淘汰)。
- 重定向(Type=5):告知主机更优的路由路径。
- 超时(Type=11):TTL 耗尽或分片重组超时。
- 参数问题(Type=12):IP 首部字段错误。




