最快捷的抓包方式——tcpdump

tcpdump知識

在深入tcpdump之前,先貼一張tcp header的格式圖,


https://github.com/KristyToKristy/tcpheader/blob/master/tcpheader.png

TCP Flags(tcp header的第十四個字節)

flags位於tcpheader的第十四個字節,包含8個比特位。這8個比特位都有特點的功能用途,分別是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。

CWR,ECE:兩個flag用來配合congestion control的,一般情況下和應用層的關係不大。發送包ECE爲0時表示出現了congestion,接收方回的包裏CWR爲1表明收到congestion信息並做了處理。

URG 代表Urgent,表明包的優先級高,需要優先傳送對方並處理。像我們平時使用terminal的時候經常ctrl+c來結束某個任務,這種命令產生的網絡數據包就需要urgent。

ACK 也就是我們所熟悉的ack包,用來告訴對方上一個數據包已經成功收到。不過一般不會爲了ack單獨發送一個包,都是在下一個要發送的packet裏設置ack位,這屬於tcp的優化機制

PSH Push我們上面解釋過,接收方接收到P位的flag包需要馬上將包交給應用層處理,一般我們在http request的最後一個包裏都能看到P位被設置

RST Reset位,表明packet的發送方馬上就要斷開當前連接了。在http請求結束的時候一般可以看到一個數據包設置了RST位

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

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

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

用tcpdump分析http完整請求

知乎APP點贊之後發送的一個http請求tcpdump命令是:

sudo tcpdump -i rvi0  -AAl src 60.28.215.123 or dst 60.28.215.123

wKiom1e_sROzF7H1AANcb-a-8cQ029.png-wh_50

圖中列出了前面的packet。

10.29.44.240是android的ip地址60.28.215.123是知乎server的ip地址紅色方框內是android發出的packet,白色方框內是server發出的packet。packet1是android三次握手的第一個syn包,packet2是server ack+syn的包,packet3是android ack的包。這3個packet之後tcp的三次握手就完成了。packet4是android發出的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,android發送FIN+ACK的包就斷開連接了,server直接發送RST包後也斷開連接了。

wKioL1e_sqzAvDOjAACOuZiLkl8921.png-wh_50

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章