首页/网络/协议速查/ICMP 差错报文与查询报文

ICMP 差错报文与查询报文

差错报文(目的不可达/超时/重定向等)由路由器或主机自动发出;查询报文(Echo 等)由应用主动发起,两者处理规则不同。

协议速查网络更新于 2026-10-13

两类报文的分工

ICMP 报文分两大类:差错报文由路由器或目标主机在转发失败时自动发出(目的不可达、超时、重定向等),查询报文由应用主动发起并等待应答(Echo 请求与应答、时间戳)。二者的处理规则不同——差错报文必然携带原始数据报的头部与至少 8 字节载荷,这一特性既是排障线索,也是信息泄露面。

基本信息

协议号IPv4 中 IP 协议号 1;IPv6 中 ICMPv6 为 58
差错报文v4:3 不可达、4 源抑制(已废弃)、5 重定向、11 超时、12 参数错误
查询报文v4:8/0 Echo、13/14 时间戳;v6:128/129 Echo、133-137 NDP
生成限制差错报文不会对差错报文、广播与多播再生成,避免风暴

典型使用场景

  • 排障时区分「端口没开」与「主机不可达」:前者回类型 3 代码 3,后者代码 0 或 1
  • 判断 PMTU 问题:类型 3 代码 4(需要分片)是 MTU 黑洞的直接证据
  • 用 traceroute 定位路径:依赖的正是类型 11 超时差错报文
  • 设计防火墙策略:差错报文必须放行,查询报文可限速,重定向与源路由应丢弃

类别对照

类别典型类型触发方
差错报文3 不可达、5 重定向、11 超时、12 参数错误路由器或目标主机
查询报文8/0 Echo、13/14 时间戳应用主动发起
v6 差错1 不可达、2 包太大、3 超时、4 参数错误路由器或主机
v6 查询128/129 Echo、133-137 NDP主机(NDP 为协议运作必需)

按类型抓包

按类型抓包
tcpdump -nn 'icmp[0] == 3' -c 10              # 目的不可达,含代码位
 tcpdump -nn 'icmp[0] == 3 and icmp[1] == 4' -c 5   # 只看「需要分片」(PMTU 线索)
tcpdump -nn 'icmp[0] == 11' -c 10             # 超时,traceroute 依赖它
tcpdump -nn 'icmp[0] == 5' -c 5               # 重定向,内网出现需警惕
tcpdump -nn 'icmp6' -c 10                     # IPv6 侧整体观察
差错报文携带原始头部加 8 字节载荷,因此外部扫描者可用它探测内网结构,这就是「ICMP 信息泄露」的原理;这也是老式防火墙倾向全面禁 ICMP 的由来,但代价是掐断了 PMTUD。
IPv4 的「源抑制」类型 4 早已废弃,现代实现不会发出,看到它多半是老旧设备或伪造流量,不影响正常路径。

易错点

  • 按 v4 的类型号过滤 v6 流量会全部漏报:ICMPv6 的类型编号体系独立,超时是类型 3 而不是 11
  • 在生产网全面禁 ICMP 差错报文:PMTUD 失效后大包被静默丢弃,表现为「能登录打不开页面」的典型 MTU 黑洞
  • 只放行 Echo 请求不放行 Echo 应答(或反之):方向写错时 ping 看起来「目标不回」,实际是回包被自己挡在门外
  • 把内网出现 ICMP 重定向当成正常现象:重定向可能被用于篡改路径,内网主机应忽略它,路由器侧应关闭重定向发送

数据来源与参考

  • RFC 792
  • RFC 1812 §4.3(差错生成规则)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌