早就聽說了Wireshark
是一個強大的網路資料包分析軟體,可以詳細的展示網路資料包的交換過程,是監控網路請求定位網路問題的利器。但是一直沒能靜下心來學習它,一方面是對它的強大和專業望而生畏,另一方面是平時網路除錯使用Fiddler
和Charles
抓包也滿足需求了。今天學習網路協議時,突然覺得純理論的知識點太空泛,想要抓一次真實的網路請求資料來對照學習,本文就是我使用Wireshark
來學習網路協議的筆記。
一、抓取資料包
我使用的是Mac版Wireshark 2.4.0
,目標是抓取請求http://www.baidu.com
HTML檔案的網路資料過程。Wireshark
開啟後不用任何設定就可以抓到電腦上發出的所有網路請求,可以看到大量的資料包,包含了電腦上發出的所有的網路請求。我們想要的是一次網路請求完整的資料交換過程,資料太多不利於分析,所以首先需要過濾出我們關注的資料。我這裡想到使用指定ip來過濾網路請求。
➜ Desktop ping www.baidu.com
PING www.a.shifen.com (61.135.169.125): 56 data bytes
64 bytes from 61.135.169.125: icmp_seq=0 ttl=53 time=2.697 ms
64 bytes from 61.135.169.125: icmp_seq=1 ttl=53 time=2.963 ms
...
複製程式碼
先使用ping
命令獲取www.baidu.com
對用的ip,然後設定Wireshark
的過濾器ip.addr == 61.135.169.125
。在瀏覽器中直接請求www.baidu.com
會多次請求改ip伺服器,因為HTML中還有圖片、css的資原始檔需要載入。這裡我們只要請求HTML檔案的請求,所以這裡使用curl
命令來模擬一次http請求。
➜ Desktop curl http://www.baidu.com
複製程式碼
通過curl
命令模擬一次http請求,然後使用Wireshark
過濾器過濾出和指定ip伺服器互動的請求,我們就得到了如下圖所示資料。
二、分析資料包
從上面截圖中可以看出一次http請求的過程大致是:
- TCP協議三次握手建立連線
- 客戶端傳送http request
- 服務端傳送http response
- tcp四次握手斷開連線
四個過程我們這裡重點看下tcp協議三次握手的過程。先來看下TCP資料包結構圖。
再貼下三次握手流程圖
最後看下Wireshark
抓到的第一次握手的資料包。首先客戶端向服務端傳送了一個設定了Syn (Synchronize) 標記的包,告訴服務端請求建立連線。此時的資料序號是0。
下面是第二次握手的TCP資料包。服務端向客戶端傳送了一個設定了Acknowledgment位,並且Acknowledgment number設定成了客戶端傳送資料序號加一。
下面是第三次握手的資料包