對(duì)于 TCP 三次握手/四次揮手的下里巴人理解

總有人記不住(包括我自己)。整理一下,順便配上個(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

2、第二次握手(SYN-ACK)

  • 服務(wù)端:瞅你咋的?(以下兩點(diǎn)是二合一操作)
    • 承認(rèn)確實(shí)瞅?qū)Ψ搅?,并且怒氣?+ 1 后回懟(ACK=x+1
    • 問對(duì)方想咋的(SYN,SEQ=y

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ā)完)
  • 客戶端:等消息,看對(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))

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ù)端:也徹底踏實(shí)了(收到 ACK 后立即進(jìn)入 CLOSED 狀態(tài),連接正式關(guān)閉)

三、后記

其實(shí)本來很多技術(shù)方案就是按現(xiàn)實(shí)生活中的類似的場(chǎng)景進(jìn)行設(shè)計(jì)的,所以相互印證更容易記憶。

(完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容