互联网控制消息协议(Internet Control Message Protocol,ICMP)是互联网协议族的核心协议之一。它用于 IP 协议中发送控制消息,提供可能发生在通信环境中的各种问题反馈。它通常不由网络程序直接使用(除了 ping 和 traceroute)。 IPv4 中的 ICMP 被称作 ICMPv4,IPv6 中的 ICMP 则被称作 ICMPv6

报文结构

ICMP 报头通常从 IP 报头的第 160 位开始:

Bits160-167168-175176-183184-191
--TypeCode校验码校验码

其中:

  • Type 是 ICMP的类型,标识生成的错误报文;
  • Code 是 进一步划分ICMP的类型,该字段用来查找产生错误的原因。例如,ICMP的目标不可达类型(Type = 3)可以把这个位设为 1~15 等来表示不同的意思;
  • Checksum 是 Internet校验和,用于进行错误检查,该校验和是从ICMP头和以该字段替换为0的数据计算得出的。

从第 192 位开始,是 Rest of Header,代表报头的其余部分,内容根据ICMP类型和代码而有所不同。

报文类型

互联网控制消息协议(ICMP)包含多种消息,这些消息通过 Type 字段进行标识。

Type名称中文名参考
0Echo ReplyEcho 响应,被程序 ping 使用[RFC792]
3Destination Unreachable目的不可达[RFC792]
4Source Quench (Deprecated) RFC792
5Redirect重定向[RFC792]
6Alternate Host Address (Deprecated) [RFC6918]
8EchoEcho 请求[RFC792]
9Router Advertisement路由器通告[RFC1256]
10Router Solicitation路由器的发现/选择/请求[RFC1256]
11Time ExceededICMP 超时[RFC792]
12Parameter Problem参数问题:错误IP头部[RFC792]
13Timestamp时间戳请求[RFC792]
14Timestamp Reply时间戳应答[RFC792]
15Information Request (Deprecated) RFC792
16Information Reply (Deprecated) RFC792
17Address Mask Request (Deprecated) RFC950
18Address Mask Reply (Deprecated) RFC950
19Reserved (for Security) [Solo]
20-29Reserved (for Robustness Experiment) [ZSu]
30Traceroute (Deprecated) RFC1393
31Datagram Conversion Error (Deprecated) RFC1475
32Mobile Host Redirect (Deprecated) [RFC6918]
33IPv6 Where-Are-You (Deprecated) [RFC6918]
34IPv6 I-Am-Here (Deprecated) [RFC6918]
35Mobile Registration Request (Deprecated) [RFC6918]
36Mobile Registration Reply (Deprecated) [RFC6918]
37Domain Name Request (Deprecated) RFC1788
38Domain Name Reply (Deprecated) RFC1788
39SKIP (Deprecated) [RFC6918]
40Photuris [RFC2521]
41ICMP messages utilized by experimental mobility protocols such as Seamoby [RFC4065]
42Extended Echo Request [RFC8335]
43Extended Echo Reply [RFC8335]
253RFC3692-style Experiment 1 [RFC4727]
254RFC3692-style Experiment 2 [RFC4727]
255Reserved [JBP]
注:这张表剔除了 Unassigned 未分配的 Type,中文翻译没有翻译弃用和保留的部分。

报文详解

Echo 响应 (Type 0)

Code 只有 0,代表 Echo 响应。

源站不可达 (Type 3)

Code 总共有 16 个,如下:

Code解释参考
0Net Unreachable 网络不可达[RFC792]
1Host Unreachable 主机不可达[RFC792]
2Protocol Unreachable 协议不可达[RFC792]
3Port Unreachable 端口不可达[RFC792]
4Fragmentation Needed and Don't Fragment was Set 需要分片但是 Do not Fragment 置位[RFC792]
5Source Route Failed 源路由失败[RFC792]
6Destination Network Unknown 目的网络未知[RFC1122]
7Destination Host Unknown 目的主机未知[RFC1122]
8Source Host Isolated 源主机被隔离[RFC1122]
9Communication with Destination Network is Administratively Prohibited[RFC1122]
10Communication with Destination Host is Administratively Prohibited[RFC1122]
11Destination Network Unreachable for Type of Service[RFC1122]
12Destination Host Unreachable for Type of Service[RFC1122]
13Communication Administratively Prohibited[RFC1812]
14Host Precedence Violation 主机越权[RFC1812]
15Precedence cutoff in effect 优先权剥夺生效[RFC1812]

重定向 (Type 5)

重定向报文是网关发出的,用于要求主机或路由器改变量据报的传输路径的ICMP报文。ICMP 重定向是路由器将路由信息传达给主机的机制。如果一个数据报携带有路由信息,那么即使有更加优化的路径,路由器也不会发送重定向报文。并且,RFC 1122 指出,重定向报文应该只由网关发送,而不应该由互联网主机发送。

Code 指定重定向的原因:

Code描述
0针对网络的重定向报文
1针对主机的重定向报文
2针对网络和服务类型的重定向报文
3针对主机和服务类型的重定向报文

Echo 请求 (Type 8)

Code 只有 0,代表 Echo 请求。

路由器通告 RA (Type 9)

Code 指定:

Code描述
0Normal router advertisement
16Does not route common traffic

路由器请求 (Type 10)

Code 只有 0。

ICMP 超时 (Type 11)

超时报文是网关产生并发送给源站的 ICMP 报文,用于通知源站有数据报因为存活时间递减至 0 而被此网关丢弃,也用于 traceroute 工具来识别两个主机之间的路径上的网关。

Code 指定重超时的原因:

Code描述
0存活时间计数超时
1分片重装超时