前段时间和其中一家供应商做GPS对接的时候遇到了一个问题,他们是用809协议向我们发送GPS数据,但是我们的DB中一直查不到发过来的数据而且log中根据他们的IP也没有找到发过来的数据,但是他们一直说发过来了,这个时候怎么办呢?于是从网上找到了一个linux上截获网络数据包的命令TCPDUMP。
TCPDUMP可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
了解了这个TCPDUMP的命令之后我们就可以通过下面这个命令获取指定IP发送过来的数据包
tcpdump -XX -vvv -nn -i eth1 src host xxx.x.xxx.xxx
- -v:当分析和打印的时候,产生详细的输出。
- -vv:产生比-v更详细的输出。
- -vvv:产生比-vv更详细的输出。
- -XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出。
- -nn :直接以IP以及PORT number显示,而非主机名与服务名称
- -i : interface:指定tcpdump需要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),一旦找到第一个符合条件的接口,搜寻马上结束。可以使用'any'关键字表示所有网络接口。
- src : 指定ID的方向 有两个值可以选择:src/dst
- host : 指定ID的类型, 有四个值供选择:host/net/port/portrange
- 最后的 xxx.x.xxx.xxx就是ID,在本例中因为指定的type是host,所以是IP地址。
在输入上述的命令之后我们会得到下面这个结果:
[root@iZ23yaz766kZ ~]# tcpdump -XX -vvv -nn -i eth1 src host 218.3.146.108
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
15:10:16.719574 IP (tos 0x14, ttl 52, id 24439, offset 0, flags [DF], proto TCP (6), length 131)
218.3.146.108.3956 > 121.41.59.24.14567: Flags [P.], cksum 0x2a72 (correct), seq 2382504609:2382504700, ack 3842476699, win 251, length 91
0x0000: 0016 3e00 422c eeff ffff ffff 0800 4514 ..>.B,........E.
0x0010: 0083 5f77 4000 3406 c638 da03 926c 7929 .._w@.4..8...ly)
0x0020: 3b18 0f74 38e7 8e02 22a1 e507 8a9b 5018 ;..t8...".....P.
0x0030: 00fb 2a72 0000 5b00 0000 5a02 003c 268e ..*r..[...Z..<&.
0x0040: 1200 0004 e24c 0102 0f01 0000 0001 930a .....L..........
0x0050: 8c81 56d6 94dd 6605 6c2c 4699 a51c fa73 ..V...f.l,F....s
0x0060: e5ee 7984 5388 e624 57f4 964a 3803 e0d4 ..y.S..$W..J8...
0x0070: 31b5 c2a3 b242 1cd8 b342 a7cb 921a c100 1....B...B......
0x0080: ec1a 1bf1 7acb 11f6 ede3 59fc 25b8 e5b7 ....z.....Y.%...
0x0090: 5d ]
15:10:17.159556 IP (tos 0x14, ttl 52, id 24491, offset 0, flags [DF], proto TCP (6), length 132)
218.3.146.108.3956 > 121.41.59.24.14567: Flags [P.], cksum 0x0661 (correct), seq 91:183, ack 1, win 251, length 92
0x0000: 0016 3e00 422c eeff ffff ffff 0800 4514 ..>.B,........E.
0x0010: 0084 5fab 4000 3406 c603 da03 926c 7929 .._.@.4......ly)
0x0020: 3b18 0f74 38e7 8e02 22fc e507 8a9b 5018 ;..t8...".....P.
0x0030: 00fb 0661 0000 5b00 0000 5a02 003c 268f ...a..[...Z..<&.
0x0040: 1200 0004 e24c 0102 0f01 0000 0001 930a .....L..........
0x0050: 8c86 57d5 97dd 6605 6c2c 4699 a51c fa73 ..W...f.l,F....s
0x0060: e5ee 7984 5388 e624 57f4 964a 3803 e0d4 ..y.S..$W..J8...
0x0070: 31b7 c2a9 b9d8 1cee 095a 01a7 8392 52c1 1........Z....R.
0x0080: 0351 5c1a bd7a c011 f6ed e259 fc25 b82b .Q\..z.....Y.%.+
0x0090: bf5d .]
15:10:17.179580 IP (tos 0x14, ttl 52, id 24497, offset 0, flags [DF], proto TCP (6), length 131)
218.3.146.108.3956 > 121.41.59.24.14567: Flags [P.], cksum 0xadd0 (correct), seq 183:274, ack 1, win 251, length 91
0x0000: 0016 3e00 422c eeff ffff ffff 0800 4514 ..>.B,........E.
0x0010: 0083 5fb1 4000 3406 c5fe da03 926c 7929 .._.@.4......ly)
0x0020: 3b18 0f74 38e7 8e02 2358 e507 8a9b 5018 ;..t8...#X....P.
0x0030: 00fb add0 0000 5b00 0000 5a02 003c 2690 ......[...Z..<&.
0x0040: 1200 0004 e24c 0102 0f01 0000 0001 930a .....L..........
0x0050: 8cfb 57d1 94d2 6605 6c2c 4699 a51c fa73 ..W...f.l,F....s
0x0060: e5ee 7984 5388 e624 57f4 964a 3803 e0d4 ..y.S..$W..J8...
0x0070: 31b5 c2a9 90b8 1cd3 7f65 a7ce 921f c101 1........e......
0x0080: ecad 1b3b 7acc 11f6 ede2 59fc 25b8 b5b6 ...;z.....Y.%...
0x0090: 5d
这样我们就得到了从指定IP发过来的数据包,我们一起中一个作为样例:
15:10:17.179580 IP (tos 0x14, ttl 52, id 24497, offset 0, flags [DF], proto TCP (6), length 131)
218.3.146.108.3956 > 121.41.59.24.14567: Flags [P.], cksum 0xadd0 (correct), seq 183:274, ack 1, win 251, length 91
0x0000: 0016 3e00 422c eeff ffff ffff 0800 4514 ..>.B,........E.
0x0010: 0083 5fb1 4000 3406 c5fe da03 926c 7929 .._.@.4......ly)
0x0020: 3b18 0f74 38e7 8e02 2358 e507 8a9b 5018 ;..t8...#X....P.
0x0030: 00fb add0 0000 5b00 0000 5a02 003c 2690 ......[...Z..<&.
0x0040: 1200 0004 e24c 0102 0f01 0000 0001 930a .....L..........
0x0050: 8cfb 57d1 94d2 6605 6c2c 4699 a51c fa73 ..W...f.l,F....s
0x0060: e5ee 7984 5388 e624 57f4 964a 3803 e0d4 ..y.S..$W..J8...
0x0070: 31b5 c2a9 90b8 1cd3 7f65 a7ce 921f c101 1........e......
0x0080: ecad 1b3b 7acc 11f6 ede2 59fc 25b8 b5b6 ...;z.....Y.%...
0x0090: 5d
其中前20个字节: 0016 3e00 422c eeff ffff ffff 0800 4514 0083 5fb1 是IP数据报的首部。
后面的32个字节: 4000 3406 c5fe da03 926c 7929 3b18 0f74 38e7 8e02 2358 e507 8a9b 5018 00fb add0是TCP数据报的首部。
最后面的则是TCP的data部分:0000 5b00 0000 5a02 003c 2690 1200 0004 e24c 0102 0f01 0000 0001 930a 8cfb 57d1 94d2 6605 6c2c 4699 a51c fa73 e5ee 7984 5388 e624 57f4 964a 3803 e0d4 31b5 c2a9 90b8 1cd3 7f65 a7ce 921f c101 ecad 1b3b 7acc 11f6 ede2 59fc 25b8 b5b6 5d。
这样我们就获得了从指定IP发送过来的数据,然后就可以进行本地调试来验证数据是否有问题了。