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