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》