免責聲明: 本文檔可能包含第三方產品資訊,該資訊僅供參考。螞蟻科技對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。
簡介
網路是行動裝置 App生命線,網路層面的各種問題會給行動裝置 App帶來許多迷惑的行為和癥狀。通過抓取網路包資料,可以針對性地分析由網路層面問題引起的各種癥狀,包括串連中斷、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 for Android 。
-
安裝 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 停止抓包,將捕獲的報文儲存到合適的地方。