Skip to main content

ICMP报文格式

ICMP(Internet Control Message Protocol)是IP层的一个组成部分,主要用来传递差错报文以及其他需要注意的信息。它通常被IP层或更高协议(TCP或UDP)使用。一些ICMP报文会把差错信息返回给用户进程。

  • ICMP报文通用格式 有很多情况都会发送ICMP消息,例如,报文无法发送到目的地址,再如,网关设备没有足够的缓存来存储转发报文。

  • ICMP Echo Request/Reply消息格式 用于检测IP网络连通性的Ping/Tracert,是通过发送ICMP Echo消息实现的。

  • ICMP目的不可达消息格式 IP是一个尽力而为的交付机制,不会轻易丢弃数据报。当路由设备无法转发或者交付IP数据报时,会向源站发送一个目的站不可达的报文,然后丢弃该数据报。

  • ICMP重定向消息 ICMP重定向消息是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台主机或网络设备使用非优化路由的时候,它会向该主机或网络设备发送一个ICMP重定向报文,请求主机或网络设备改变路由。路由器也会把初始数据报向它的目的地转发。

  • ICMP超时消息格式 当收到TTL为0的报文时,网络设备/主机会丢弃该报文,并返回一个ICMP超时报文。Traceroute正是利用了ICMP超时报文来获得路由器的IP地址,再用端口不可达报文来判断数据报是否已经送达目的端。

  • ICMP参数问题消息格式 如果发现接收的数据包存在报文头参数有问题,无法完成数据包解析时,网络/主机会将数据包丢弃,并可能会返回一个ICMP参数问题消息给源端。

  • ICMP源端被关闭消息格式 用于表示对方或中途的服务器繁忙无法回应。如果网络设备没有足够的缓存空间存储到某个目的主机的报文时,这些报文会被该设备丢弃。此时,网络设备发送ICMP源端被关闭消息给该目的主机。如果到达某一个主机的数据包过快,来不及被主机处理,则该主机也可以发送ICMP源端被关闭消息,以便降低数据包速率。

ICMP报文通用格式

有很多情况都会发送ICMP消息,例如,报文无法发送到目的地址,再如,网关设备没有足够的缓存来存储转发报文。

ICMP报文通用格式
+0------7-------15---------------31
|  Type | Code  |    Checksum    |
+--------------------------------+
|          Message Body          |
|       (Variable length)       |
+--------------------------------+
ICMP报文通用格式字段解释
字段 长度 含义
Type 1字节 报文类型,用来标识报文,Type字段的取值和含义如表 ICMP消息类型代码对应表所示。
Code 1字节 代码,提供报文类型的进一步信息,Code字段的取值和含义如表 ICMP消息类型代码对应表所示。
Checksum 2字节 校验和,使用和IP相同的加法校验和算法,但是ICMP校验和仅覆盖ICMP报文。
Message Body 可变 字段的长度和内容,取决于消息的类型和代码,请参见表 ICMP消息类型代码对应表

ICMP消息类型代码

其中,最后一个字段的长度和内容,取决于消息的类型和代码。

ICMP消息类型代码对应表
Type Code 描述1 描述2 说明
0 0 回显应答(ping应答) Each Reply  
3 0 网络不可达 net unreachable  
3 1 主机不可达 host unreachable  
3 2 协议不可达 protocol unreachable  
3 3 端口不可达 port unreachable  
3 4 需要进行分片但设置不分片比特 fragmentation needed and DF set  
3 5 源站选路失败 source route failed  
3 6 目的网络不认识 Destination network unknown  
3 7 目的主机不认识 Destination host unknown  
3 8 源主机被隔离(作废不用) Source host isolated (obsolete)  
3 9 目的网络被强制禁止 Destination network administratively prohibited  
3 10 目的主机被强制禁止 Destination host administratively prohibited  
3 11 由于TOS,网络不可达 Network unreachable for TOS  
3 12 由于TOS,主机不可达 Host unreachaSSble for TOS  
3 13 由于过滤,通信被强制禁止 Communication administratively prohibited by filtering  
3 14 主机越权 Host precedence violation  
3 15 优先权中止生效 Precedence cutoff in effect  
4 0 源端被关闭    
5 0 对网络重定向 Redirect datagrams for the Network  
5 1 对主机重定向 Redirect datagrams for the Host.  
5 2 对服务类型和网络重定向 Redirect datagrams for the Type of Service and Network.  
5 3 对服务类型和主机重定向 Redirect datagrams for the Type of Service and Host.  
8 0 请求回显(ping请求)    
9 0 路由器通告    
10 0 路由器请求告    
11 0 传输期间生存时间为0    
11 1 在数据报组装期间生存时间为0    
12 0 坏的IP首部    
12 1 缺少必须的选项    
13 0 时间戳请求(作废不用)    
14 0 时间戳应答(作废不用)    
15 0 信息请求(作废不用)    
16 0 信息应答(作废不用)    
17 0 地址掩码请求    
18 0 地址掩码应答    

ICMP Echo Request/Reply消息格式

用于检测IP网络连通性的Ping/Tracert,是通过发送ICMP Echo消息实现的。

ICMP Echo Request/Reply消息格式
+0------7-------15---------------31
| Type | Code |   Checksum   |
+--------------------------------+
| Identi|   Sequence Number     |
+--------------------------------+
|             Data               |
+--------------------------------+
ICMP Echo Request/Reply消息字段解释
字段 长度 含义
Type 1字节 消息类型:0:回显应答报文 8:请求回显报文
Code 1字节 消息代码,此处值为0。
Checksum 2字节 检验和,使用和IP相同的加法校验和算法,但是ICMP校验和仅覆盖ICMP报文。
Identifier 2字节 标识符,发送端标示此发送的报文。
Sequence Number 2字节 序列号,发送端发送的报文的顺序号。每发送一次顺序号就加1。
Data 可变 选项数据,是一个可变长的字段,其中包含要返回给发送者的数据。回显应答通常返回与所收到的数据完全相同的数据。

ICMP目的不可达消息格式

IP是一个尽力而为的交付机制,不会轻易丢弃数据报。当路由设备无法转发或者交付IP数据报时,会向源站发送一个目的站不可达的报文,然后丢弃该数据报。

ICMP目的不可达消息格式
+0------7-------15---------------31
| Type | Code |   Checksum   |
+--------------------------------+
|           unused             |
+--------------------------------+
|       Internet Header         |
|         +64 bits of           |
|   Original Data Datagram       |
+--------------------------------+
ICMP目的不可达消息字段解释
字段 长度 含义
Type 1B 消息类型,此处值为3。
Code 1B 消息代码
Checksum 2B 检验和,使用和IP相同的加法校验和算法,但是ICMP校验和仅覆盖ICMP报文。
unused 4B 未使用,必须填0。
Internet Header + 64 bits of Original Data Datagram 可变 IP首部+原始数据包的前8字节:IP首部:如果IP首部没有选项字段时为20字节原始数据包的前8字节:UDP首部的8字节或者TCP首部的8字节。该数据是主机用来匹配消息。对于更高层协议的用户端口号,原始数据包的前64比特的这些数据会被重组。

ICMP重定向消息

ICMP重定向消息是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台主机或网络设备使用非优化路由的时候,它会向该主机或网络设备发送一个ICMP重定向报文,请求主机或网络设备改变路由。路由器也会把初始数据报向它的目的地转发。

ICMP重定向消息
+0------7-------15---------------31
| Type | Code |   Checksum   |
+--------------------------------+
|   Gateway Internet Address   |
+--------------------------------+
|       Internet Header         |
|         +64 bits of           |
|   Original Data Datagram       |
+--------------------------------+
ICMP重定向消息字段
字段 长度 含义
Type 1B 消息类型,此处值为5。
Code 1B 消息代码.
Checksum 2B 检验和。
Gateway Internet Address 4B 即原始数据包里的IP目的地址域。
Internet Header + 64 bits of Original Data Datagram 可变 IP头和原始数据包的前64比特数据。该数据是主机用来匹配消息。对于更高层协议的用户端口号,原始数据包的前64比特的这些数据会被重组。

ICMP超时消息格式

当收到TTL为0的报文时,网络设备/主机会丢弃该报文,并返回一个ICMP超时报文。Traceroute正是利用了ICMP超时报文来获得路由器的IP地址,再用端口不可达报文来判断数据报是否已经送达目的端。

ICMP超时消息格式
+0------7-------15---------------31
| Type | Code |   Checksum   |
+--------------------------------+
|             unused             |
+--------------------------------+
|       Internet Header         |
|         +64 bits of           |
|   Original Data Datagram       |
+--------------------------------+
ICMP超时消息字段格式
字段 长度 含义
Type 1B 消息类型,此处值为11。
Code 1B 消息代码:0 = time to live exceeded in transit1 = fragment reassembly time exceeded
Checksum 2B 检验和,使用和IP相同的加法校验和算法,但是ICMP校验和仅覆盖ICMP报文。
Internet Header + 64 bits of Original Data Datagram 可变 IP头和原始数据包的前64比特数据。该数据是主机用来匹配消息。对于更高层协议的用户端口号,原始数据包的前64比特的这些数据会被重组。

ICMP参数问题消息格式

如果发现接收的数据包存在报文头参数有问题,无法完成数据包解析时,网络/主机会将数据包丢弃,并可能会返回一个ICMP参数问题消息给源端。

ICMP参数问题消息格式
     0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |     Type     |     Code     |         Checksum             |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Pointer   |                   unused                     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |     Internet Header + 64 bits of Original Data Datagram     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ICMP参数问题消息字段解释
字段 长度 含义
Type 1B 消息类型,此处值为12。
Code 1B 消息代码:0 = pointer indicates the error.
Checksum 2B 检验和,使用和IP相同的加法校验和算法,但是ICMP校验和仅覆盖ICMP报文。
Pointer 1B 标识出报文中出现错误地方的8位片偏移量。
unused 3B 未使用。
Internet Header + 64 bits of Original Data Datagram 可变 IP头和原始数据包的前64比特数据。该数据是主机用来匹配消息。对于更高层协议的用户端口号,原始数据包的前64比特的这些数据会被重组。

ICMP源端被关闭消息格式

用于表示对方或中途的服务器繁忙无法回应。如果网络设备没有足够的缓存空间存储到某个目的主机的报文时,这些报文会被该设备丢弃。此时,网络设备发送ICMP源端被关闭消息给该目的主机。如果到达某一个主机的数据包过快,来不及被主机处理,则该主机也可以发送ICMP源端被关闭消息,以便降低数据包速率。

ICMP源端被关闭消息格式
 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type     |     Code     |         Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             unused                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Internet Header + 64 bits of Original Data Datagram     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ICMP源端被关闭消息字段格式
字段 长度 含义
Type 1B 消息类型,此处值为4。
Code 1B 消息代码,此处值为0。
Checksum 2B 检验和,使用和IP相同的加法校验和算法,但是ICMP校验和仅覆盖ICMP报文。
unused 4B 未使用。
Internet Header + 64 bits of Original Data Datagram 可变 IP头和原始数据包的前64比特数据。该数据是主机用来匹配消息。对于更高层协议的用户端口号,原始数据包的前64比特的这些数据会被重组。

参考标准

标准 描述
RFC 792 Internet Control Message Protocol