tcpdump知識android
在深刻tcpdump以前,先貼一張tcp header的格式圖,git
https://github.com/KristyToKristy/tcpheader/blob/master/tcpheader.png
github
TCP Flags(tcp header的第十四個字節)網絡
flags位於tcpheader的第十四個字節,包含8個比特位。這8個比特位都有特色的功能用途,分別是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。tcp
CWR,ECE:兩個flag用來配合congestion control的,通常狀況下和應用層的關係不大。發送包ECE爲0時表示出現了congestion,接收方回的包裏CWR爲1代表收到congestion信息並作了處理。ide
URG 表明Urgent,代表包的優先級高,須要優先傳送對方並處理。像咱們平時使用terminal的時候常常ctrl+c來結束某個任務,這種命令產生的網絡數據包就須要urgent。優化
ACK 也就是咱們所熟悉的ack包,用來告訴對方上一個數據包已經成功收到。不過通常不會爲了ack單獨發送一個包,都是在下一個要發送的packet裏設置ack位,這屬於tcp的優化機制spa
PSH Push咱們上面解釋過,接收方接收到P位的flag包須要立刻將包交給應用層處理,通常咱們在http request的最後一個包裏都能看到P位被設置server
RST Reset位,代表packet的發送方立刻就要斷開當前鏈接了。在http請求結束的時候通常能夠看到一個數據包設置了RST位blog
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
圖中列出了前面的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包後也斷開鏈接了。