你需要知道的 TCP 四次揮手
大家好,我是前端西瓜哥。今天給大家說說 TCP 的四次揮手。
建立 TCP 連接一段時間后,如果要斷開 TCP 連接,就會進行 TCP 四次揮手過程完成斷開操作。
TCP 四次的過程有點像 TCP 建立連接的三次握手。
下圖為 TCP 頭部的結構,我們的 TCP 四次揮手主要用到其中的標黃的部分。
和三次握手的發起者必須是客戶端不同,斷開 TCP 連接的發起方可以是任何一方。為了方便講解,下面我們以客戶端作為發起者進行描述。
TCP 四次揮手過程
我們先看示意圖。
第一次揮手,客戶端向服務端發送 TCP 請求,將 TCP 頭部中的。
- FIN 設置為 1。
- seq 設置為一個隨機數 x。
FIN 是一個標志位,表示結束(finish)的意思,1 等同于 true。
seq 是個序列號,一個裝數據的地方,我們這里給他設置為一個隨機數,用于給服務端做確認,好對應上這個 TCP 請求。
第二次揮手,服務端發送 TCP,并將 TCP 頭部中的。
- ACK 設置為 1(acknowledge,表示 “收到” 的意思)。
- ack 確認號設置為 x+1(x 來自第一次揮手)。
當客戶端收到這個 TCP 請求時,表示從客戶端到服務端的通道已經關閉,你不能再向服務端發正常的數據請求了。
此時服務端到客戶端還是可以發送數據的。如果服務端有一些之前的 TCP 請求沒來得及響應,在第二次揮手和第三次揮手期間還是可以去返回的。
第三次揮手,服務端向客戶端發送 TCP 請求:
- FIN 設置為 1。
- seq 設置為一個隨機數 y。
類似第一次揮手,只是這次發送方為服務端。
第四次揮手,客戶端向服務端發送 TCP 請求:
- ACK 設置為 1。
- ack 確認號設置為 y+1。
服務端接收到這個請求后,服務端就能成功變成關閉(CLOSE)狀態。客戶端則會等一段時間再進入關閉狀態,因為第四次揮手不一定能成功發給服務端,所以要等一下,看看服務端會不會因為沒收到第四次揮手,而重發第三次揮手。
結尾
和 TCP 三次握手不同。TCP 關閉連接的揮手足足有四次。這是因為第二次揮手和第三次揮手之間可能有一些服務端需要發送的處理比較慢的數據要返回,所以沒有將這兩次揮手合并。