Appearance
ICMP 协议
ICMP(Internet Control Message Protocol,网际控制报文协议)是 TCP/IP 网络层(OSI 第三层) 的协议,IP 协议号 1。它不传输用户业务数据,而是用于在 IP 主机、路由器之间传递控制与差错信息,是「网络自我诊断」的工具。
注意:ICMP 不是传输层协议,它和 TCP/UDP 是「同层邻居」——都基于 IP,但职责不同。我们平时用的
ping、traceroute就是建立在 ICMP 之上的。
一、ICMP 的作用
- 差错报告:当 IP 包无法送达或处理异常时,由路由器/主机回送差错报文。
- 目的不可达(网络/主机/端口/协议不可达)
- 超时(TTL 减到 0,或分片重组超时)
- 参数问题(首部字段错误)
- 查询/诊断(典型就是 ping / traceroute):
- 回送请求 / 回送应答(Echo):ping 的原理。
- 时间戳请求 / 应答:测量往返时间。
- 地址掩码请求 / 应答:获取子网掩码(现已少用)。
二、报文格式
ICMP 报文封装在 IP 数据报中(IP 首部 protocol=1,后面跟 ICMP 报文):
0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 类型 Type | 代码 Code | 校验和 Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 根据不同的 Type/Code 携带的附加信息 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 类型(Type):区分报文种类(如 0=回送应答,8=回送请求,3=目的不可达,11=超时)。
- 代码(Code):在同一类型下细分(如目的不可达的 网络/主机/端口 不可达)。
- 校验和:覆盖整个 ICMP 报文。
常见类型速查:
| Type | 含义 | 典型用途 |
|---|---|---|
| 0 / 8 | 回送应答 / 回送请求 | ping |
| 3 | 目的不可达 | 路由/端口不可达报错 |
| 11 | 超时(TTL=0 / 重组超时) | traceroute |
| 5 | 重定向 | 通知更优路由 |
三、典型应用
ping
发送 ICMP Echo Request(Type 8),对端回 Echo Reply(Type 0)。通过统计往返时间(RTT)和丢包率判断连通性与网络质量。
traceroute(Windows: tracert)
利用 TTL 机制:逐跳把 IP 包的 TTL 设为 1, 2, 3…,每经过一跳路由器 TTL 减 1,减到 0 时路由器丢弃该包并返回 ICMP 超时报文(Type 11),从而暴露每一跳的地址,画出路径。
四、与 TCP/UDP 的区别
| 维度 | ICMP | TCP / UDP |
|---|---|---|
| 所属层 | 网络层(L3) | 传输层(L4) |
| 是否传用户数据 | 否(仅控制/诊断) | 是 |
| 是否有端口号 | 否 | 是 |
| 典型应用 | ping / traceroute / 差错报告 | 网页、文件、音视频等 |
五、注意事项
- ICMP 常被防火墙限制或丢弃(尤其 Echo 类型),所以
ping 不通不代表服务不可达(TCP 端口可能仍开放)。 - 不要滥用 ICMP(如大量 Echo 请求构成 ping flood 攻击);生产环境常对 ICMP 速率做限制。
- ICMP 本身不可靠,差错报文也可能丢失,不应作为唯一的可靠性依据。