tcp/ip学习之9: ICMP协议数据分析
1. 获得ICMP请求响应数据
在终端执行如下命令,如以获得ICMP数据包
C:\Users\cupid>ping 192.168.1.2 -n 1
正在 Ping 192.168.1.2 具有 32 字节的数据:
来自 192.168.1.2 的回复: 字节=32 时间<1ms TTL=255
192.168.1.2 的 Ping 统计信息:
数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
可以采用抓包工具如下:

2.ICMP的数据格式
ICMP 的数据包格式
ICMP 数据包封装在 IP 数据包中,其格式如下:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 类型 | 1 | ICMP 消息类型(例如,回显请求、目标不可达等) |
| 代码 | 1 | ICMP 消息代码(用于进一步细化类型字段) |
| 校验和 | 2 | ICMP 数据包的校验和 |
| 数据 | 可变 | ICMP 数据(例如,回显请求/响应数据、错误信息等) |
ICMP 的常见消息类型
- 类型 0:回显响应(Echo Reply)
- 类型 3:目标不可达(Destination Unreachable)
- 类型 5:路由器重定向(Redirect)
- 类型 8:回显请求(Echo Request)
- 类型 11:超时(Time Exceeded)
- 类型 12:参数问题(Parameter Problem)

而ICMP包在IP包中的数据区。
总结如下: 以太网头部---->IP包头部---->ICMP
6+6+2 20 4+N
三. 数据分析
请求数据
0000 02 00 00 30 00 4a 00 e0 4c 68 03 8d 08 00 45 00
0010 00 3c f2 80 00 00 80 01 00 00 c0 a8 01 68 c0 a8
0020 01 02 08 00 4d 39 00 01 00 22 61 62 63 64 65 66
0030 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76
0040 77 61 62 63 64 65 66 67 68 69
首先,我们需要明确数据的格式和各个字段的含义。这段数据是一个完整的以太网帧,包含了以太网头部、IP 头部和 ICMP 数据。
1. 以太网头部(0000 - 0010)
以太网头部的格式如下:
| 字段名称 | 长度(字节) | 描述 |
|---|---|---|
| 目的 MAC 地址 | 6 | 目的设备的 MAC 地址 |
| 源 MAC 地址 | 6 | 发送设备的 MAC 地址 |
| 类型/长度 | 2 | 表示上层协议类型(如 IPv4、IPv6) |
从数据中提取:
0000 02 00 00 30 00 4a 00 e0 4c 68 03 8d 08 00
- 目的 MAC 地址:
02:00:00:30:00:4a - 源 MAC 地址:
00:e0:4c:68:03:8d - 类型/长度:
08 00,表示 IPv4(0x0800)
2. IP 头部(0010 - 0030)
IP 头部的格式如下:
| 字段名称 | 长度(字节) | 描述 |
|---|---|---|
| 版本 | 1/4 | IP 协议版本(IPv4 为 4) |
| 头部长度 | 1/4 | IP 头部长度(单位为 32 位字) |
| 服务类型 | 1 | 服务质量(现在很少用) |
| 总长度 | 2 | 整个 IP 数据报的长度(包括头部和数据部分) |
| 标识 | 2 | 用于分片和重组 |
| 标志 | 1/3 | 分片标志 |
| 片偏移 | 2/3 | 分片偏移量 |
| 生存时间(TTL) | 1 | 数据报的最大跳数 |
| 协议 | 1 | 上层协议类型(如 ICMP、TCP、UDP) |
| 头部校验和 | 2 | IP 头部的校验和 |
| 源 IP 地址 | 4 | 发送方 IP 地址 |
| 目的 IP 地址 | 4 | 接收方 IP 地址 |
从数据中提取:
0010 45 00 00 3c f2 80 00 00 80 01 00 00 c0 a8 01 68
0020 c0 a8 01 02
- 版本:
4(IPv4) - 头部长度:
5(单位为 32 位字,即 20 字节) - 服务类型:
0 - 总长度:
00 3c(十进制为 60 字节) - 标识:
f2 80(十进制为 62080) - 标志:
0(不分片) - 片偏移:
0 - 生存时间(TTL):
80(十进制为 128) - 协议:
01(ICMP) - 头部校验和:
00 00(校验和通常在发送时计算,这里可能被清零) - 源 IP 地址:
c0 a8 01 68(十进制为 192.168.1.104) - 目的 IP 地址:
c0 a8 01 02(十进制为 192.168.1.2)
3. ICMP 数据(0030 - 0040)
ICMP 数据的格式如下:
| 字段名称 | 长度(字节) | 描述 |
|---|---|---|
| 类型 | 1 | ICMP 消息类型(如回显请求为 8,回显应答为 0) |
| 代码 | 1 | ICMP 消息代码 |
| 校验和 | 2 | ICMP 数据的校验和 |
| 标识符 | 2 | 用于区分不同的请求 |
| 序列号 | 2 | 用于区分同一请求中的不同数据包 |
| 数据 | 可变 | 用户数据或测试数据 |
从数据中提取:
0030 08 00 4d 39 00 01 00 22 61 62 63 64 65 66 67 68
0040 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61
0050 62 63 64 65 66 67 68 69
- 类型:
08(回显请求) - 代码:
00(无错误) - 校验和:
4d 39(十六进制为 0x4d39) - 标识符:
00 01(十进制为 1) - 序列号:
00 22(十进制为 34) - 数据:
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69(ASCII 为abcdefghijklmnopqrstuvwabcdefghi)
总结
这段数据是一个 ICMP 回显请求(Ping 请求)消息。
- 以太网头部:
- 目的 MAC 地址:
02:00:00:30:00:4a - 源 MAC 地址:
00:e0:4c:68:03:8d - 类型:IPv4(0x0800)
- 目的 MAC 地址:
- IP 头部:
- 版本:IPv4
- 头部长度:20 字节
- 总长度:60 字节
- 标识:62080
- TTL:128
- 协议:ICMP
- 源 IP 地址:192.168.1.104
- 目的 IP 地址:192.168.1.2
- ICMP 数据:
- 类型:回显请求(8)
- 代码:0
- 校验和:0x4d39
- 标识符:1
- 序列号:34
- 数据:
abcdefghijklmnopqrstuvwabcdefghi
这个 ICMP 回显请求是从 IP 地址为 192.168.1.104 的主机发送到 IP 地址为 192.168.1.2 的主机的。
数据响应
0000 00 e0 4c 68 03 8d 02 00 00 30 00 4a 08 00 45 00
0010 00 3c f2 80 00 00 ff 01 45 85 c0 a8 01 02 c0 a8
0020 01 68 00 00 55 39 00 01 00 22 61 62 63 64 65 66
0030 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76
0040 77 61 62 63 64 65 66 67 68 69
我们来逐步解析这段 ICMP 数据。这段数据是一个完整的以太网帧,包含了以太网头部、IP 头部和 ICMP 数据。以下是详细的解析过程:
1. 以太网头部(0000 - 0010)
以太网头部的格式如下:
| 字段名称 | 长度(字节) | 描述 |
|---|---|---|
| 目的 MAC 地址 | 6 | 目的设备的 MAC 地址 |
| 源 MAC 地址 | 6 | 发送设备的 MAC 地址 |
| 类型/长度 | 2 | 表示上层协议类型(如 IPv4、IPv6) |
从数据中提取:
0000 00 e0 4c 68 03 8d 02 00 00 30 00 4a 08 00
- 目的 MAC 地址:
00:e0:4c:68:03:8d - 源 MAC 地址:
02:00:00:30:00:4a - 类型/长度:
08 00,表示 IPv4(0x0800)
2. IP 头部(0010 - 0030)
IP 头部的格式如下:
| 字段名称 | 长度(字节) | 描述 |
|---|---|---|
| 版本 | 1/4 | IP 协议版本(IPv4 为 4) |
| 头部长度 | 1/4 | IP 头部长度(单位为 32 位字) |
| 服务类型 | 1 | 服务质量(现在很少用) |
| 总长度 | 2 | 整个 IP 数据报的长度(包括头部和数据部分) |
| 标识 | 2 | 用于分片和重组 |
| 标志 | 1/3 | 分片标志 |
| 片偏移 | 2/3 | 分片偏移量 |
| 生存时间(TTL) | 1 | 数据报的最大跳数 |
| 协议 | 1 | 上层协议类型(如 ICMP、TCP、UDP) |
| 头部校验和 | 2 | IP 头部的校验和 |
| 源 IP 地址 | 4 | 发送方 IP 地址 |
| 目的 IP 地址 | 4 | 接收方 IP 地址 |
从数据中提取:
0010 45 00 00 3c f2 80 00 00 ff 01 45 85 c0 a8 01 02
0020 c0 a8 01 68
- 版本:
4(IPv4) - 头部长度:
5(单位为 32 位字,即 20 字节) - 服务类型:
0 - 总长度:
00 3c(十进制为 60 字节) - 标识:
f2 80(十进制为 62080) - 标志:
0(不分片) - 片偏移:
0 - 生存时间(TTL):
ff(十进制为 255) - 协议:
01(ICMP) - 头部校验和:
45 85(十六进制为 0x4585) - 源 IP 地址:
c0 a8 01 02(十进制为 192.168.1.2) - 目的 IP 地址:
c0 a8 01 68(十进制为 192.168.1.104)
3. ICMP 数据(0030 - 0040)
ICMP 数据的格式如下:
| 字段名称 | 长度(字节) | 描述 |
|---|---|---|
| 类型 | 1 | ICMP 消息类型(如回显请求为 8,回显应答为 0) |
| 代码 | 1 | ICMP 消息代码 |
| 校验和 | 2 | ICMP 数据的校验和 |
| 标识符 | 2 | 用于区分不同的请求 |
| 序列号 | 2 | 用于区分同一请求中的不同数据包 |
| 数据 | 可变 | 用户数据或测试数据 |
从数据中提取:
0030 00 00 55 39 00 01 00 22 61 62 63 64 65 66 67 68
0040 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61
0050 62 63 64 65 66 67 68 69
- 类型:
00(回显应答) - 代码:
00(无错误) - 校验和:
55 39(十六进制为 0x5539) - 标识符:
00 01(十进制为 1) - 序列号:
00 22(十进制为 34) - 数据:
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69(ASCII 为abcdefghijklmnopqrstuvwabcdefghi)
总结
这段数据是一个 ICMP 回显应答(Ping 响应)消息,具体信息如下:
- 以太网头部:
- 目的 MAC 地址:
00:e0:4c:68:03:8d - 源 MAC 地址:
02:00:00:30:00:4a - 类型:IPv4(0x0800)
- 目的 MAC 地址:
- IP 头部:
- 版本:IPv4
- 头部长度:20 字节
- 总长度:60 字节
- 标识:62080
- TTL:255
- 协议:ICMP
- 源 IP 地址:192.168.1.2
- 目的 IP 地址:192.168.1.104
- ICMP 数据:
- 类型:回显应答(0)
- 代码:0
- 校验和:0x5539

浙公网安备 33010602011771号