前言
面試中我們經常會被問到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。此時,客戶端也停止接受數據了。
至此,服務器和客戶端都停止發送和接受數據了!四次揮手就完成了。