网络层IP数据包解析-tcpdump抓包ping应用
准备工作
- client_ip : 111.198.231.243
- server_ip : 115.159.105.52
ping命令
一个常见的工具Ping。
ping是利用ICMP,ICMP 依靠IP来完成它的任务,是IP的附属协议。
ICMP协议
- ICMP封装在IP数据包内部
类型 | 子类型代码 | 描述 |
---|---|---|
0 | 0 | echo响应 |
8 | 0 | echo请求 |
报文
客户端:
$ man ping
$ ping 115.159.105.52
$ ping -m 20 -s 20 115.159.105.52 -c 2
- -m 发送包的ttl
- -s 包数据部分大小
- -c 指定ping几次
└─[$]> ping -m 20 -s 20 115.159.105.52 -c 10
PING 115.159.105.52 (115.159.105.52): 20 data bytes
28 bytes from 115.159.105.52: icmp_seq=0 ttl=52 time=37.612 ms
28 bytes from 115.159.105.52: icmp_seq=1 ttl=52 time=36.979 ms
服务端:
$ man tcpdump
$ sudo tcpdump icmp -l
$ sudo tcpdump icmp -Xl and host 111.198.231.243
- -l 参数表示行缓冲 标准输出更快看到
- -X 打印出包的首部和数据
work@VM_16_138_centos:~$ sudo tcpdump -n icmp -Xl and host 111.198.231.243
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:07:32.249638 IP 111.198.231.243 > 10.154.16.138: ICMP echo request, id 19341, seq 0, length 28
0x0000: 4568 0030 bb1c 0000 0c01 806b 6fc6 e7f3 Eh.0.......ko...
0x0010: 0a9a 108a 0800 cbfe 4b8d 0000 6413 cb65 ........K...d..e
0x0020: 000d 6299 0809 0a0b 0c0d 0e0f 1011 1213 ..b.............
10:07:32.249657 IP 10.154.16.138 > 111.198.231.243: ICMP echo reply, id 19341, seq 0, length 28
0x0000: 4568 0030 23aa 0000 4001 e3dd 0a9a 108a Eh.0#...@.......
0x0010: 6fc6 e7f3 0000 d3fe 4b8d 0000 6413 cb65 o.......K...d..e
0x0020: 000d 6299 0809 0a0b 0c0d 0e0f 1011 1213 ..b.............
10:07:33.252471 IP 111.198.231.243 > 10.154.16.138: ICMP echo request, id 19341, seq 1, length 28
0x0000: 4568 0030 be86 0000 0c01 7d01 6fc6 e7f3 Eh.0......}.o...
0x0010: 0a9a 108a 0800 bfba 4b8d 0001 6413 cb66 ........K...d..f
0x0020: 000d 6edb 0809 0a0b 0c0d 0e0f 1011 1213 ..n.............
10:07:33.252491 IP 10.154.16.138 > 111.198.231.243: ICMP echo reply, id 19341, seq 1, length 28
0x0000: 4568 0030 23d8 0000 4001 e3af 0a9a 108a Eh.0#...@.......
0x0010: 6fc6 e7f3 0000 c7ba 4b8d 0001 6413 cb66 o.......K...d..f
0x0020: 000d 6edb 0809 0a0b 0c0d 0e0f 1011 1213 ..n.............
服务端打出的信息,第一段是ICMP的请求信息,第二段是响应信息。
第一行:id 19341, seq 0, length 28
- id 19341 表示的ICMP数据中的标识符,其实就是区分客户端ping程序的进程标识符;
- seq 0 表示的ICMP数据中的序号;
- length 28表示的 ICMP数据部分长度。
第二行:0x0000: 4568 …
可以看到地址是从低(0x0000)到高(0x0020)展示的。这些16进制数据即是IP数据报的信息。4568是IP首部的起始部分,占两个字节。
IP首部:
下面数据和IP首部对应说明:
0x0000: 4568 0030 bb1c 0000 0c01 806b 6fc6 e7f3
0x0010: 0a9a 108a 0800 cbfe 4b8d 0000 6413 cb65
0x0020: 000d 6299 0809 0a0b 0c0d 0e0f 1011 1213
45 :是第一个字节,前4位表示IP协议版本,IPv4。 接下来的4位表示IP首部长度,表示占用32bit(4字节)的数量,这里是5(最小也是5),即5*4=20字节,首部长度20字节。
68 :是第二个字节,表示服务类型,这个不重要,一般情况下不用这个字段。
0030: 第3、4字节,表示IP数据包总长度,为48字节长。48包括 20字节的IP首部长度,28字节的ICMP报文长度(8个字节的ICMP首部长度,和 ping 参数指定的20字节ICMP 数据长度)。
bb1c:5-6字节,表示IP首部的标识符,唯一地标识一个报文的所有分片。
0000: 7-8字节,3位的标志,和13位的偏移量。
0c :8位ttl。c是12,表示从客户端到该服务器,中间经过了 20-12=8个路由器。20是ping参数 -m ttl指定值。
01 :8位的协议类型。1表示ICMP协议类型
806b:表示16位首部校验和。
6fc6 e7f3:这4个字节表示客户端ip ,第一行显示的 111.198.231.243 (16进制转10进制:6f => 111,c6 => 198)
0a9a 108a:这4个字节表示服务器的目的ip,因为经过了NAT转换,这里的目的ip是内网IP:10.154.16.138
以上20个字节就是整个IP首部长度信息。
IP数据部分:
ICMP包裹在IP包里,属于IP数据部分。只看下ICMP首部数据,8个字节长。
0800:08表示ICMP的类型是回显请求。00表示代码。
cbfe:表示校验和。
4b8d:表示ICMP首部标识符。ping应用里一般指客户端的进程id或者类似描述客户端进程的描述符。十进制19341,就是前面第一行显示的id。
0000:表示序列号,ping每发送一次递增的序号。0 即是第一行的seq。
以上8个字节是ICMP首部信息
综上就是我们利用tcpdump命令来抓包ping应用,查看网络层数据包的信息了。通过这次实践,能加深对网络层数据的理解。