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