2013年9月3日 星期二

iOS -- Packet Tracing

當我們在 iOS Device 撰寫網路相關的 APP 時,時常需要分析網路上所傳送/接收的封包,由於 iOS 本身並沒有直接支援擷取封包的功能,因此需要使用其他方法來擷取網路封包。以下參考 developer.apple.com,整理封包擷取的方法。



1. 如果測試網路使用 Wi-Fi,那麼可以讓 iOS device 連上一個測試用的 Wi-Fi network
a. 將 Wi-Fi AP 設定為 bridge mode
bridge the Wi-Fi on to an Ethernet and then use standard Ethernet techniques to capture a packet trace.
b. 將 Mac 網路設定為 Internet Sharing
設定 Mac 支援 internet Sharing, 將 iOS device 連上 Mac 所設定的 shared network.
接著便可以在 Mac 上直接使用 wireshark 擷取封包
c. 直接擷取 Wi-Fi 封包
一般而言 Wi-Fi 所傳送的封包都經過加密,因此若要直接擷取 Wi-Fi 封包,便先需要將 AP 的加密解除,或是只設定為 WEP。
設定完成之後,後續的操作可以參考這裡
2. 若 APP使用 HTTP 進行連線,可以使用 debugging HTTP proxy 以取得所有經過 proxy 的封包

3. 在 iOS 5.0 之後的版本可以使用 RVI(Remote Virtual Interface), 其作法如下
a. 將 iOS Device 透過 USB 連接 MAC
b. 在 MAC 上設定 RVI,並且將此 RVI 對應到 iOS Device 的網路堆疊
c. 在 MAC 上針對 RVI 介面,執行擷取封包的程式。

4. RVI 使用舉例:
a. 取得 iOS Device UUID
此步驟可執行 Organizer直接取得,參考下圖中的Identifier。假設UUID為 Identifier 57cd11efbf58a99391b5cb421cc7b05213552fcf

b. 設定 RVI
rvictl -s 57cd11efbf58a99391b5cb421cc7b05213552fcf  
c. 執行封包擷取程式,便可以取得網路端的封包
c1. 執行 "sudo tcpdump -i rvi0 -n" 可以直接看到網路封包,建議使用"sudo tcpdump -i rv0 -n -s 0 -w dumpFile.pcap tcp" 將封包存成檔案後,再使用 wireshark 進行分析


c2. 直接使用wireshark,選擇 rvi0

d. 移除 RVI
rvictl -x 57cd11efbf58a99391b5cb421cc7b05213552fcf

 結論:
自己的使用習慣是使用 RVI並透過wireshark捉取封包,當 RVI 不可行的時候,才會使用其他方式。

參考資料

  • https://developer.apple.com/library/mac/qa/qa1176/_index.html
  • http://blog.manbolo.com/2013/02/22/analysing-ios-app-network-performances-on-cellularwifi