1. 前言
上一章節(jié)分析了 TCP 建立連接的過(guò)程,既然有建立連接,對(duì)應(yīng)的也有斷開(kāi)連接。數(shù)據(jù)傳輸完成之后,客戶(hù)端和服務(wù)器端保持通信狀態(tài)會(huì)占用資源開(kāi)銷(xiāo),所以需要斷開(kāi)連接,TCP 協(xié)議中斷開(kāi)連接也被稱(chēng)為 TCP 四次揮手。
2.1 TCP 四次揮手
面試官提問(wèn): 說(shuō)明一下 TCP 斷開(kāi)連接的過(guò)程,涉及到了幾個(gè)步驟?
題目解析:
?
首先從行為上分析,TCP 斷開(kāi)連接總共需要發(fā)送四次報(bào)文,也就是 "四次揮手" 的過(guò)程。
我們定義發(fā)送報(bào)文的一方是客戶(hù)端,接收?qǐng)?bào)文的一方是服務(wù)器端。
上一章節(jié)中已經(jīng)對(duì)三次握手過(guò)程做出了分析,在建立連接后到傳輸數(shù)據(jù)的整個(gè)過(guò)程,客戶(hù)端和服務(wù)器端均處于 ESTABLISHED(監(jiān)聽(tīng))狀態(tài),之后四次揮手的過(guò)程如下:
(1)第一次揮手:客戶(hù)端發(fā)送一個(gè)請(qǐng)求結(jié)束報(bào)文,其中 FIN 標(biāo)志位設(shè)置為 1,報(bào)文中給定一個(gè)序列號(hào) u,報(bào)文內(nèi)容是 FINbit=1 seq=u
,發(fā)送之后主動(dòng)進(jìn)入 FIN_WAIT 狀態(tài),等待服務(wù)器端的確認(rèn)報(bào)文;
(2)第二次揮手:服務(wù)器端收到 FIN 報(bào)文,會(huì)發(fā)送 ACK 確認(rèn)報(bào)文,并且把客戶(hù)端發(fā)送的序列號(hào)加一作為確認(rèn)報(bào)文的確認(rèn)號(hào),表示已經(jīng)收到了客戶(hù)端的報(bào)文,所以報(bào)文內(nèi)容是 ACKbit=1 seq=v ack=u+1
,之后進(jìn)入 CLOSE_WAIT(關(guān)閉等待)狀態(tài)。此時(shí)會(huì)通知應(yīng)用層的進(jìn)程,客戶(hù)端已經(jīng)不會(huì)再發(fā)送數(shù)據(jù)了。此時(shí)連接處于半關(guān)閉狀態(tài),如果服務(wù)器端發(fā)送數(shù)據(jù),客戶(hù)端還是需要接收。
客戶(hù)端收到第二次揮手的報(bào)文后,會(huì)進(jìn)入 FIN_WAIT_2(等待結(jié)束)狀態(tài),等待服務(wù)器發(fā)送最后的終止連接報(bào)文;
(3)第三次揮手:服務(wù)器端把最后的數(shù)據(jù)發(fā)送之后,就開(kāi)始向客戶(hù)端發(fā)送請(qǐng)求結(jié)束報(bào)文,F(xiàn)IN 標(biāo)志位設(shè)置為 1,確認(rèn)號(hào)設(shè)置為 u+1,比較特殊的一點(diǎn)是報(bào)文中 ACK 標(biāo)志位也是 1,報(bào)文內(nèi)容是 FINbit=1 ACKbit=1 seq=w ack=u+1
,發(fā)送之后服務(wù)器端進(jìn)入 LAST_ACK(最終確認(rèn))狀態(tài),等待客戶(hù)端的確認(rèn)報(bào)文。
(4)第四次揮手:客戶(hù)端收到服務(wù)器的請(qǐng)求斷開(kāi)連接報(bào)文后,必須還要發(fā)出一個(gè)確認(rèn)報(bào)文,ACK 標(biāo)志位設(shè)置為 1,并且序列號(hào)同上一報(bào)文的確認(rèn)號(hào),確認(rèn)號(hào)同上一報(bào)文的序列號(hào)加一,報(bào)文內(nèi)容是 ACKbit=1 seq=u+1 ack=w+1
,之后客戶(hù)端進(jìn)入 TIME_WAIT(時(shí)間等待)狀態(tài)。因?yàn)椴粫?huì)再收到服務(wù)器端的報(bào)文,所以等待 2*MSL(最大報(bào)文段生存時(shí)間)之后,自動(dòng)進(jìn)入 CLOSED(關(guān)閉)狀態(tài)。
服務(wù)器端在收到客戶(hù)端的第四次揮手報(bào)文后,立即進(jìn)入 CLOSED(關(guān)閉)狀態(tài),表示結(jié)束本次 TCP 連接。
在向面試官分析整個(gè)流程的時(shí)候,我們可以將四次報(bào)文中的第一次和第二次看作一個(gè)整體,即是客戶(hù)端發(fā)送請(qǐng)求結(jié)束報(bào)文以及收到對(duì)應(yīng)響應(yīng)。第三次和第四次又是一個(gè)整體,即服務(wù)器端發(fā)送請(qǐng)求結(jié)束報(bào)文并且收到客戶(hù)端的響應(yīng)。
2.2 為什么建立連接是三次握手,斷開(kāi)連接需要四次揮手
面試官提問(wèn): 為什么 TCP 建立連接只需要三次握手,而 TCP 斷開(kāi)連接需要四次握手?
題目解析:
關(guān)于 TCP 建立連接三次握手的必要性,我們已經(jīng)在上一章節(jié)進(jìn)行了分析,這里不再贅述,這里分析下四次握手的必要性。
前置說(shuō)明:TCP 是雙向通信的協(xié)議,客戶(hù)端可以發(fā)送和接收數(shù)據(jù),服務(wù)器端也可以發(fā)送和接收數(shù)據(jù),也就是全雙工通信模式。
第一次揮手時(shí),服務(wù)器端收到了客戶(hù)端的 FIN 請(qǐng)求結(jié)束報(bào)文,但是因?yàn)閼?yīng)用層的進(jìn)程可能還需要傳輸一些數(shù)據(jù),不能立即關(guān)閉 SOCKET,所以只能先給客戶(hù)端發(fā)送一個(gè) ACK 確認(rèn)報(bào)文,讓客戶(hù)端有 "心理準(zhǔn)備"。之后服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài),這個(gè)狀態(tài)是為了處理最后的一些數(shù)據(jù),等待這些數(shù)據(jù)也傳輸完畢之后,服務(wù)器端再發(fā)送 FIN 請(qǐng)求結(jié)束報(bào)文,到這里就已經(jīng)有三次揮手的步驟了。最后,因?yàn)榉?wù)器端也需要感知第三次揮手的報(bào)文是否成功傳輸?shù)娇蛻?hù)端,所以客戶(hù)端還需要第四次揮手的報(bào)文,來(lái)作為確認(rèn)。
2.3 TIME_WAIT 狀態(tài)
面試官提問(wèn): 第四次揮手之后,客戶(hù)端進(jìn)入的 TIME_WAIT 狀態(tài)是什么含義?有什么限制?
題目解析:
在候選人成功向面試官闡述了四次揮手的過(guò)程細(xì)節(jié)以及四次的必要性之后,面試官大概率會(huì)針對(duì) TIME_WAIT 這個(gè)狀態(tài)發(fā)出提問(wèn)。
我們將這個(gè)問(wèn)題拆解開(kāi)來(lái),分步分析:
(1)TIME_WAIT 狀態(tài)的開(kāi)始時(shí)間:TCP 連接中主動(dòng)關(guān)閉連接的一方(一般看作客戶(hù)端)發(fā)送完最后一次揮手,主動(dòng)關(guān)閉方就進(jìn)入 TIME_WAIT 狀態(tài)。
(2)TIME_WAIT 的持續(xù)時(shí)間:TIME_WAIT 的時(shí)間是 2*MSL(Maximum Segment Lifetime),即兩個(gè)最大數(shù)據(jù)段生命周期。
(3)TIME_WAIT 為什么要持續(xù) 2*MSL 這么長(zhǎng)的時(shí)間:
① 防止丟失報(bào)文導(dǎo)致異常:客戶(hù)端發(fā)送的最后一個(gè) ACK 報(bào)文可能丟失,服務(wù)器端收不到響應(yīng)則會(huì)發(fā)送第三次揮手的超時(shí)重傳報(bào)文,我們假設(shè)客戶(hù)端沒(méi)有 TIME_WAIT 狀態(tài),而是直接進(jìn)入 CLOSED 狀態(tài),則會(huì)收到非法的報(bào)文段,返回一個(gè) RST(拒絕連接)的報(bào)文,產(chǎn)生異常。
② 防止報(bào)文在網(wǎng)絡(luò)中停止影響下次建立連接:MSL 表示報(bào)文在網(wǎng)絡(luò)中的最大傳輸時(shí)間,等待 2*MSL 可以讓網(wǎng)絡(luò)中的所有舊報(bào)文段都失效,下一次重新三次握手時(shí)就不會(huì)收到無(wú)效的報(bào)文段。
3. 小結(jié)
本章節(jié)給大家分析了 TCP 關(guān)閉連接的過(guò)程以及常見(jiàn)提問(wèn),需要大家能夠在白紙上畫(huà)出 TCP 四次揮手的每個(gè)流程,并且重點(diǎn)關(guān)注 TIME_WAIT 這個(gè)狀態(tài)。