[日常] 使用TCPDUMP和Ethereal抓包分析HTTP請求中的異常情況


在測試功能的過程中,出現這樣一種現象.前端js發起ajax請求后,在瀏覽器的審查元素網絡狀態中可以看到status為pending,等15秒以后js會把當前超時的請求取消掉,變成了紅色的cancel.針對這一現象,我在本地Windows電腦和遠程Linux測試機進行了網絡抓包分析.

 

由於出現的幾率很隨機,但是出現頻率挺高,我先在linux測試機中使用tcpdump進行的抓包分析,可以看到正常的請求是可以看得到數據的,異常的請求根本就沒有連接數據,因此斷定異常的數據根本就沒有請求到我當前的機器.然后在本地windows電腦中使用Ethereal進行抓包分析,才發現了原因.

我本地有進行域名綁定測試機host,host所使用的ip是內網IP,是這種形式172.16.228.187,但是在抓到的數據包中變成了我之前綁定的host是個公網IP,由於安全原因,公網IP已經被禁止直接訪問了,才因此出現的異常.我猜測是在進行域名DNS解析的時候,偶爾會把我之前的緩存的host返回來,才造成的這種現象

解決這一問題的方式是清除瀏覽器的所有緩存數據,清理自己的電腦的dns緩存,使用ipconfig/flushdns

 

那么下面這個是我正常情況下的tcpdump抓包結果,可以解釋下各條記錄的意義
tcpdump -i eth1 port 80
使用tcpdump一定要用-i參數指定下監聽哪個網卡,可以使用ifconfig查看當前ip的網卡,有的是eth0,有的是eth1,這樣可以抓取到這個網卡上的數據.還要過濾一下端口號,一般就只看80端口的數據就可以了

TCP三次握手的過程,可以在下面的請求中看得到.
第一次握手:10.222.128.166.60110 > 172.16.228.187.http 這里可以知道客戶端IP是10.222.128.166,請求來自於60110端口,目的IP是172.16.228.187的80端口.這里的Flag是很有意義的,Flags [S]表示的是
客戶端的SYN請求,seq序列號是1594115281.
第二次握手:服務端返回給客戶端Flags [S.],seq序列號4134215995, ack確認號是1594115282,ack是客戶端seq的+1值
第三次握手:客戶端給服務端 Flags [.],.表示標志位均為0 , ack是1

15:40:19.988481 IP 10.222.128.166.60110 > 172.16.228.187.http: Flags [S], seq 1594115281, win 8192, options [mss 1300,nop,wscale 8,nop,nop,sackOK], length 0
15:40:19.988528 IP 172.16.228.187.http > 10.222.128.166.60110: Flags [S.], seq 4134215995, ack 1594115282, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
15:40:19.995864 IP 10.222.128.166.60110 > 172.16.228.187.http: Flags [.], ack 1, win 260, length 0


下面就是實際的數據傳輸過程了,可以看到tcp的分段傳輸,客戶端到服務端的數據seq 1:1180 ,長度1179,下一段是seq 1180:1221,長度41.
也可以看到應答機制,服務端給客戶端的ack 1180,ack 1221.

15:40:19.996031 IP 10.222.128.166.60110 > 172.16.228.187.http: Flags [P.], seq 1:1180, ack 1, win 260, length 1179
15:40:19.996067 IP 172.16.228.187.http > 10.222.128.166.60110: Flags [.], ack 1180, win 137, length 0
15:40:19.997779 IP 10.222.128.166.60110 > 172.16.228.187.http: Flags [P.], seq 1180:1221, ack 1, win 260, length 41
15:40:19.997800 IP 172.16.228.187.http > 10.222.128.166.60110: Flags [.], ack 1221, win 137, length 0
15:40:20.113390 IP 172.16.228.187.http > 10.222.128.166.60110: Flags [P.], seq 1:953, ack 1221, win 137, length 952
15:40:20.114305 IP 172.16.228.187.http > 10.222.128.166.60110: Flags [F.], seq 953, ack 1221, win 137, length 0
15:40:20.122015 IP 10.222.128.166.60110 > 172.16.228.187.http: Flags [.], ack 954, win 256, length 0
15:40:20.122044 IP 10.222.128.166.60110 > 172.16.228.187.http: Flags [F.], seq 1221, ack 954, win 256, length 0
15:40:20.122057 IP 172.16.228.187.http > 10.222.128.166.60110: Flags [.], ack 1222, win 137, length 0

六個標志位
同步SYN,在連接建立時用來同步序號。當SYN=1,ACK=0,表明是連接請求報文,若同意連接,則響應報文中應該使SYN=1,ACK=1;
確認ACK,僅當ACK=1時,確認號字段才有效。TCP規定,在連接建立后所有報文的傳輸都必須把ACK置1;
終止FIN,用來釋放連接。當FIN=1,表明此報文的發送方的數據已經發送完畢,並且要求釋放;
緊急URG,當URG=1,表明緊急指針字段有效。告訴系統此報文段中有緊急數據;
推送PSH,當兩個應用進程進行交互式通信時,有時在一端的應用進程希望在鍵入一個命令后立即就能收到對方的響應,這時候就將PSH=1;
復位RST,當RST=1,表明TCP連接中出現嚴重差錯,必須釋放連接,然后再重新建立連接;


windows電腦使用Ethereal也是需要先設置捕獲的網卡,選對自己的iP網卡,可以使用ipconfig來查看

這些請求跑到了之前設置的公網IP上,根本就不會得到回應,因此前端就那里就會報出異常了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM