前言
iOS開發(fā)中,常用的都是charles來承擔(dān)抓包的工作勇皇,雖然它能解決90%的場景需求罩句,但是遇到需要抓非http協(xié)議的包,或是需要分析協(xié)議的交互等等情況的時候敛摘,charles就派不上用場了门烂,這時可以祭出我們的神器-wireshark。這貨在windows下是挺好用的,沒想到在mac下屯远,UI實(shí)在是太粗糙蔓姚,一個典型的重功能不重UI的產(chǎn)品,和mac的其他軟件反差很大慨丐,但是克服掉UI方面的問題赂乐,你會發(fā)現(xiàn)它的強(qiáng)大所在。
?RVI接口創(chuàng)建和管理
- 通過數(shù)據(jù)線連接好iOS設(shè)備咖气,拿到設(shè)備的UDID(Xcode或iTunes都行)
- 通過終端輸入rvictl -s <UDID>來創(chuàng)建一個Remote Virtual Interface(RVI挨措、遠(yuǎn)程虛擬接口),這個接口就代表iOS設(shè)備的網(wǎng)絡(luò)棧了崩溪,對這個接口抓包即可
rvictl -s 74bd53c647548234ddcef0ee3abee616005051ed
Starting device 74bd53c647548234ddcef0ee3abee616005051ed [SUCCEEDED]
- 查詢新創(chuàng)建好的rvi接口浅役,一般是rvi0
$ ifconfig -l
lo0 gif0 stf0 en0 en1 en2 en3 p2p0 awdl0 bridge0 rvi0
- 不需要使用之后,要把這個接口去掉
rvictl -x 74bd53c647548234ddcef0ee3abee616005051ed
Stopping device 74bd53c647548234ddcef0ee3abee616005051ed [SUCCEEDED]
抓包
沒用wireshark之前伶唯,傻傻的用tcpdump來抓包觉既,抓完包之后用tcprewrite解析數(shù)據(jù),然后導(dǎo)入到charles看乳幸。這個方法一來太繁瑣瞪讼,二來charles只能看到http部分的數(shù)據(jù)包。后來改用wireshark之后粹断,世界清靜了7贰!
打開wireshark瓶埋,選擇我們之前創(chuàng)建的rvi0接口 希柿,然后抓包就開始了
tcp包分析(這部分是轉(zhuǎn)載他人的)
- TCP數(shù)據(jù)包中,seq表示這個包的序號养筒,注意曾撤,這個序號不是按1遞增的,而是按tcp包內(nèi)數(shù)據(jù)字節(jié)長度加上晕粪,如包內(nèi)數(shù)據(jù)是21字節(jié)挤悉,而當(dāng)前IP1發(fā)到IP2的包的seq是10的話,那下個IP1發(fā)到IP2的包的seq就是10+21=31
- 每個tcp包都帶有win巫湘、ack装悲,這些是告訴對方,我還可以接收數(shù)據(jù)的滑動窗口是多少剩膘,如果A發(fā)到B的包的win為0衅斩,就是A告訴B說我現(xiàn)在滑動窗口為0了盆顾,飽了怠褐,你不要再發(fā)給我了,就說明A端環(huán)境有壓力(如帶寬滿了等)
- ack可以理解為應(yīng)答您宪。A發(fā)給B的ack是告訴B奠涌,我已收到你發(fā)的數(shù)據(jù)包磷杏,收到ack號這里了慈格,你下次要發(fā)seq為ack號的給我
- 在網(wǎng)絡(luò)不堵即滑動窗口一點(diǎn)都不堵的情況下,第一個包的ack號就是第二個包的seq號选泻,如果堵了页眯,由于是滑動窗口緩存處理隊列窝撵,所以這個值會錯開
- 注意我們分析tcp包時忿族,要以一個會話做為一個完整對象,即通訊只發(fā)生在兩個IP之間隆豹,兩個固定的端口之間璃赡,如果端口變化了,那鏈接就不是同一條了侯谁,不同的鏈接之間的seq是沒有關(guān)聯(lián)的