技術(shù)分享 | 抓包分析 TCP 協(xié)議
TCP 協(xié)議是在傳輸層中,一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
環(huán)境準(zhǔn)備
對(duì)接口測試工具進(jìn)行分類,可以如下幾類:
網(wǎng)絡(luò)嗅探工具:tcpdump,wireshark
代理工具:fiddler,charles,anyproxyburpsuite,mitmproxy
分析工具:curl,postman,chrome Devtool
抓包分析TCP協(xié)議
tcpdump
tcpdump 是一款將網(wǎng)絡(luò)中傳送的數(shù)據(jù)包的“頭”完全截獲下來提供分析的工具。它支持針對(duì)網(wǎng)絡(luò)層、協(xié)議、主機(jī)、網(wǎng)絡(luò)或端口的過濾,并提供 and、or、not 等邏輯語句去掉無用的信息。
讓 tcpdump 時(shí)刻監(jiān)聽 443 端口,如果有異樣就輸入到 log 文件中
sudo tcpdump port 443 -v -w /tmp/tcp.log
利用這條命令,會(huì)把得到的報(bào)告放到目錄 /tmp/tcp.log 中。
常用參數(shù)含義port 443監(jiān)聽 443 端口-v輸出更加詳細(xì)的信息-w把數(shù)據(jù)寫到 log 中
wireshark
wireshark 也是一款網(wǎng)絡(luò)嗅探工具,它除了擁有 tcpdump 功能,還有更多擴(kuò)展功能,比如分析工具,但是在接口測試中,抓包過程往往都是在服務(wù)器進(jìn)行,服務(wù)器一般不提供 UI 界面,所以 wireshark 無法在服務(wù)器工作,只能利用 tcpdump 抓包生成 log,然后將 log 導(dǎo)入 wireshark 使用,在有 UI 界面的客戶端上進(jìn)行分析。
抓包分析 TCP 協(xié)議
抓取一個(gè) http 的 get 請求:
在百度上搜 mp3?http://www.baidu.com/s?wd=mp3
用 tcpdump 截獲這個(gè) get 請求,并生成 log
用 wireshark 打開 tcpdump 生成的 log
使用 wireshark 查看 log:

log 的前幾段信息是三次握手。因?yàn)樾诺朗遣豢煽康模诎l(fā)送數(shù)據(jù)前,就必須確保信道穩(wěn)定,而三次握手就像是下面這些操作:
第一次握手:建立連接時(shí),客戶端發(fā)送 syn 包(syn=j)到服務(wù)器,并進(jìn)入 SYN_SENT 狀態(tài),等待服務(wù)器確認(rèn)。
第二次握手:服務(wù)器收到 syn 包,必須確認(rèn)客戶的 SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè) SYN 包(seq=k),即 SYN+ACK 包,此時(shí)服務(wù)器進(jìn)入 SYN_RECV 狀態(tài);
第三次握手:客戶端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器發(fā)送確認(rèn)包 ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入 ESTABLISHED(TCP 連接成功)狀態(tài),完成三次握手。
經(jīng)過三次握手,就可以進(jìn)一步交流,就像下面這樣:

結(jié)束交流時(shí),也需要進(jìn)行四次揮手:

第一次揮手:客戶端向服務(wù)器端發(fā)送一個(gè) FIN,請求關(guān)閉數(shù)據(jù)傳輸。
第二次揮手:服務(wù)器接收到客戶端的 FIN,向客戶端發(fā)送一個(gè) ACK,其中 ack 的值等于 FIN+SEQ。
第三次揮手:服務(wù)器向客戶端發(fā)送一個(gè) FIN,告訴客戶端應(yīng)用程序關(guān)閉。
第四次揮手:客戶端收到服務(wù)器端的 FIN,回復(fù)一個(gè) ACK 給服務(wù)器端。其中 ack 的值等于 FIN+SEQ。
注意:?一個(gè)請求可能分為多個(gè)包,一個(gè)數(shù)據(jù)也是這樣,于是在 wireshark 會(huì)看到很多包。