全部产品

如何抓取网络包

更新时间:2020-03-25 20:56:23

免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

简介

网络是移动应用生命线,网络层面的各种问题会给移动应用带来许多迷惑的行为和症状。通过抓取网络包数据,可以针对性地分析由网络层面问题引起的各种症状,包括链接中断、TLS 握手失败、DNS 解析失败等错误。

  • 抓取网络包不再像 Charles/Fiddler 那样可以通过“中间人”代理模式来捕获报文,TCP 报文的抓取一般是非侵入试的,通过监听网卡接口数据,直接进行 TCP 报文的“镜像”捕获。
  • 在一般场景下,可以抓包的点比较多,可以在客户端抓(A),可以在中间设备上抓(B),也可以在服务端上抓(C),见下图。
    points

TCP 日志捕获工具

Charles 和 Fiddler 可以帮助捕获和分析 HTTP 层面的问题,如果问题发生在 TCP/IP 层面,则需要 TCP 报文的捕获和分析工具。Wireshark(支持 Mac/Windows 平台)、Network Monitor(Windows 平台)和 TCPDUMP 是常用的三种网络层抓包工具。比较常见的网络层问题包括 SSL 握手失败和 TCP 链接中断、重发等。

使用常见抓包工具

本节介绍 Wireshark 和 TCPDUMP 的基本使用方法。

Wireshark

下载和安装

Wireshark 官网 下载安装包,安装并启动后,主界面如下(Mac 和 Windows 版本界面略有差别):

interface

启动抓包

在 Wireshark 主界面上,可以看到本机的网络接口:

network interface

以本机为例,双击 Wi-Fi: en0 接口开始抓取该网卡接口上的网络包。

start

停止抓包
  • 点击菜单栏上的红色停止按钮(快捷键 CMD+E)可停止抓包。
  • 点击保存按钮(快捷键 CMD+S)可保存捕获的网络包,以便离线分析。
    stop

TCPDUMP

Tcpdump 是一个小巧紧致的命令行网络包捕获、分析工具。虽然易用性上和 Wireshark 比稍微差,但优势是可以运行在更多的平台和环境下,方便直接在客户端或服务端进行抓包。

基本使用

Tcpdump 在不同环境下支持的参数并不完全相同,建议通过 man tcpdump 命令确认当前支持的参数类型和使用方法。

一个常见的基本命令组合如下:

  1. // 抓取完整报文并报错到文件中
  2. tcpdump -s 0 -w myCapture.pcap

点击这里 查看更多命令。

手机端抓包

如文档顶部的图中所示,针对客户端的 TCP 抓包可以在两处进行:

  • 客户端出口
  • 网络接入点入口

本节介绍在 Point A (即客户端出口)处的抓包方式。

iOS 平台

iOS 客户端出口抓包需要把 iOS 移动设备通过 USB 连接到 MacBook 上,并在 Mac 上建立的一个该设备网卡的虚拟映射。Wireshark 通过该虚拟网卡捕获 iOS 移动设备上的网络包。

  1. 获取 iPhone 的 UDID。
    将 iOS 移动设备通过 USB 接口连接到 Mac 上,然后在终端上使用如下命令获取 iOS 设备的 UDID(Serial Number):
    1. $ system_profiler SPUSBDataType
    Serial Number
    或者通过 Xcode > Window > Devices and Simulators 查看 UDID(Identifiler)。
    Identifiler
  2. 创建虚拟网卡映射。
    1. $ rvictl -s < Your Device UUID >
    2. Starting device < Your Device UUID > [SUCCEEDED] with interface rvi0
    mapping
    其中 rvi0 即虚拟网卡名。
  3. 启动抓包(以 Wireshark 为例)。
    打开 Wireshark,本地接口列表界面中出现了 rvi0。图示如下:
    rvi0
    双击 rvi0 进入抓包界面,进入默认自动开始抓包。
    start
  4. 停止抓包。
    问题复现后,需要停止抓包时,在菜单栏点击结束按钮(快捷键 CMD+E)停止抓包,点击保存按钮(快捷键 CMD+S)保存报文。
    stop

Android 平台

Android 客户端出口抓包需要提前获取设备 root 权限,通过 ADB 在设备上调用 tcpdump 命令实现抓包。

  1. 下载 TCPDump for Android
  2. 安装 TCPDump。通过如下命令把 TCPDump 安装到设备上,并赋予执行权限:
    1. adb push tcpdump /data/local/tcpdump
    2. adb shell chmod 6755 /data/local/tcpdump
  3. 启动 TCPDUMP 开始抓包。
    1. cd /data/local
    2. ./tcpdump -i any -p -s 0 -w /sdcard/myCapture.pcap
    点击这里 查看 TCPDUMP 参数详细配置。
  4. 停止抓包,获取数据。
    问题复现后,需要停止抓包时,根据提示停止抓包(快捷键 Ctrl+C)。通过如下命令将报文数据复制出来:
    1. adb pull /sdcard/myCapture.pcap

中间设备抓包

如文档顶部的图中所示,针对客户端的 TCP 抓包可以在两处进行:

  • 客户端出口
  • 网络接入点入口

本节介绍在 Point B(即接入设备入口)处的抓包方式。

  1. 抓包网络拓扑配置。这种抓包模式的一种常见网络链接配置如下:
    用一台 Mac 或 PC 作为抓包设备,该机器需要提前配置好双网卡,其中一块网卡需要有发射无线热点的能力。客户端通过 Wi-Fi 连接到配置好的无线热点中,Mac 或 PC 的另一块网卡接入正常网络。
    topology
  2. 启动抓包(以 Wireshark 为例)。
    打开 Wireshark,找到手机接入的无线热点网卡(上图中的网卡 1),双击该网卡标识开始抓包。
  3. 停止抓包。
    问题复现后,需要停止抓包时,在菜单栏点击结束按钮(快捷键 CMD+E)停止抓包,再点击保存按钮(快捷键 CMD+S)保存报文。
说明:“中间设备”类型可能有很多种,本节介绍的只是其中一种。在实践中,可以用不同的工具在不同的设备上进行同类型的抓包工作。需要注意的是,尽量在第一个接入设备上抓取,避免中间过程的干扰。

服务端抓包

如文档顶部的图中所示,某些问题需要在服务端启动抓包,本节以 TCPDUMP 为例。

  1. 安装 TCPDUMP。
    • 在 CentOS 上安装:
      1. yum install tcpdump
    • 在 Debian 和 Ubuntu 上安装:
      1. apt-get install tcpdump
      您可前往 TCPDUMP 官网 查看其他详情。
  2. 启动抓包。
    TCPDUMP 本身可配置的参数较多,可以结合具体场景进行参数配置,例如:
    1. tcpdump -s 0 -w myCapture.pcap
    更多参数详见 TCPDUMP 官方文档
  3. 停止抓包。
    问题复现后,需要停止抓包时,按下 Ctrl+C 停止抓包,将捕获的报文保存到合适的地方。