这是一篇转载自 ICMP 互联网控制消息协议 Type 和 Code 详解 的文章。
互联网控制消息协议(Internet Control Message Protocol,ICMP)是互联网协议族的核心协议之一。它用于 IP 协议中发送控制消息,提供可能发生在通信环境中的各种问题反馈。它通常不由网络程序直接使用(除了 ping 和 traceroute)。 IPv4 中的 ICMP 被称作 ICMPv4,IPv6 中的 ICMP 则被称作 ICMPv6
报文结构
ICMP 报头通常从 IP 报头的第 160 位开始:
| Bits | 160-167 | 168-175 | 176-183 | 184-191 |
|---|---|---|---|---|
| — | Type | Code | 校验码 | 校验码 |
其中:
- Type 是 ICMP的类型,标识生成的错误报文;
- Code 是 进一步划分ICMP的类型,该字段用来查找产生错误的原因。例如,ICMP的目标不可达类型(Type = 3)可以把这个位设为 1~15 等来表示不同的意思;
- Checksum 是 Internet校验和,用于进行错误检查,该校验和是从ICMP头和以该字段替换为0的数据计算得出的。
从第 192 位开始,是 Rest of Header,代表报头的其余部分,内容根据ICMP类型和代码而有所不同。
报文类型
互联网控制消息协议(ICMP)包含多种消息,这些消息通过 Type 字段进行标识。
| Type | 名称 | 中文名 | 参考 |
|---|---|---|---|
| 0 | Echo Reply | Echo 响应,被程序 ping 使用 | [RFC792] |
| 3 | Destination Unreachable | 目的不可达 | [RFC792] |
| 4 | Source Quench (Deprecated) | [RFC792][RFC6633] | |
| 5 | Redirect | 重定向 | [RFC792] |
| 6 | Alternate Host Address (Deprecated) | [RFC6918] | |
| 8 | Echo | Echo 请求 | [RFC792] |
| 9 | Router Advertisement | 路由器通告 | [RFC1256] |
| 10 | Router Solicitation | 路由器的发现/选择/请求 | [RFC1256] |
| 11 | Time Exceeded | ICMP 超时 | [RFC792] |
| 12 | Parameter Problem | 参数问题:错误IP头部 | [RFC792] |
| 13 | Timestamp | 时间戳请求 | [RFC792] |
| 14 | Timestamp Reply | 时间戳应答 | [RFC792] |
| 15 | Information Request (Deprecated) | [RFC792][RFC6918] | |
| 16 | Information Reply (Deprecated) | [RFC792][RFC6918] | |
| 17 | Address Mask Request (Deprecated) | [RFC950][RFC6918] | |
| 18 | Address Mask Reply (Deprecated) | [RFC950][RFC6918] | |
| 19 | Reserved (for Security) | [Solo] | |
| 20-29 | Reserved (for Robustness Experiment) | [ZSu] | |
| 30 | Traceroute (Deprecated) | [RFC1393][RFC6918] | |
| 31 | Datagram Conversion Error (Deprecated) | [RFC1475][RFC6918] | |
| 32 | Mobile Host Redirect (Deprecated) | [RFC6918] | |
| 33 | IPv6 Where-Are-You (Deprecated) | [RFC6918] | |
| 34 | IPv6 I-Am-Here (Deprecated) | [RFC6918] | |
| 35 | Mobile Registration Request (Deprecated) | [RFC6918] | |
| 36 | Mobile Registration Reply (Deprecated) | [RFC6918] | |
| 37 | Domain Name Request (Deprecated) | [RFC1788][RFC6918] | |
| 38 | Domain Name Reply (Deprecated) | [RFC1788][RFC6918] | |
| 39 | SKIP (Deprecated) | [RFC6918] | |
| 40 | Photuris | [RFC2521] | |
| 41 | ICMP messages utilized by experimental mobility protocols such as Seamoby | [RFC4065] | |
| 42 | Extended Echo Request | [RFC8335] | |
| 43 | Extended Echo Reply | [RFC8335] | |
| 253 | RFC3692-style Experiment 1 | [RFC4727] | |
| 254 | RFC3692-style Experiment 2 | [RFC4727] | |
| 255 | Reserved | [JBP] |
注:这张表剔除了
Unassigned未分配的 Type,中文翻译没有翻译弃用和保留的部分。
报文详解
Echo 响应 (Type 0)
Code 只有 0,代表 Echo 响应。
源站不可达 (Type 3)
Code 总共有 16 个,如下:
| Code | 解释 | 参考 |
|---|---|---|
| 0 | Net Unreachable 网络不可达 | [RFC792] |
| 1 | Host Unreachable 主机不可达 | [RFC792] |
| 2 | Protocol Unreachable 协议不可达 | [RFC792] |
| 3 | Port Unreachable 端口不可达 | [RFC792] |
| 4 | Fragmentation Needed and Don’t Fragment was Set 需要分片但是 Do not Fragment 置位 | [RFC792] |
| 5 | Source Route Failed 源路由失败 | [RFC792] |
| 6 | Destination Network Unknown 目的网络未知 | [RFC1122] |
| 7 | Destination Host Unknown 目的主机未知 | [RFC1122] |
| 8 | Source Host Isolated 源主机被隔离 | [RFC1122] |
| 9 | Communication with Destination Network is Administratively Prohibited | [RFC1122] |
| 10 | Communication with Destination Host is Administratively Prohibited | [RFC1122] |
| 11 | Destination Network Unreachable for Type of Service | [RFC1122] |
| 12 | Destination Host Unreachable for Type of Service | [RFC1122] |
| 13 | Communication Administratively Prohibited | [RFC1812] |
| 14 | Host Precedence Violation 主机越权 | [RFC1812] |
| 15 | Precedence 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 | 描述 |
|---|---|
| 0 | Normal router advertisement |
| 16 | Does not route common traffic |
路由器请求 (Type 10)
Code 只有 0。
ICMP 超时 (Type 11)
超时报文是网关产生并发送给源站的 ICMP 报文,用于通知源站有数据报因为存活时间递减至 0 而被此网关丢弃,也用于 traceroute 工具来识别两个主机之间的路径上的网关。
Code 指定重超时的原因:
| Code | 描述 |
|---|---|
| 0 | 存活时间计数超时 |
| 1 | 分片重装超时 |