【技術流】以TCP/IP協議為例,如何通過wireshark抓包分析?

本文作者:李莉, 網易雲平台測試組高級測試工程師。

當我們需要來跟蹤網路通信有關的信息時,經常會說「抓包」。

這裡抓包究竟是什麼?抓到的包又能分析出什麼?在本文中,先從TCP/IP協議為例,簡單介紹TCP/IP協議,以及如何通過wireshark抓包分析。

Wireshark是最著名的網路通訊抓包分析工具。功能十分強大,可以截取各種網路封包,顯示網路封包的詳細信息。

Wireshark下載安裝,略。注意,若在Windows系統安裝Wireshark,安裝成功後可能會出現Wireshark的兩個圖標,一個是Wireshark(中文版);另外一個是Wireshark Legacy (英文版)。下面的內容會以Wireshark Legacy為例介紹。

打開Wireshark,開始界面如下:

Wireshark是捕獲網卡的網路包,當機器上有多塊網卡的時候,需要先選擇網卡。開始界面中的Interface List,即網卡列表,選擇我們需要的監控的網卡。點擊Capture

Options,選擇正確的網卡,然後點擊"Start"按鈕, 開始抓包。

然後打開瀏覽器輸入http網址再關閉,比如:blog.csdn.net。需要停止抓取報文的時候,點擊左上角的停止按鍵。查看此時Wireshark的抓包信息。先來看下Wireshark界面的含義。其中,封包列表的面板中顯示編號、時間戳、源地址、目標地址、協議、長度,以及封包信息。

封包詳細信息是用來查看協議中的每一個欄位。各行信息分別對應TCP/IP協議的不同層級。以下圖為例,分別表示:TCP層、IP層、數據鏈路層、物理層,一共四層。如果有應用層數據會顯示五層。

每一層都有一個欄位指向上一層,表明上一層是什麼協議。這大概是因為發包的時候會在數據上依次加上應用層、傳輸層、網路層、鏈路層的頭部,但是對方收到數據包後是從最底層(鏈路層)開始層層剝去頭部解包的,所以在每層上有一個欄位指向上層表明上層的協議,對方就知道下一步該怎麼解包了。以TCP/IP協議為例,下圖中分別是:IPv4、TCP。由於建立TCP連接用不到應用層協議,所以傳輸層就沒有相應的指明上層(應用層)的欄位了。

在了解Wireshark界面顯示的基本信息之後,我們來分析TCP協議,添加對應的過濾條件。此外,我添加了目標的ip地址和埠號:tcp and ip.addr==47.95.47.253 and

tcp.port==53992,此時獲取到的封包列表如下。

在此之前,先看下TCP/IP報文的格式。

根據上述報文格式我們可以將wireshark捕獲到的TCP包中的每個欄位與之對應起來,更直觀地感受一下TCP通信過程。先看三次握手,下圖中的3條數據包就是一次TCP建立連接的過程。

第一次握手,客戶端發送一個TCP,標誌位為SYN=1,序號seq為Sequence

number=0, 53992 -> 80,代表客戶端請求建立連接;

第二次握手,伺服器向客戶端返回一個數據包,SYN=1,ACK=1,80 -> 53992,將確認序號(Acknowledgement

Number)設置為客戶的序號seq(Sequence number)加1,即0+1=1;

第三次握手,客戶端收到伺服器發來的包後檢查確認序號(Acknowledgement

Number)是否正確,即第一次發送的序號seq加1(X+1= 0+1=1)。以及標誌位ACK是否為1。若正確,客戶端會再向伺服器端發送一個數據包,SYN=0,ACK=1,確認序號(Acknowledgement

Number)=Y+1=0+1=1,並且把伺服器發來ACK的序號seq(Sequence number)加1發送給對方,發送序號seq為X+1= 0+1=1。客戶端收到後確認序號值與ACK=1,53992 -> 80,至此,一次TCP連接就此建立,可以傳送數據了。

還可以通過直接看標誌位查看三次握手的數據包,如下圖所示,第一個數據包標誌位【SYN】,這是第一次握手;第二個數據包標誌位【SYN,ACK】,這是第二次握手;第三個數據包標誌位【ACK】,這是第三次握手。

在三次握手的三個數據包之後,第四個包才是HTTP的, 這說明HTTP的確是使用TCP建立連接的。

再往下看其他數據包,發現會存在大量的這裡看到有大量的TCP segment of a reassembled PDU,字面意思是要重組的協議數據單元(PDU:Protocol Data Unit)的TCP段,這是TCP層收到上層大塊報文後分解成段後發出去。

乙太網幀的封包格式為:Frame = Ethernet Header + IP Header + TCP Header + TCP Segment Data。即:

1、Ethernet Header = 14 Byte = Dst Physical Address(6 Byte)+ Src Physical Address(6 Byte)+ Type(2 Byte),乙太網幀頭以下稱之為數據幀。

2、IP Header = 20 Byte(without options field),數據在IP層稱為Datagram,分片稱為Fragment。

3、TCP Header = 20 Byte(without options field),數據在TCP層稱為Stream,分段稱為Segment(UDP中稱為Message)。

4、TCP Segment Data = 1448Byte(從下圖可見)。

我們再來看四次揮手。TCP斷開連接時,會有四次揮手過程,標誌位是FIN,我們在封包列表中找到對應位置,理論上應該找到4個數據包,但我試了好幾次,實際只抓到3個數據包。查了相關資料,說,是因為伺服器端在給客戶端傳回的過程中,將兩個連續發送的包進行了合併。因此下面會按照合併後的三次揮手解釋,若有錯誤之處也請指出。

第一次揮手:客戶端給伺服器發送TCP包,用來關閉客戶端到伺服器的數據傳送。將標誌位FIN和ACK置為1,序號seq=X=2242,確認序號ack=Z=17602,53992 -> 80;

第二次揮手:伺服器收到FIN後,伺服器關閉與客戶端的連接,發回一個FIN和ACK(標誌位FIN=1,ACK=1),確認序號ack為收到的序號加1,即X=X+1=2243。序號seq為收到的確認序號=Z=17602,80

-> 53992;

第三次揮手:客戶端收到伺服器發送的FIN之後,發回ACK確認(標誌位ACK=1),確認序號為收到的序號加1,即Y+1=17603。序號為收到的確認序號X=2243,53992 -> 80。

至此,整個TCP通信過程已經介紹完畢。

附:TCP通信過程:

如果小夥伴們有什麼疑問,可以在評論區留言,也歡迎各位與我們分享自己的看法~

註:「TCP/IP報文格式圖」及「TCP通信過程圖」來源於網路,如有侵權,請私信聯繫刪除。


推薦閱讀:

wifi非常不穩定且延遲高可能的原因是什麼?
二層交換的傳輸鏈路,天津-貴陽長途傳輸,100M帶寬,TCP跑到三四十M就不行了,UDP測試沒問題。?
ICMP報文要使用IP頭來發送報文,為什麼ICMP依然與IP在同一層-網路層?
關於CSMA/CD的問題?
B類地址第一個可分派的網路號為什麼不是128.0?

TAG:Wireshark | 抓包 | TCPIP |