一、什么是ICMP协议
ICMP协议,用于传输出错报告控制信息,包括报告错误、交换控制受限、状态信息等。比如,我们经常使用的ping命令和tracert命令。
二、ICMP协议结构
ICMP协议是基于以太网协议基础上的组帧协议(参考文章:以太网帧格式解析-CSDN博客),如下图:
具体解析如下表(内含IP协议部分的解析):
协议类型 | 名称 | 字节数 | 数值 | 含义 |
数据同步 | 前导码 | 7字节 | 0x55_5555_ 5555_5555 | 同步码,通过串行数据的“01”交替,实现数据的同步。 |
帧起始界定符 | 1字节 | 0xD5 | 表示一帧的开始。后面紧跟以太网的帧头 | |
以太网协议(14字节帧头) | 目的MAC地址 | 6字节 | / | 以太网协议的第一个字段。指示目标设备(接收端)的MAC地址。分为广播地址、单播地址和多播地址。广播地址的数值为0xFFFF_FFFF_FFFF,用于和所有设备进行通信。 |
源MAC地址 | 6字节 | / | 发送端的MAC地址。 | |
长度/类型 | 2字节 | / | 当该字段的数值小于1536个字节时,表示的是数据的长度。 当为0x0800时,表示该数据包是IPv4协议包。 当为0x08DD时,表示该数据包是IPv6协议包。 当为0x0806时,表示该数据包是ARP协议包。 | |
IP 协议(20字节首部,4字节对齐) | 版本 | 0.5字节 | / | IP 协议版本号。二进制的 0100 时表示 IPv4,设置为 0110 时表示 IPv6 |
首部长度 | 0.5字节 | / | 表示 IP 首部一共有多少个 32 位(4 个字节)。没有可选字段时,首部有20个字节,此处为5. | |
服务类型 | 1字节 | / | 服务类型为0时,表示一般服务。 | |
总长度 | 2字节 | / | IP数据报文总长度,包括首部+数据部分 | |
标识 | 2字节 | / | 表示数据报文的ID号,每发送一次报文,ID加1 | |
标志 | 0.5字节 | / | 3 位标志(Flags)字段, 第 1 位为保留位; 第 2 位表示禁止分片(1 表示不分片 0:允许分 第 3 位标识更多分片(除了数据报的最后一个分片外,其它分片都为 1)。 | |
片偏移 | 1.5字节 | / | 在接收方进行数据报重组时用来标识分片的顺序 | |
生存时间 | 1字节 | / | 防止丢失的数据包在网络中无休止的传播,一般设置为64或者128。 | |
协议 | 1字节 | / | 表示此数据报所携带上层数据使用的协议类型,ICMP 为 1,TCP 为6,UDP 为 17。 | |
首部校验和 | 2字节 | / | 该字段只校验数据报的首部,不包含数据部分 | |
源IP地址 | 4字节 | / | / | |
目的IP地址 | 4字节 | / | / | |
可选字段 | / | / | 可有可无,一般忽略的时候,首部为20字节。注意可选字段长度必须是4字节整数倍。 | |
ICMP协议(8个字节帧头) | 类型 | 1字节 | / | 指示ICMP报文的作用及格式。常用类型有: 类型 0,代码 0:表示回显应答(ping 应答); 类型 8,代码 0:表示回显请求(ping 请求); 类型 11,代码 0:超时; 类型 3,代码 0:网络不可达; 类型 3,代码 1:主机不可达; 类型 5,代码 0:重定向; |
代码 | 1字节 | / | ||
校验和 | 2字节 | / | 与IP首部的校验方式相同,仅校验ICMP首部 | |
标识符 | 2字节 | / | 表示进程或线程,用以表示ICMP发送的实体 | |
序列号 | 2字节 | / | 表示数据报文的ID号,每发送一次报文,ID加1 | |
用户数据 | N字节 | / | / | |
以太网协议 | FCS | 4字节 | / | / |
简单描述一下上述表格的IP首部检验和的计算方式:
1、将 16 位检验和字段置为 0,然后将 IP 首部按照 16 位分成多个单元;
2、对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位);
3、此时仍然可能出现进位的情况,将得到的和再次分成高 16 位和低 16 位进行累加;
4、最后将得到的和的反码填入校验和字段。
举例如下图:
三、ping命令实际举例
1、wireshark抓取的ping请求指令如下;
协议类型 | 名称 | 字节数 | 数值 | 含义 |
以太网协议(14字节帧头) | 目的MAC地址 | 6字节 | 0x04D9_C8BD_15CF | 以太网协议的第一个字段。指示目标设备(接收端)的MAC地址。分为广播地址、单播地址和多播地址。广播地址的数值为0xFFFF_FFFF_FFFF,用于和所有设备进行通信。 |
源MAC地址 | 6字节 | 0xE080_88BA_9F36 | 发送端的MAC地址。 | |
长度/类型 | 2字节 | 0x0800 | 当该字段的数值小于1536个字节时,表示的是数据的长度。 当为0x0800时,表示该数据包是IPv4协议包。 当为0x08DD时,表示该数据包是IPv6协议包。 当为0x0806时,表示该数据包是ARP协议包。 | |
IP 协议(20字节首部,4字节对齐) | 版本 | 0.5字节 | 0x4 | IP 协议版本号。二进制的 0100 时表示 IPv4,设置为 0110 时表示 IPv6 |
首部长度 | 0.5字节 | 0x5 | 表示 IP 首部一共有多少个 32 位(4 个字节)。没有可选字段时,首部有20个字节,此处为5. | |
服务类型 | 1字节 | 0x00 | 服务类型为0时,表示一般服务。 | |
总长度 | 2字节 | 0x003C | IP数据报文总长度,包括首部+数据部分,共60字节 | |
标识 | 2字节 | 0xBD25 | 表示数据报文的ID号,每发送一次报文,ID加1 | |
标志 | 0.5字节 | 0x0 | 3 位标志(Flags)字段, 第 1 位为保留位; 第 2 位表示禁止分片(1 表示不分片; 0:允许分片); 第 3 位标识更多分片(除了数据报的最后一个分片外,其它分片都为 1)。 | |
片偏移 | 1.5字节 | 0x000 | 在接收方进行数据报重组时用来标识分片的顺序 | |
生存时间 | 1字节 | 0x80 | 防止丢失的数据包在网络中无休止的传播,设置为128。 | |
协议 | 1字节 | 0x01 | 表示此数据报所携带上层数据使用的协议类型,ICMP 为 1,TCP 为6,UDP 为 17。 | |
首部校验和 | 2字节 | 0x0000 | 该字段只校验数据报的首部,不包含数据部分,一般不校验 | |
源IP地址 | 4字节 | 0xC0A80A0B | 192.168.10.2 | |
目的IP地址 | 4字节 | 0xC0A80A02 | 192.168.10.11 | |
可选字段 | / | / | / | |
ICMP协议(8个字节帧头) | 类型 | 1字节 | 0x08 | 指示ICMP报文的作用及格式。常用类型有: 类型 0,代码 0:表示回显应答(ping 应答); 类型 8,代码 0:表示回显请求(ping 请求); 类型 11,代码 0:超时; 类型 3,代码 0:网络不可达; 类型 3,代码 1:主机不可达; 类型 5,代码 0:重定向; |
代码 | 1字节 | 0x00 | ||
校验和 | 2字节 | 0x4CFE | 与IP首部的校验方式相同,仅校验ICMP首部 | |
标识符 | 2字节 | 0x0001 | 表示进程或线程,用以表示ICMP发送的实体 | |
序列号 | 2字节 | 0x005D | 表示数据报文的ID号,每发送一次报文,ID加1 | |
用户数据 | N字节 | 0x6162_6364...... | 32字节发送数据 |
2、wireshark抓取的对应的ping应答如下:
协议类型 | 名称 | 字节数 | 数值 | 含义 |
以太网协议(14字节帧头) | 目的MAC地址 | 6字节 | 0xE080_88BA_9F36 | 以太网协议的第一个字段。指示目标设备(接收端)的MAC地址。分为广播地址、单播地址和多播地址。广播地址的数值为0xFFFF_FFFF_FFFF,用于和所有设备进行通信。 |
源MAC地址 | 6字节 | 0x04D9_C8BD_15CF | 发送端的MAC地址。 | |
长度/类型 | 2字节 | 0x0800 | 当该字段的数值小于1536个字节时,表示的是数据的长度。 当为0x0800时,表示该数据包是IPv4协议包。 当为0x08DD时,表示该数据包是IPv6协议包。 当为0x0806时,表示该数据包是ARP协议包。 | |
IP 协议(20字节首部,4字节对齐) | 版本 | 0.5字节 | 0x4 | IP 协议版本号。二进制的 0100 时表示 IPv4,设置为 0110 时表示 IPv6 |
首部长度 | 0.5字节 | 0x5 | 表示 IP 首部一共有多少个 32 位(4 个字节)。没有可选字段时,首部有20个字节,此处为5. | |
服务类型 | 1字节 | 0x00 | 服务类型为0时,表示一般服务。 | |
总长度 | 2字节 | 0x003C | IP数据报文总长度,包括首部+数据部分,共60字节 | |
标识 | 2字节 | 0xBC6E | 表示数据报文的ID号,每发送一次报文,ID加1 | |
标志 | 0.5字节 | 0x0 | 3 位标志(Flags)字段, 第 1 位为保留位; 第 2 位表示禁止分片(1 表示不分片; 0:允许分片); 第 3 位标识更多分片(除了数据报的最后一个分片外,其它分片都为 1)。 | |
片偏移 | 1.5字节 | 0x000 | 在接收方进行数据报重组时用来标识分片的顺序 | |
生存时间 | 1字节 | 0x80 | 防止丢失的数据包在网络中无休止的传播,设置为128。 | |
协议 | 1字节 | 0x01 | 表示此数据报所携带上层数据使用的协议类型,ICMP 为 1,TCP 为6,UDP 为 17。 | |
首部校验和 | 2字节 | 0xF1F4 | 该字段只校验数据报的首部,不包含数据部分,一般不校验 | |
源IP地址 | 4字节 | 0xC0A80A02 | 192.168.10.2 | |
目的IP地址 | 4字节 | 0xC0A80A0B | 192.168.10.11 | |
可选字段 | / | / | / | |
ICMP协议(8个字节帧头) | 类型 | 1字节 | 0x00 | 指示ICMP报文的作用及格式。常用类型有: 类型 0,代码 0:表示回显应答(ping 应答); 类型 8,代码 0:表示回显请求(ping 请求); 类型 11,代码 0:超时; 类型 3,代码 0:网络不可达; 类型 3,代码 1:主机不可达; 类型 5,代码 0:重定向; |
代码 | 1字节 | 0x00 | ||
校验和 | 2字节 | 0x54FE | 与IP首部的校验方式相同,仅校验ICMP首部 | |
标识符 | 2字节 | 0x0001 | 表示进程或线程,用以表示ICMP发送的实体 | |
序列号 | 2字节 | 0x005D | 表示数据报文的ID号,每发送一次报文,ID加1 | |
用户数据 | N字节 | 0x6162_6364...... | 32字节应答数据 |