網路抓包教程之tcpdump

2022-07-04 01:36:10 字數 3959 閱讀 2460

獲取itunes獲取裝置udid

開啟終端(terminal),建立虛擬網絡卡

在終端輸入rvictl -s udid,建立虛擬網絡卡。

啟動tcpdump監控流量

在終端繼續輸入sudo tcpdump -i rvi0 -aal,啟動tcpdump監控。

android裝置沒辦法通過rvictl建立虛擬網絡卡,但是可以把tcpdump的可執行檔案上傳到android裝置上,然後通過mac遠端登入android裝置執行tcpdump,前提是這台android裝置必須已經root過。步驟如下:

通過adb將tcpdump上傳到android裝置

通過adb push將tcpdump檔案上傳到特定的目錄,這裡我們選擇/sdcard/data目錄。

在android裝置上執行tcpdump

通過adb shell登陸裝置,並執行tcpdump,最後一步執行./tcpdump即可。

經過上面的步驟成功執行tcpdump之後,接下來就可以分析輸出的網路包內容了,ios裝置和android裝置的輸出是一致的。我們先來解析下幾個基本的格式:

圖中紅色方框內的部分是乙個ip包的詳細記錄,類似的紀錄還有好幾條。這裡我們著重分析第一條的各部分字段含義。

14:37:41.615018 很簡單,是該包接收到的時間。

17.143.164.37.5223 是傳送方的ip位址及埠號(5223是埠號)。

10.29.44.140.58036 是我iphone的ip位址及埠號。

flags [p.] 是tcp包header部分的第14個位元組的p位。這個位元組所包含的幾個flag很重要,後面我會單獨詳細講解。這裡p位表示接受方需要馬上將包push到應用層。

seq 1:54 tcp包的seq號,1是起始值,54結束值。tcp之所以被認為是流,是因為tcp包所攜帶的每乙個位元組都有標號(seq號)。1:54表明總共有54個位元組被接受,其中乙個位元組是三次握手階段所使用,所以一共傳送的長度是53位元組。

ack 101 tcp包的ack號,ack 101表明seq號為100的位元組已被確認收到,下乙個期望接收的seq號從101開始。

win 255 win表示的是tcp包傳送方,作為接受方還可以接受的位元組數。這裡win 255表明ip為17.143.164.37的主機還可以接受255個位元組。

options [nop,nop,…] options[…]表示的是該tcp包的options區域,nop是no opertion的縮寫,沒什麼實際用途,主要是用做padding,因為options區域按協議規定必須是4位元組的倍數。

options[… ts val 2381386761] ts val這個值是tcp包的時間戳,不過這個時間戳和裝置的系統時間沒啥關係,剛開始是隨機值,後面隨著系統時鐘自增長。這個時間戳主要用處是seq序列號越界從0重新開始後,可以確認包的順序。

options[… ecr 427050796] ts ecr這個值主要用來計算rtt。比如a傳送乙個tcp包給b,a會在包裡帶上ts val,b收到之後在ack包裡再把這個值原樣返回,a收到b的ack包之後再根據本地時鐘就可以計算出rtt了。這個值只在ack包裡有效,非ack包ecr的值就為0.

length 53 這個length是應用層傳過來的資料大小,不包括tcp的header。這個值和我們上面分析的seq 1:54是一致的。

以上就是乙個基本的tcp包結構,大家可以按照上面的分析再把其他幾個包理解下。我們在做應用的時候面對的更多是http協議,但對乙個http請求是怎麼通過tcp/ip分解成乙個個的packet,然後怎麼在網路上穩定可靠的傳輸,要有個基本的印象。下面我們再看下tcpdump更多的功能,這些功能都是基於對tcp/ip協議的理解,遇到不理解的建議多google下相關的技術概念。

再繼續深入tcpdump之前,先貼上一張tcp header格式圖,常看常新。

我們再仔細看下上面提到的flags概念,flags位於tcp header的第十四個位元組,包含8個位元位,也就是上圖的cwr到fin。這8個位元位都有特定的功能用途,分別是:cwr,ece,urg,ack,psh,rst,syn,fin。

cwr ,ece 兩個flag是用來配合做congestion control的,一般情況下和應用層關係不大。傳送方的包ece(ecn-echo)為0的時候表示出現了congestion,接收方回的包裡cwr(congestion window reduced)為1表明收到congestion資訊並做了處理。我們重點看其他六個flag。

urg urg代表urgent,表明包的優先順序高,需要優先傳送對方並處理。像我們平時使用terminal的時候經常ctrl+c來結束某個任務,這種命令產生的網路資料報就需要urgent。

ack 也就是我們所熟悉的ack包,用來告訴對方上乙個資料報已經成功收到。不過一般不會為了ack單獨傳送乙個包,都是在下乙個要傳送的packet裡設定ack位,這屬於tcp的優化機制,參見delayed ack。

psh push我們上面解釋過,接收方接收到p位的flag包需要馬上將包交給應用層處理,一般我們在http request的最後乙個包裡都能看到p位被設定。

rst reset位,表明packet的傳送方馬上就要斷開當前連線了。在http請求結束的時候一般可以看到乙個資料報設定了rst位。

syn syn位在傳送建立連線請求的時候會設定,我們所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。

fin finish位設定了就表示傳送方沒有更多的資料要傳送了,之後就要單向關閉連線了,接收方一般會回乙個ack包。接收方再同理傳送乙個fin就可以雙向關閉連線了。

這8個flag首字母分別是:c e u a p r s f。初看難以記憶,我腦洞了下,把它們組合成 supr cafe,當然少了super少了個e,我可以將就下。我們在使用tcpdump的時候會經常看到這幾個flag,[s],[p],[r],[f],[.]。其他幾個都好理解,[.]特殊點,是個佔位符,沒有其他flag被設定的時候就顯示這個佔位符,一般表示ack。

這部分我們來看下tcpdump常用的一些命令引數。文章最開始部分的tcpdump命令是這樣的:sudo tcpdump -i rvi0 -aal。 -i rvi0 -aal都是屬於引數部分。常見的有這些:

上面幾個是我個人比較常用的,更多的引數可以參考這個詳細文件。有興趣的可以分析下面幾個例子練習下:

圖中列出了6個前面的packet,10.29.44.240是我iphone的ip位址,60.28.215.123是知乎server的ip位址,紅色方框內是iphone發出的packet,白色方框內是server發出的packet。packet1是iphone三次握手的第乙個syn包,packet2是server ack+syn的包,packet3是iphone ack的包。這3個packet之後tcp的三次握手就完成了。

packet4是iphone發出的http request。長度只有240個位元組,所以乙個packet就發過去了,當然還設定了flags的p位,request需要馬上被應用層處理。包裡面出現了spdy,點讚。

packet5是server ack剛收到的包,長度位0,所以這僅僅是乙個ack包。

packet6是server返回http的response了,1388個位元組。packet5和packet6都ack了seq為241的包,當然是為了增加ack的成功率。

中間還有好幾個packet就不仔細分析了,最後再看下請求完成的最後幾個包:

最後兩個packet比較簡單,iphone傳送個fin+ack的包就斷開連線了,server直接傳送了乙個rst包後也斷開連線了。

這篇教程到這裡就結束了,建議大家自己多練習下,遇到不懂的引數或關鍵字多google。最好能系統的學習下tcp/ip協議

iOS,Android網路抓包教程之tcpdump

就是用tcpdump來操作的。這篇文章主要介紹tcpdump的基本使用方法,閱讀目標是能基本掌握並運用tcpdump解決網路相關的問題。閱讀前提是對 tcp ip 有初步的了解。1.啟動tcpdump 1.1 ios上啟動tcpdump 獲取itunes獲取裝置udid 開啟終端 terminal ...

iOS,Android網路抓包教程之tcpdump

獲取itunes獲取裝置udid 開啟終端 terminal 建立虛擬網絡卡 在終端輸入rvictl s udid,建立虛擬網絡卡。啟動tcpdump監控流量 在終端繼續輸入sudo tcpdump i rvi0 aal,啟動tcpdump監控。android裝置沒辦法通過rvictl建立虛擬網絡卡...

wireshark抓包教程

1 選擇要抓包的網路 2 設定捕獲過濾器 捕獲過濾器表示式作用在wireshark開始捕獲資料報之前,只捕獲符合條件的資料報,不記錄不符合條件的資料報。捕獲過濾器表示式沒有像顯示過濾器表示式那樣明顯的規律,但寫法不多所以也不難 而且除非全部捕獲要占用的磁碟空間實現太大,且你非常明確過濾掉的資料報是你...