最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

首頁 慕課教程 后端通用面試教程 后端通用面試教程 計算機網(wǎng)絡(luò)TCP四次揮手

1. 前言

上一章節(jié)分析了 TCP 建立連接的過程,既然有建立連接,對應(yīng)的也有斷開連接。數(shù)據(jù)傳輸完成之后,客戶端和服務(wù)器端保持通信狀態(tài)會占用資源開銷,所以需要斷開連接,TCP 協(xié)議中斷開連接也被稱為 TCP 四次揮手。

2.1 TCP 四次揮手

面試官提問: 說明一下 TCP 斷開連接的過程,涉及到了幾個步驟?

題目解析:

圖片描述
?

(TCP 四次揮手過程)

首先從行為上分析,TCP 斷開連接總共需要發(fā)送四次報文,也就是 "四次揮手" 的過程。

我們定義發(fā)送報文的一方是客戶端,接收報文的一方是服務(wù)器端。

上一章節(jié)中已經(jīng)對三次握手過程做出了分析,在建立連接后到傳輸數(shù)據(jù)的整個過程,客戶端和服務(wù)器端均處于 ESTABLISHED(監(jiān)聽)狀態(tài),之后四次揮手的過程如下:
(1)第一次揮手:客戶端發(fā)送一個請求結(jié)束報文,其中 FIN 標(biāo)志位設(shè)置為 1,報文中給定一個序列號 u,報文內(nèi)容是 FINbit=1 seq=u,發(fā)送之后主動進(jìn)入 FIN_WAIT 狀態(tài),等待服務(wù)器端的確認(rèn)報文;

(2)第二次揮手:服務(wù)器端收到 FIN 報文,會發(fā)送 ACK 確認(rèn)報文,并且把客戶端發(fā)送的序列號加一作為確認(rèn)報文的確認(rèn)號,表示已經(jīng)收到了客戶端的報文,所以報文內(nèi)容是 ACKbit=1 seq=v ack=u+1,之后進(jìn)入 CLOSE_WAIT(關(guān)閉等待)狀態(tài)。此時會通知應(yīng)用層的進(jìn)程,客戶端已經(jīng)不會再發(fā)送數(shù)據(jù)了。此時連接處于半關(guān)閉狀態(tài),如果服務(wù)器端發(fā)送數(shù)據(jù),客戶端還是需要接收。

客戶端收到第二次揮手的報文后,會進(jìn)入 FIN_WAIT_2(等待結(jié)束)狀態(tài),等待服務(wù)器發(fā)送最后的終止連接報文;

(3)第三次揮手:服務(wù)器端把最后的數(shù)據(jù)發(fā)送之后,就開始向客戶端發(fā)送請求結(jié)束報文,F(xiàn)IN 標(biāo)志位設(shè)置為 1,確認(rèn)號設(shè)置為 u+1,比較特殊的一點是報文中 ACK 標(biāo)志位也是 1,報文內(nèi)容是 FINbit=1 ACKbit=1 seq=w ack=u+1,發(fā)送之后服務(wù)器端進(jìn)入 LAST_ACK(最終確認(rèn))狀態(tài),等待客戶端的確認(rèn)報文。

(4)第四次揮手:客戶端收到服務(wù)器的請求斷開連接報文后,必須還要發(fā)出一個確認(rèn)報文,ACK 標(biāo)志位設(shè)置為 1,并且序列號同上一報文的確認(rèn)號,確認(rèn)號同上一報文的序列號加一,報文內(nèi)容是 ACKbit=1 seq=u+1 ack=w+1,之后客戶端進(jìn)入 TIME_WAIT(時間等待)狀態(tài)。因為不會再收到服務(wù)器端的報文,所以等待 2*MSL(最大報文段生存時間)之后,自動進(jìn)入 CLOSED(關(guān)閉)狀態(tài)。

服務(wù)器端在收到客戶端的第四次揮手報文后,立即進(jìn)入 CLOSED(關(guān)閉)狀態(tài),表示結(jié)束本次 TCP 連接。

在向面試官分析整個流程的時候,我們可以將四次報文中的第一次和第二次看作一個整體,即是客戶端發(fā)送請求結(jié)束報文以及收到對應(yīng)響應(yīng)。第三次和第四次又是一個整體,即服務(wù)器端發(fā)送請求結(jié)束報文并且收到客戶端的響應(yīng)。

2.2 為什么建立連接是三次握手,斷開連接需要四次揮手

面試官提問: 為什么 TCP 建立連接只需要三次握手,而 TCP 斷開連接需要四次握手?

題目解析:

關(guān)于 TCP 建立連接三次握手的必要性,我們已經(jīng)在上一章節(jié)進(jìn)行了分析,這里不再贅述,這里分析下四次握手的必要性。

前置說明:TCP 是雙向通信的協(xié)議,客戶端可以發(fā)送和接收數(shù)據(jù),服務(wù)器端也可以發(fā)送和接收數(shù)據(jù),也就是全雙工通信模式。

第一次揮手時,服務(wù)器端收到了客戶端的 FIN 請求結(jié)束報文,但是因為應(yīng)用層的進(jìn)程可能還需要傳輸一些數(shù)據(jù),不能立即關(guān)閉 SOCKET,所以只能先給客戶端發(fā)送一個 ACK 確認(rèn)報文,讓客戶端有 "心理準(zhǔn)備"。之后服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài),這個狀態(tài)是為了處理最后的一些數(shù)據(jù),等待這些數(shù)據(jù)也傳輸完畢之后,服務(wù)器端再發(fā)送 FIN 請求結(jié)束報文,到這里就已經(jīng)有三次揮手的步驟了。最后,因為服務(wù)器端也需要感知第三次揮手的報文是否成功傳輸?shù)娇蛻舳?,所以客戶端還需要第四次揮手的報文,來作為確認(rèn)。

2.3 TIME_WAIT 狀態(tài)

面試官提問: 第四次揮手之后,客戶端進(jìn)入的 TIME_WAIT 狀態(tài)是什么含義?有什么限制?

題目解析:

在候選人成功向面試官闡述了四次揮手的過程細(xì)節(jié)以及四次的必要性之后,面試官大概率會針對 TIME_WAIT 這個狀態(tài)發(fā)出提問。

我們將這個問題拆解開來,分步分析:

(1)TIME_WAIT 狀態(tài)的開始時間:TCP 連接中主動關(guān)閉連接的一方(一般看作客戶端)發(fā)送完最后一次揮手,主動關(guān)閉方就進(jìn)入 TIME_WAIT 狀態(tài)。

(2)TIME_WAIT 的持續(xù)時間:TIME_WAIT 的時間是 2*MSL(Maximum Segment Lifetime),即兩個最大數(shù)據(jù)段生命周期。

(3)TIME_WAIT 為什么要持續(xù) 2*MSL 這么長的時間:

① 防止丟失報文導(dǎo)致異常:客戶端發(fā)送的最后一個 ACK 報文可能丟失,服務(wù)器端收不到響應(yīng)則會發(fā)送第三次揮手的超時重傳報文,我們假設(shè)客戶端沒有 TIME_WAIT 狀態(tài),而是直接進(jìn)入 CLOSED 狀態(tài),則會收到非法的報文段,返回一個 RST(拒絕連接)的報文,產(chǎn)生異常。

② 防止報文在網(wǎng)絡(luò)中停止影響下次建立連接:MSL 表示報文在網(wǎng)絡(luò)中的最大傳輸時間,等待 2*MSL 可以讓網(wǎng)絡(luò)中的所有舊報文段都失效,下一次重新三次握手時就不會收到無效的報文段。

3. 小結(jié)

本章節(jié)給大家分析了 TCP 關(guān)閉連接的過程以及常見提問,需要大家能夠在白紙上畫出 TCP 四次揮手的每個流程,并且重點關(guān)注 TIME_WAIT 這個狀態(tài)。