
總有人記不住(包括我自己)。整理一下,順便配上個(gè)接地氣的通俗理解。
一、三次握手
(一)技術(shù)描述
TCP三次握手(Three-way Handshake)是指在建立一個(gè)TCP連接時(shí),客戶端和服務(wù)器之間需要進(jìn)行的三個(gè)步驟,以確保連接的可靠性。過程如下:
1、第一次握手(SYN):
- 客戶端向服務(wù)器發(fā)送一個(gè)SYN(synchronize)標(biāo)志位的數(shù)據(jù)包,表示希望建立連接。這個(gè)數(shù)據(jù)包中包含客戶端的初始序列號(hào)(Sequence Number),用于數(shù)據(jù)傳輸中的順序控制。
2、第二次握手(SYN-ACK):
- 服務(wù)器收到客戶端的SYN請(qǐng)求后,回復(fù)一個(gè)SYN-ACK數(shù)據(jù)包。這個(gè)數(shù)據(jù)包中包含服務(wù)器的初始序列號(hào),同時(shí)將客戶端的序列號(hào)加1(表示確認(rèn)收到客戶端的SYN)。
3、第三次握手(ACK):
- 客戶端收到服務(wù)器的SYN-ACK后,再發(fā)送一個(gè)ACK(Acknowledgment)數(shù)據(jù)包,確認(rèn)已收到服務(wù)器的序列號(hào)。此時(shí),客戶端的序列號(hào)加1,服務(wù)器的序列號(hào)加1。連接正式建立,之后雙方可以進(jìn)行數(shù)據(jù)傳輸。
通過三次握手,雙方可以確認(rèn)彼此的發(fā)送和接收能力,并建立一個(gè)可靠的連接。三次握手可以防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到服務(wù)器,從而引起錯(cuò)誤。
(二)通俗理解
1、第一次握手(SYN):
- 客戶端:你瞅啥?
- 客戶端發(fā)起挑釁(
SYN,同時(shí)包含怒氣值 x,即SEQ=x)
- 客戶端發(fā)起挑釁(
2、第二次握手(SYN-ACK):
- 服務(wù)端:瞅你咋的?(以下兩點(diǎn)是二合一操作)
- 承認(rèn)確實(shí)瞅?qū)Ψ搅?,并且怒氣?+ 1 后回懟(
ACK=x+1) - 問對(duì)方想咋的(
SYN,SEQ=y)
- 承認(rèn)確實(shí)瞅?qū)Ψ搅?,并且怒氣?+ 1 后回懟(
3、第三次握手(ACK):
- 客戶端:揍你丫兒的!
- 客戶端收到了服務(wù)端返回的質(zhì)疑,怒氣值再次 + 1 后出手(ACK=y+1)
至此,二人搏擊組隊(duì)成功。
(三)為什么是三次握手
其實(shí)理論上,即便是很多很多次握手都不能確保絕對(duì)可靠。但低于三次肯定是不可靠的。
本著“少花錢多辦事兒”的性價(jià)比原則,三次是能基本保證可靠性的前提下的最廉價(jià)方案。
二、四次揮手
(一)技術(shù)描述
TCP四次揮手(Four-way Handshake)是指在斷開一個(gè)TCP連接時(shí),客戶端和服務(wù)器之間進(jìn)行的四個(gè)步驟,以確保連接的可靠關(guān)閉。具體過程如下:
1、第一次揮手(FIN):
- 客戶端發(fā)送一個(gè)FIN(finish)標(biāo)志位的數(shù)據(jù)包,表示客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了,請(qǐng)求關(guān)閉連接。此時(shí),客戶端進(jìn)入FIN_WAIT_1狀態(tài)。
2、第二次揮手(ACK):
- 服務(wù)器收到客戶端的FIN后,回復(fù)一個(gè)ACK數(shù)據(jù)包,確認(rèn)已經(jīng)接收到客戶端的關(guān)閉請(qǐng)求,但此時(shí)服務(wù)器可能還有數(shù)據(jù)需要發(fā)送。因此,服務(wù)器進(jìn)入CLOSE_WAIT狀態(tài),客戶端進(jìn)入FIN_WAIT_2狀態(tài)。
3、第三次揮手(FIN):
- 當(dāng)服務(wù)器完成數(shù)據(jù)傳輸后,發(fā)送一個(gè)FIN數(shù)據(jù)包,表示服務(wù)器也準(zhǔn)備關(guān)閉連接。此時(shí),服務(wù)器進(jìn)入LAST_ACK狀態(tài)。
4、第四次揮手(ACK):
- 客戶端收到服務(wù)器的FIN后,發(fā)送一個(gè)ACK數(shù)據(jù)包,確認(rèn)連接關(guān)閉。此時(shí),客戶端進(jìn)入TIME_WAIT狀態(tài),等待一段時(shí)間以確保服務(wù)器收到ACK,然后才進(jìn)入CLOSED狀態(tài)。服務(wù)器在收到ACK后立即進(jìn)入CLOSED狀態(tài),連接正式關(guān)閉。
關(guān)鍵狀態(tài)解釋
- FIN_WAIT_1:客戶端等待服務(wù)器的ACK確認(rèn)。
- FIN_WAIT_2:客戶端等待服務(wù)器發(fā)送關(guān)閉請(qǐng)求。
- CLOSE_WAIT:服務(wù)器等待關(guān)閉連接的處理。
- LAST_ACK:服務(wù)器等待客戶端的最后確認(rèn)。
- TIME_WAIT:客戶端等待一段時(shí)間以確保對(duì)方收到ACK,防止最后的ACK丟失。
四次揮手可以確保雙方都能正常關(guān)閉連接,并釋放各自的資源。
(二)通俗理解
類似分手。
1、第一次揮手(FIN):
- 客戶端:我們分手吧!
- 提出分手(
FIN) - 自己做好準(zhǔn)備(進(jìn)入
FIN_WAIT_1狀態(tài))
- 提出分手(
2、第二次揮手(ACK):
-
服務(wù)器:哦,俺還想挽救一下
- 回復(fù)收到對(duì)方提出的分手(
ACK) - 俺還有話沒說完:俺還是挺稀罕你滴(服務(wù)器進(jìn)入
CLOSE_WAIT狀態(tài),并繼續(xù)把為發(fā)送完的數(shù)據(jù)繼續(xù)發(fā)完)
- 回復(fù)收到對(duì)方提出的分手(
客戶端:等消息,看對(duì)方反應(yīng)(收到服務(wù)端的確認(rèn)后,進(jìn)入
FIN_WAIT_2狀態(tài))
3、第三次揮手(FIN):
- 服務(wù)器:完成最后的交流,認(rèn)真考慮并調(diào)整心態(tài)后回復(fù)“好的”
- 說完惜別的話(完成剩余的數(shù)據(jù)傳輸)同意分手(
FIN) - 自己調(diào)整狀態(tài)(服務(wù)器進(jìn)入
LAST_ACK狀態(tài))
- 說完惜別的話(完成剩余的數(shù)據(jù)傳輸)同意分手(
4、第四次揮手(ACK):
-
客戶端收到服務(wù)器同意分手,看看沒別的情況,徹底踏實(shí)了
- 客戶端收到服務(wù)器同意分手(收到服務(wù)端發(fā)來的
FIN) - 客戶端說再見(發(fā)送一個(gè)
ACK數(shù)據(jù)包,確認(rèn)連接關(guān)閉) - 客戶端看看是否有其他情況(進(jìn)入
TIME_WAIT狀態(tài),等待一段時(shí)間以確保服務(wù)器收到ACK) - 客戶端踏實(shí)了(進(jìn)入
CLOSED狀態(tài))
- 客戶端收到服務(wù)器同意分手(收到服務(wù)端發(fā)來的
服務(wù)端:也徹底踏實(shí)了(收到
ACK后立即進(jìn)入CLOSED狀態(tài),連接正式關(guān)閉)
三、后記
其實(shí)本來很多技術(shù)方案就是按現(xiàn)實(shí)生活中的類似的場(chǎng)景進(jìn)行設(shè)計(jì)的,所以相互印證更容易記憶。
(完)