使用tcpdump抓包后按TCP连接对拆分数据

0. 序

最近有个需求,想抓包分析下公司的苹果推送服务,与苹果APNs服务端的TCP连接丢包情况,作为记录写下此文。

公司的推送服务使用的是开源的PyAPNs库,enhanced版本的TCP长连接。开多进程(两台机,每台机10个进程),每个进程会建立一个TCP长连接。

1. tcpdump抓包

  • tcpdump tcp port 2195 -w tcp2195.log

通过执行以上命令,抓取了推送高峰期(19:00 ~ 21:00),该机器与苹果Apns服务端(https://feedback.push.apple.com:2195)的TCP数据包

2. 将步骤1抓取到的数据文件,解析为文本文件

  • tcpdump -r tcp2195.log > tcp2195.log.txt

tcp2195.log.txt文件行的格式如下图所示:

由于抓包抓取的是TCP 2195端口,而上面说了,每个进程会与APNs建立一个长连接(域名feedback.push.apple.com每次的DNS解析结果不完全一样),而且APNs服务端会主动断开TCP连接(如当token非法时,此时进程会重建TCP连接),故抓取到的TCP包数据,里面会有多对TCP连接的数据,且相互交错。相互交错的TCP包交互数据较乱,比较难分析,为此,需要将文件tcp2195.log.txt里的数据,按照TCP连接对分离开来,再进行分析。

3. 获取所有TCP连接对

  • cat tcp2195.log.txt | awk ‘{print $3,$5}’ | awk -F”:” ‘{print $1}’ | sort -u > peer_2195.log

peer_2195.log文件行的格式如下图所示:

由于抓取的是TCP 2195端口的数据包,可能会包括本机:2195的TCP连接对,需手工将这样的连接对删除,保存后wc -l看下还剩多少行(458行)。由于经过sort -u后已经是有序了,取后面一半即是我们需要关注的:本机:random_port <--> apns:2195的所有TCP连接

4. 按TCP连接对拆分数据

  • mkdir logs
  • tail -n -229 peer_2195.log | awk ‘{print $1}’ | xargs -I@ bash -c “grep @ tcp2195.log.txt > logs/@.log”

5. 分析TCP连接交互数据流

至此,就可以根据上面的文件去分析每个TCP连接的具体数据流交互情况,此部分就不详述了,可以查阅《TCP详解 - 卷1》