ICMP:IP 网络的"控制与诊断信使"
更新时间:2026-09-17。网络协议域·网络层。它承载了 ping/traceroute 和 PMTUD 的反馈;与 ARP 的关系见 ARP。
ICMP(Internet Control Message Protocol,互联网控制报文协议) 封装在 IP 包里,用于在主机/路由器之间传递差错报告与控制、诊断信息。它不保证可靠、不用于传业务数据,却是网络能被诊断和自我调节的关键。IPv4 用 ICMP(协议号 1),IPv6 用 ICMPv6(协议号 58,还承担了邻居发现等更多职责)。
一、报文结构:Type + Code
ICMP 报文用"类型 Type + 代码 Code"区分具体情况,常见类型:
| Type | 名称 | 谁发、含义 |
|---|---|---|
| 8 / 0 | Echo Request / Reply | ping 的请求与应答 |
| 3 | Destination Unreachable 目标不可达 | code 细分:网络/主机/端口不可达、需要分片但置了 DF(code 4)、管理禁止(13) 等 |
| 11 | Time Exceeded 超时 | TTL 减到 0,traceroute 靠它 |
| 30 / Traceroute | — | 较新的路由追踪辅助 |
| 5 | Redirect 重定向 | 告诉主机有更优下一跳(安全上常禁用) |
每个 ICMP 报文通常还会回带触发它的原 IP 包头(及部分载荷),让发送方知道是哪个包出了问题。
二、ping:用 Echo 测可达与 RTT
ping 发 ICMP Echo Request(type 8),目标回 Echo Reply(type 0):
- 通过"请求-应答"测量往返时间 RTT、丢包率(回应没回来)和 TTL。
- 只能证明 IP/ICMP 层可达,不代表 TCP 端口或服务可用——很多防火墙禁 ICMP 但开业务端口,所以 ping 不通不等于服务挂了,要配合 nc/ss 测端口。
-s指定载荷大小、DF 位可用来探 MTU(见下)。
三、traceroute/mtr:利用 TTL 逐跳发现路径
IP 头有 TTL(Time To Live),每经过一台路由器减 1,减到 0 时该路由器丢弃包并回 ICMP Time Exceeded(type 11)。traceroute 利用这一点逐跳探测:
发 TTL=1 的包 -> 第一跳路由器 TTL 耗尽,回 ICMP 超时报文(得到第 1 跳 IP/RTT)
发 TTL=2 -> 第二跳回超时报文
发 TTL=3 ...
直到到达目标(回 Echo Reply 或目标端口不可达)- Linux traceroute 默认发 UDP 高端口,目标以"端口不可达(type3 code3)"表示到达;也可用
-I(ICMP)或-T(TCP SYN,更易穿透只放行业务的防火墙)。 - mtr 把 ping 与 traceroute 结合,持续统计每一跳的丢包/延迟,定位具体哪一跳劣化。
- 注意中间跳丢包不一定影响端到端(路由器可能对 ICMP 限速),要看最终目标是否丢包。
四、ICMP 与 PMTUD:不能乱封的 type3/code4
当一个置了 DF(不分片) 的包对下一跳 MTU 太大时,路由器丢弃并发 ICMP "Fragmentation Needed"(type 3 code 4),并附带下一跳 MTU。发送方据此调小,这就是路径 MTU 发现。
- 若防火墙把这类 ICMP 也封了,发送方一直收不到反馈、不断重传大包 → PMTUD 黑洞:小包通、大包卡(见 IP 分片/MTU/MSS,解法是放行该 ICMP 或 MSS clamping)。
- 因此生产实践:不要一刀切封禁所有 ICMP。建议至少放行 Echo(按需)、Destination Unreachable(尤其 code4)、Time Exceeded;可以禁 Redirect、定向广播、对请求做限速。
五、安全面与 ICMPv6
- 历史攻击:Smurf(广播放大)、Ping of Death(超大分片)等,现代系统已基本修复;常见做法是对 ICMP 限速而非全禁。
- 主机用 ICMP 做速率自适应:收到"不可达"可避免无意义重传;封 ICMP 反而可能让连接表现异常。
- ICMPv6 是 IPv6 正常工作的必需部分:邻居发现(替代 ARP 的 NDP)、路由器通告、地址自动配置、重复地址检测、PMTUD(PTB)都跑在 ICMPv6 上,封 ICMPv6 等于破坏 IPv6。
相关阅读
工具用法见 ping/mtr/traceroute,分片反馈见 MTU/MSS,二层解析见 ARP,连通性误判见端口占用 FAQ。
总结
ICMP 是封装在 IP 里的差错与诊断协议:Echo(8/0) 支撑 ping 测可达和 RTT、Time Exceeded(11) 配合 TTL 递增支撑 traceroute/mtr、Destination Unreachable(尤其 type3 code4)支撑 PMTUD;ping 不通只代表 ICMP 层而非服务层,不能一刀切封禁 ICMP(否则造成 PMTUD 黑洞等问题),IPv6 中 ICMPv6 还承担 NDP 等核心功能。