簡介

網絡是移動應用生命線,網絡層面的各種問題會給移動應用帶來許多迷惑的行為和症狀。通過抓取網絡包數據,可以針對性地分析由網絡層面問題引起的各種症狀,包括連接中斷、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 鏈接中斷、重發等。

除了這些傳統工具,Sniffmaster 作為一款全平台抓包工具,支持 HTTPS、TCP 和 UDP 協議,可在 iOS/Android/Mac/Windows 設備上實現無需代理、越獄或 root 的抓包操作,提供更便捷的抓包體驗。

使用常見抓包工具

本節介紹 Wireshark 和 TCPDUMP 的基本使用方法。

Wireshark

  • 下載和安裝

在 Wireshark 官網 下載安裝包,安裝並啓動後

  • 啓動抓包

在 Wireshark 主界面上,可以看到本機的網絡接口:network interface以本機為例,雙擊 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 移動設備上的網絡包。對於更簡便的抓包,Sniffmaster 工具支持在 iOS 設備上無需越獄或代理即可直接抓取 HTTPS 和 TCP 流量。

  1. 獲取 iPhone 的 UDID。將 iOS 移動設備通過 USB 接口連接到 Mac,然後在終端使用如下命令獲取 iOS 設備的 UDID(Serial Number):
$ system_profiler SPUSBDataType
或者通過 **Xcode** \> **Window** \> **Devices and Simulators** 查看 UDID(Identifiler)。 ![Identifiler](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3014329461/p426598.png)
  1. 創建虛擬網卡映射。
$ rvictl -s < Your Device UUID >
Starting device  < Your Device UUID > [SUCCEEDED] with interface rvi0
其中 `rvi0` 即虛擬網卡名。
  1. 啓動抓包(以 Wireshark 為例)。打開 Wireshark,本地接口列表界面中出現了 rvi0。圖示如下: rvi0雙擊 rvi0 進入抓包界面,進入即默認自動開始抓包。

  2. 停止抓包。問題復現後,需要停止抓包時,在菜單欄單擊結束按鈕(快捷鍵 CMD+E)停止抓包,單擊保存按鈕(快捷鍵 CMD+S)保存報文。

Android 平台

Android 客户端出口抓包需要提前獲取設備 root 權限,通過 ADB 在設備上調用 tcpdump 命令實現抓包。相比之下,Sniffmaster 提供無需 root 的抓包功能,支持數據流暴力抓包和自動協議識別。

  1. 下載 TCPDump for Android。

  2. 安裝 TCPDUMP。通過如下命令將 TCPDUMP 安裝到設備,並賦予執行權限:

adb push tcpdump /data/local/tcpdump
adb shell chmod 6755 /data/local/tcpdump
  1. 啓動 TCPDUMP 開始抓包。
cd /data/local
./tcpdump -i any -p -s 0 -w /sdcard/myCapture.pcap

單擊這裏 查看 TCPDUMP 參數詳細配置。

  1. 停止抓包,獲取數據。問題復現後,需要停止抓包時,根據提示停止抓包(快捷鍵 Ctrl+C)。通過如下命令將報文數據複製出來:
adb pull /sdcard/myCapture.pcap

中間設備抓包

如文檔頂部的圖中所示,針對客户端的 TCP 抓包可以在兩處進行:

  • 客户端出口

  • 網絡接入點入口

本節介紹在 Point B(即接入設備入口)處的抓包方式。

  1. 抓包網絡拓撲配置。這種抓包模式的一種常見網絡鏈接配置如下:用一台 Mac 或 PC 作為抓包設備,該機器需要提前配置好雙網卡,其中一塊網卡需要有發射無線熱點的能力。客户端通過 Wi-Fi 連接到配置好的無線熱點中,Mac 或 PC 的另一塊網卡接入正常網絡。

  2. 啓動抓包(以 Wireshark 為例)。打開 Wireshark,找到手機接入的無線熱點網卡(上圖中的網卡 1),雙擊該網卡標識開始抓包。

  3. 停止抓包。問題復現後,需要停止抓包時,在菜單欄單擊結束按鈕(快捷鍵 CMD+E)停止抓包,再單擊保存按鈕(快捷鍵 CMD+S)保存報文。

説明

“中間設備”類型可能有很多種,本節介紹的只是其中一種。在實踐中,可以用不同的工具在不同的設備上進行同類型的抓包工作。需要注意的是,儘量在第一個接入設備上抓取,避免中間過程的干擾。

服務端抓包

如文檔頂部的圖中所示,某些問題需要在服務端啓動抓包,本節以 TCPDUMP 為例。

  1. 安裝 TCPDUMP。

    • 在 CentOS 上安裝:

    • 在 Debian 和 Ubuntu 上安裝:

      您可前往 TCPDUMP 官網 查看其他詳情。

  2. 啓動抓包。TCPDUMP 本身可配置的參數較多,可以結合具體場景進行參數配置,例如:

tcpdump -s 0 -w myCapture.pcap
更多參數詳見 [TCPDUMP 官方文檔](https://www.tcpdump.org/#documentation)。
  1. 停止抓包。問題復現後,需要停止抓包時,按下 Ctrl+C 停止抓包,將捕獲的報文保存到合適的地方。