免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。蚂蚁科技对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。
简介
网络是移动应用生命线,网络层面的各种问题会给移动应用带来许多迷惑的行为和症状。通过抓取网络包数据,可以针对性地分析由网络层面问题引起的各种症状,包括连接中断、TLS 握手失败、DNS 解析失败等错误。
抓取网络包不再像 Charles/Fiddler 那样可以通过“中间人”代理模式来捕获报文,TCP 报文的抓取一般是非侵入式的,通过监听网卡接口数据,直接进行 TCP 报文的“镜像”捕获。
在一般场景下,可以抓包的点比较多,可以在客户端抓(A),可以在中间设备上抓(B),也可以在服务端上抓(C),见下图。
TCP 日志捕获工具
Charles 和 Fiddler 可以帮助捕获和分析 HTTP 层面的问题,如果问题发生在 TCP/IP 层面,则需要 TCP 报文的捕获和分析工具。Wireshark(支持 Mac/Windows 平台)、Network Monitor(Windows 平台)和 TCPDUMP 是常用的三种网络层抓包工具。比较常见的网络层问题包括 SSL 握手失败和 TCP 链接中断、重发等。
使用常见抓包工具
本节介绍 Wireshark 和 TCPDUMP 的基本使用方法。
Wireshark
下载和安装
在 Wireshark 官网 下载安装包,安装并启动后,主界面如下(Mac 和 Windows 版本界面略有差别):
启动抓包
在 Wireshark 主界面上,可以看到本机的网络接口:以本机为例,双击 Wi-Fi: en0 接口开始抓取该网卡接口上的网络包。
停止抓包
单击菜单栏上的红色停止按钮(快捷键 CMD+E)可停止抓包。
单击保存按钮(快捷键 CMD+S)可保存捕获的网络包,以便离线分析。
TCPDUMP
TCPDUMP 是一款小巧紧致的命令行网络包捕获、分析工具。虽然在易用性上与 Wireshark 相比稍差,但优势是可以运行在更多的平台和环境下,便于直接在客户端或服务端进行抓包。
基本使用
TCPDUMP 在不同环境下支持的参数并不完全相同,建议通过 man tcpdump
命令确认当前支持的参数类型和使用方法。
一个常见的基本命令组合如下:
// 抓取完整报文并报错到文件中
tcpdump -s 0 -w myCapture.pcap
单击这里 查看更多命令。
手机端抓包
如文档顶部的图中所示,针对客户端的 TCP 抓包可以在两处进行:
客户端出口
网络接入点入口
本节介绍在 Point A (即客户端出口)处的抓包方式。
iOS 平台
iOS 客户端出口抓包需要把 iOS 移动设备通过 USB 连接到 MacBook 上,并在 Mac 上建立的一个该设备网卡的虚拟映射。Wireshark 通过该虚拟网卡捕获 iOS 移动设备上的网络包。
获取 iPhone 的 UDID。将 iOS 移动设备通过 USB 接口连接到 Mac,然后在终端使用如下命令获取 iOS 设备的 UDID(Serial Number):
$ system_profiler SPUSBDataType
或者通过 Xcode > Window > Devices and Simulators 查看 UDID(Identifiler)。
创建虚拟网卡映射。
$ rvictl -s < Your Device UUID > Starting device < Your Device UUID > [SUCCEEDED] with interface rvi0
其中
rvi0
即虚拟网卡名。启动抓包(以 Wireshark 为例)。打开 Wireshark,本地接口列表界面中出现了 rvi0。图示如下: 双击 rvi0 进入抓包界面,进入即默认自动开始抓包。
停止抓包。问题复现后,需要停止抓包时,在菜单栏单击结束按钮(快捷键 CMD+E)停止抓包,单击保存按钮(快捷键 CMD+S)保存报文。
Android 平台
Android 客户端出口抓包需要提前获取设备 root 权限,通过 ADB 在设备上调用 tcpdump
命令实现抓包。
安装 TCPDUMP。通过如下命令将 TCPDUMP 安装到设备,并赋予执行权限:
adb push tcpdump /data/local/tcpdump adb shell chmod 6755 /data/local/tcpdump
启动 TCPDUMP 开始抓包。
cd /data/local ./tcpdump -i any -p -s 0 -w /sdcard/myCapture.pcap
单击这里 查看 TCPDUMP 参数详细配置。
停止抓包,获取数据。问题复现后,需要停止抓包时,根据提示停止抓包(快捷键 Ctrl+C)。通过如下命令将报文数据复制出来:
adb pull /sdcard/myCapture.pcap
中间设备抓包
如文档顶部的图中所示,针对客户端的 TCP 抓包可以在两处进行:
客户端出口
网络接入点入口
本节介绍在 Point B(即接入设备入口)处的抓包方式。
抓包网络拓扑配置。这种抓包模式的一种常见网络链接配置如下:用一台 Mac 或 PC 作为抓包设备,该机器需要提前配置好双网卡,其中一块网卡需要有发射无线热点的能力。客户端通过 Wi-Fi 连接到配置好的无线热点中,Mac 或 PC 的另一块网卡接入正常网络。
启动抓包(以 Wireshark 为例)。打开 Wireshark,找到手机接入的无线热点网卡(上图中的网卡 1),双击该网卡标识开始抓包。
停止抓包。问题复现后,需要停止抓包时,在菜单栏单击结束按钮(快捷键 CMD+E)停止抓包,再单击保存按钮(快捷键 CMD+S)保存报文。
“中间设备”类型可能有很多种,本节介绍的只是其中一种。在实践中,可以用不同的工具在不同的设备上进行同类型的抓包工作。需要注意的是,尽量在第一个接入设备上抓取,避免中间过程的干扰。
服务端抓包
如文档顶部的图中所示,某些问题需要在服务端启动抓包,本节以 TCPDUMP 为例。
安装 TCPDUMP。
在 CentOS 上安装:
yum install tcpdump
在 Debian 和 Ubuntu 上安装:
apt-get install tcpdump
您可前往 TCPDUMP 官网 查看其他详情。
启动抓包。TCPDUMP 本身可配置的参数较多,可以结合具体场景进行参数配置,例如:
tcpdump -s 0 -w myCapture.pcap
更多参数详见 TCPDUMP 官方文档。
停止抓包。问题复现后,需要停止抓包时,按下 Ctrl+C 停止抓包,将捕获的报文保存到合适的地方。