Wireshark抓包分析TCP協議:三次握手和四次揮手
Wireshark抓包分析TCP協議:三次握手和四次揮手
前言
面試中我們常被問到TCP協議的三次握手和四次揮手的過程,為什麼總喜歡問這個問題呢?
其實我們平常使用的很多協議都是應用層協議,例如HTTP協議,https協議,DNS協議,FTP協議等;而應用層協議都是要基於傳輸層的兩個協議之上的,也就是TCP協議和UDP協定。我們在使用應用層協定遇到一些問題需要去分析定位的時候,會需要涉及到底層協定的連線問題上。所以,作為測試掌握這兩個底層協議的工作原理是非常必要的!
UDP協定作為一個不可靠的傳輸層協議,工作過程相對比較簡單!所以我們就重點來大家講TCP協定。
Wireshark抓包分析TCP協定為了更好的學習和理解TCP協定的連接和斷開連接的過程,我們來引入一個非常適合用來學習網路協定的抓包工具Wireshark。這個抓包工具可以詳細看到每一層網路封包的詳細資訊。
TCP協定的三次握手過程TCP建立連線需要經歷三次握手,具體過程如下:
那麼,這個過程我們配合抓包工具來看看具體的案例;如下圖是訪問某個HTTP請求用wireshark抓到的報文,前面的三個報文就是TCP的三次握手過程:SYN包,SYN ACK包,ACK報文。
展開看詳情:
第一次握手的封包如下:這是客戶端發起給伺服器的封包,用於請求建立連線。
可以看到TCP報文裡有一個Flags位:
當Syn位元標記為1的時候,表示這個封包是一個請求連結的封包;
自己的序號(sequence number):0
第二次握手的封包如下:這是伺服器回覆給客戶端的封包,用於確認並同意連線請求。
可以看到TCP報文裡的Flags位:
Syn位也標示為1,表示這個封包是同意建立連結的封包;
ACK位元也標示為1,表示是對上一個封包的確認封包;
Sequence number:自己的序號;
acknowledgment number:表示對上一個請求封包的確認號,所以是在上一個封包的序號+1
第三次握手:是客戶端發給伺服器的,是對上一個同意連線請求的確認。
Flags裡的ACK位元標記為1,表示是一個對上一個報文的確認訊息;
Sequence number:自己的序號,在上一個封包的基礎上+1;
acknowledgment number:表示對上一個請求封包的確認號,在上一個封包序號的基礎上+1.
至此,三次握手完成!接下來就開始發送HTTP的請求了。
TCP協定的四個揮手流程
當資料傳輸結束了,客戶端和伺服器之間就開始斷開連線了。斷開連結需要經歷四次揮手,具體過程如下:
同樣,我們用wireshark工具來進行詳細過程的報文的分析:
我們同樣展開看下詳細的報文內容:
第一次揮手:當資料傳輸首先結束的端(例如客戶端),會率先發起結束斷開連線的請求:
Flags位的Fin位元標記為1,說明這是一個一個斷開連線的請求的封包。
這時候我們發送這個請求的端已經停止發送資料了!但是還可以接受數據。
第二次揮手:對上一個斷開連線請求的報文進行確認。並同時,停止接受數據。
所以,我們可以看到這個報文的ACK位元被標記為1,而acknowledgment number是對上一個報文的序號+1,表示對上一個報文的確認。
第三次揮手:伺服器端也結束資料發送了,所以也會發起一個斷開連線的請求。
這是一台伺服器發起FIN封包,請求斷開連接,同時,伺服器也會停止傳送資料。
第四次揮手:是客戶端對伺服器斷開連線請求的進行確認。
所以這個flags位元是ACK位元標記為1。此時,客戶端也停止接受資料了。
至此,伺服器和客戶端都停止發送和接受資料了!四次揮手就完成了。