1.目的
客戶端與伺服器之間建立TCP/IP連線,我們知道是通過三次握手,四次揮手實現的,但是很多地方對這個知識的描述僅限於理論層面,這次我們通過網路抓包的方式來看一下實際的TCP/IP傳輸過程。
2.什麼是抓包?
網路傳輸資訊是通過層層打包,最終到達客戶端物理層,經過網線等裝置傳輸到伺服器端後,再進行層層拆包,最後獲取資訊。而抓包的“包”就是這個打包了資訊的“包。抓包(packet capture)就是將網路傳輸傳送與接收的資料包進行截獲,來進行分析的過程。
3.如何進行抓包?
我們可以利用現成的網路抓包軟體Wireshark,進行抓包,從而分析TCP/IP傳輸過程。
Wireshark軟體下載:Wireshark軟體官網下載,一定要下載下圖中的”Windows Installer(64-bit)
4.抓包分析TCP/IP傳輸過程(“三次握手”)
4.1第一步:瀏覽器開啟網頁https://www.hit.edu.cn/ (其他的網頁也沒問題)
4.2第二步:開啟命令列視窗,輸入:ping www.tencent.com
,檢視IP地址(切記:千萬不要把https/http加進去)
這裡我們得到的IP地址是61.167.60.70
4.3第三步:開啟Wireshark軟體
4.3.1先雙擊“WLAN”
4.3.2得到下圖
4.3.3在下圖方框位置輸入:ip.addr==61.167.60.70
,按下Enter鍵,稍等片刻
(如果沒反應,重新在瀏覽器輸入網址,並重新獲取IP地址,也就是重複1,2步操作)
4.3.4顯示如下圖所示
注意!!:如果第一步訪問的是一些比較大的網站,例如騰訊之類的,這步會出不來,因為這些大網站往往有多個主機,你用ping訪問到的ip地址和瀏覽器訪問到的ip地址會出現不一致的情況,導致這一步只有ping的包。也就是說建議大家不要選擇大網站測試,可以像我這樣,用自己學校網址或者一些小的網站測試。
5.分析“三次握手”抓包結果
首先是抓包結果圖(把上一步得到的結果劃到最上面看)如下:
方框處也就是“三次握手的結果。
- 第一次的標誌是“[SYN]”,序列號seq為0, 代表客戶端請求建立連線
- 第二次的標誌是“[SYN, ACK]”,序列號Seq為0,Ack值為客戶端傳送過來的Seq加1,也就是1,表示伺服器可以正常接收客戶端資料包。
- 第三次的標誌是“[ACK]”,客戶端表示可以正常接收伺服器資料包,這是為了保證可以全雙工通訊,接下來就可以正常傳送資料。
6.“四次揮手”抓包及分析
首先我們需要把瀏覽器的頁面關閉,也就是斷開TCP/IP連線,之後等待幾分鐘。會出現下面的畫面,方框就是“揮手”過程。
四次揮手標誌分別為:
- "[FIN, ACK]"
- "[ACK]"
- "[FIN, ACK]"
- "[ACK]"
這裡,我們需要注意兩點:
(1)客戶端與伺服器端傳輸時全雙工的,因此斷開請求既可以由客戶端發起,也可以由伺服器端發起。只要找準第一次出現"[FIN, ACK]"的位置,就是第一次揮手位置。
(2)為什麼我們抓包抓到的不是“四次揮手”,而是“三次揮手”呢?
這裡涉及到LInux的TCP時延機制,當被揮手端(這裡是443埠)第一次收到揮手端(這裡是12672埠)的“FIN”請求時,並不會立即傳送ACK,而是會經過一段延遲時間後再傳送,但是此時被揮手端也沒有資料傳送,就會向揮手端傳送“FIN"請求,這裡就可能造成被揮手端傳送的“FIN”與“ACK”一起被揮手端收到,導致出現“第二、三次揮手”合併為一次的現象,也就最終呈現出“三次揮手”的情況。