怎样在macOS上抓iPhone的数据包

背景

老板有个移动办公的 APP 在公司使用无线网络时老报“超时”错误,于是就让解决这个问题。我们为了定位问题,做了几个测试:

  1. 使用办公无线网络使用此 APP,错误可以重复、稳定复现
  2. 使用 4G 或在家使用此 APP,没有任何问题
  3. 把手机用 usb 连上电脑,让数据走电脑的有线来访问服务器,结果发现 APP 没有问题
  4. 把手机连上办公室其他 wifi 设备,发现使用 APP 也没有问题

最后,还是要听手机上的网络数据包来分析问题。

方案

业界听手机数据包的几种方案,大都不太合适,因为基本原理就是把数据包先扔到电脑上,这样就能在电脑上来听包了,但这样的话,我们的数据都是走电脑到达服务器的,这样的场景我们测试了,从电脑的有线网络走是没有问题的!

当然,也不是所有的方案都不合适,这样的话也就不会有这篇文章了:)Xcode 的 xcode command line tools 中的工具 rvictl 就非常适合我们的场景。

具体步骤

软件安装

安装 Xcode,然后安装 Xcode command line tools,这就不多说了。

取得设备UDID

  1. iPhone 用数据线连上 macOS
  2. 在 macOS 上打开 iTunes
  3. 在 iPhone 这个设备上,Settings->Summary 中,右侧页面中找到 UDID 值(如果找不到,多次点击 ECID、Moel Identifier 或 Serial Number 即可找到)

映射虚拟网络设备

1
2
rvictl -s <udid>;
# 这里的 <udid> 即为上一步看到的设备 UDID

成功后会发现在 macOS 系统下多出一个网络设备:rvi0,这便是 iPhone 的“网络设备”在 macOS 上的映射,要听 iPhone 的数据包,直接听这个设备的包即可。

听包

这一步简单了,直接打开 Wireshark,然后选 rvi0 设备抓包就好了。或者是先用 tcpdump 对 rvi0 抓包,最后再用 Wireshark 分析。

附上 tcpdump 的命令行:

1
2
3
sudo tcpdump -nn -i rvi0 -vvv -X -s 1024 -w iphone.wifi.pcap;
# 这里的 iphone.wifi.pcap 为数据包保存的数据文件
# 弄完可以扔给 Wireshark 分析

开始听包后,直接操作手机使用 APP,尽量使得错误复现,多重复几次以后,Ctrl+C 终止掉听包程序 tcpdump,记得 iphone.wifi.pcap 可用于 Wireshark 分析

删掉虚拟网络设备

最后记得删除掉映射的网络设备

1
2
rvictl -x <udid>;
# 这里的 <udid> 即为前面 iTunes 上看到的设备 UDID

后话

关于老板的这个问题解决了没有呢?虽然这不是这篇文章的重点,既然开头用这个作为引子引出本文,这里还是再点一下。最终只是确认了无线网络有问题,iPhone 通过 AP 往服务器回的 ACK 的包到达 AP 时已经被延时 1s 多了,但是 iPhone 上看到的数据包是及时发出去的。