最近有个业务是设备需要呼叫手机,要求手机在后台的情况下,也要接收到来电;iPhone手机在后台也能响应呼叫,应该就只有VOIP和推送了。VOIP是指手机后台化之后,系统会维持一条与服务器的长连接,当设备呼叫手机端时,服务器往手机发送一条呼叫指令,系统接收到呼叫指令后,会唤醒应用并执行相应代码,并本地推送. 推送是指通过APNS推送呼叫信息到手机,手机展现远程推送.关于VOIP,发现失败率挺高的,与想通过APNS实现,那么首要的工作就是对APNS的推送到达率和实时性需要做个测试,这里记录推送的统计过程.

统计方式

这里采取的是通过抓包来获取推送时间,抓包的话就必须了解APNS推送的端口信息,通过苹果官网可以知道

TCP 端口 5223:用于与 Apple 推送通知服务 (APNs) 通信
TCP 端口 2195:用于向 APNs 发送通知
TCP 端口 2196:用于 APNs 反馈服务
TCP 端口 443:设备无法在端口 5223 上与 APNs 通信时,仅在 Wi-Fi 上备用

一般是在5223上抓包就可以,也有发现是需要在443才能抓到.这里主要对5223进行抓包.另外推送都是来自17.0.0.0/8服务器

  • 发送端 - 通过java-apns来往APNS发送推送
java -cp .:../lib/apns-0.1.5-jar-with-dependencies.jar:../lib/log4j-1.2.12.jar:../lib/slf4j-log4j12-1.7.13.jar Pusher 10 20> send_org.log
  • 接收端 - 通过rvictl映射手机的网卡到rvi0
sudo tcpdump -tttt -i rvi0 src port 5223 > recv_org.log
  • 痛点

由于APNS推送后的内容是加密的,因此无法确认发送和收到是否属于同一条,目前采用的是发送不同内容,收到的内容长度不同来区分,我这里做了个统计信息如下:

Payload长度 收到长度
0 250
10 266
26 282
42 298
58 314
74 330

PS: 里面有规律,大家自行查找.

另外,有发现有时推送有过来,但长度并不是预定中

统计分析

通过send_org.log和recv_org.log对比,记录发送推送后是否在规定时间段内收到抓包信息,有则记录时间,并在最终输出report,详见统计结果.

  • TIME - 时间段
  • INTERVAL - 发送时长
  • FROM - 推送服务器
  • TO - 手机IP
  • SEND - 发送数目
  • RECV - 收到数目
  • LOSE - 未收到数目
  • RATE - 到达率
  • AVERAGE REACH TIME - 平均到达时间
  • DETAIL - 详情

统计结果

  • WIFI下(Production)

image

  • 电信3G下(Production)

image