再次記錄使用tcpdump+wireshark分析TCP握手連接與斷開

  • 2019 年 10 月 10 日
  • 筆記

前言

剛好公司有個項目出現客戶端訪問服務器提示連接超時的情況,具體log信息顯示如下:

[21:29:48(1518)]*[TestService]*[getDeviceInfoFromCloud->onFailure: java.net.SocketTimeoutException: failed to connect to mapi.yunovo.cn/47.98.17.161 (port 80) after 10000ms] [21:29:51(1518)]*[TestService]*[getDeviceInfoFromCloud->onFailure: java.net.SocketTimeoutException: failed to connect to mapi.yunovo.cn/47.98.17.161 (port 80) after 10000ms] [21:30:09(1518)]*[TestService]*[getDeviceInfoFromCloud->onFailure: java.net.SocketTimeoutException: failed to connect to mapi.yunovo.cn/47.98.17.161 (port 80) after 10000ms]

一、思路分析

出現以上異常信息無非就以下幾種可能:

1、設備發送消息給服務器,服務器有接收到信息但沒有反饋給設備??

2、設備發送消息給服務器,服務器沒有接收到信息??

3、設備沒有把信息發送到服務器??

4、設備與服務器通訊期間數據有丟失??

解決方案:

1、通過tcpdump進行對設備抓包,抓取TCP的全部信息

2、結合wireshark工具進行分析TCP的連接過程

3、通過分析抓取的包信息來總結問題所在

二、抓包過程

1、把tcpdump腳本通過如下指令發送到設備端的/data/local/,進入設備的/data/local/路徑下修改文件權限

adb push tcpdump /data/local/ #傳到指定路徑

chmod 777 tcpdump #修改權限

2、執行抓包指令

tcpdump -p -vv -s 0 -C 100 -w /sdcard/xxx.pcap #相關參數請自行查找

3、當抓取的文件過多時,可以進入wireshark安裝目錄執行如下指令進行合併多個文件(比如有3個文件名為test.pcaptest_1.pcaptest_2.pcap)

mergecap.exe -w test.pcap test_*.pcap #第一個為你要保持的路徑和文件名,後綴必須以.pcap結尾,第二個為需要合併的文件

三、TCP握手和斷開過程

完成的交互過程就是一個典型的HTTP協議的應用過程。

HTTP是基於T CP的連接,因此,建立HTTP連接必須經過TCP的過程,TCP的建立過程是3次握手的過程。然後就是HTTP過程,HTTP只有兩種報文,請求和應答報文。完成http過程後,3次斷開tcp連接。

第一次握手連接

客戶端發送一個TCP,標誌位為SYN,序列號為0, 代表客戶端請求建立連接。 如下圖

TCP第一次握手連接

第二次握手的數據包

服務器發回確認包, 標誌位為 SYN,ACK. 將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即0+1=1, 如下圖

TCP第二次握手連接

第三次握手的數據包

客戶端再次發送確認包(ACK) SYN標誌位為0,ACK標誌位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1, 如下圖:

TCP第三次握手連接

結束請求

tcp三次握手結束之後就是HTTP請求

結束請求

四、針對抓取的包進行分析

1、通過打印的日誌找到服務器IP地址

2、把抓取的數據包用wireshark工具打開,輸入過濾條件,如下圖

分析數據包

3、分別核對查看TCP的三次握手請求是否正常,如下圖

TCP第一次連接

TCP第三次連接

4、結論

1、從TCP握手連接過程來看,第二次握手連接不成功(即服務器可能存在沒有接收到消息或者接收到消息後沒有返回給客服端),接下來就得分析服務器端的日誌信息了

2、從服務端分析的原因為:服務器剛好在釋放資源時,客戶端發來請求,導致服務器沒有及時做處理導致出現超時等異常。