TCP的三次握手和四次揮手

目錄

  • 名詞解釋
  • TCP的三次握手
    • TCP創建連接的步驟
    • TCP的三次握手步驟
    • 思考:TCP握手爲何不是兩次 or 四次?
  • TCP的四次揮手
    • TCP斷開連接的步驟
    • TCP的四次揮手步驟
    • 思考:爲何斷開連接的時候要多一個步驟2呢?
    • 思考:爲何最後客戶端確認斷開連接以後還要等待2WSL呢?
  • 面試題:TCP爲何是3次握手,4次揮手?

這是一個計算機網絡中一個很熱門,很基礎的問題,也是面試常考的一個題,若是你會那不稀奇,若是你不會,那就會涼涼。我這裏來對我學的東西作一個整理,看完時候對這裏的知識應該會很清晰。首先先來名詞解釋,若是遇到不清晰的名詞,記得反過頭來看。面試

名詞解釋

  • TCPTCP在計算機網絡模型的傳輸層,對應的是主機到主機的傳輸,爲應用間通訊提供能力。TCP 是一個雙工協議,數據任什麼時候候均可以雙向傳輸,這就意味着客戶端和服務端能夠平等地發送、接收信息。編程

  • 連接:是傳輸層的概念,連接是一種傳輸數據的行爲,是網絡行爲狀態的記錄。在傳輸以前,創建一個連接,就是在數據收發雙方的內存中都創建一個用於維護數據傳輸狀態的對象,裏面記錄了雙方的IP和端口號,狀態是怎樣,傳輸速度是如何等。後端

  • 雙工/單工服務器

名稱 概念 線路數量
單工 在任何一個時刻,若是數據只能單向發送 只需1條( =1 )
半雙工 在某個時刻數據能夠向一個方向傳輸,也能夠向另外一個方向反方向傳輸,並且交替進行 至少 1 條( >= 1 )
全雙工 任什麼時候刻數據均可以雙向收發 大於 1 條( >1 )
  • 握手TCP的握手目的是爲了創建穩定的連接通道。
  • 揮手TCP的揮手目的是爲了斷開連接。
  • WSL(Maximum Segment Lifetime):報文最大生存時間,TCP容許不一樣的實現能夠設置不一樣的WSL值。
  • seq序號:用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記📌。
  • ack肯定序號:只有ACK標誌爲1時,確認序號字段纔有效,ack = seq + 1
  • 標誌位:
    • SYN(Synchronization):一個 Host主動向另外一個 Host 發起鏈接,請求同步。
    • ACK(Acknowledgement):由於要保持鏈接和可靠性約束,TCP 協議要保證每一條發出的數據必須給返回。接收方收到數據後,都須要給發送方一個響應確認序號有序。
    • RST(Reset):重置連接
    • FIN(Finish):一個Host主動斷開請求,請求完成
    • PSH(Push):一個 Host 給另外一個Host發送數據,數據推送
    • ...

TCP的三次握手

TCP的三次握手,相對來講是一個比較完整的機制,旨在創建穩定的傳輸通道。markdown

TCP創建連接的步驟

下面來看一下TCP創建連接的6個步驟:網絡

  1. 客戶端發消息給服務端(SYN)
  2. 服務端準備好進行鏈接
  3. 服務端針對客戶端的(SYN)給一個(ACK)
  4. 服務端發送一個(SYN)給客戶端
  5. 客戶端準備就緒
  6. 客戶端給服務端發送一個(ACK)

其中,2和5步驟是不須要進行握手的,3和4是能夠合併到一塊兒的。因此雖然創建連接要6步可是隻須要三次握手,分別是1,3+4,6。併發

TCP的三次握手步驟

下面咱們把三次握手的過程還原一下:app

TCP的三次握手.jpg

  • 開始客戶端和服務端都處於CLOSED的狀態,客戶端發送SYN=1給服務端表示要求創建連接,而且發送了一個seq序號,這個時候客戶端的狀態變成SYN-SEND
  • 服務端收到消息返回一個ACK=1表示確認收到,還有ack肯定序號,是上一個seq序號+1,即x+1,還有本次的seq序號y,還有一個SYN=1創建連接,這個時候服務端狀態變成SYN-REVD
  • 客戶端收到消息以後向服務端發送一個ACK=1表示確認收到,還有一個新的seq序號是x+1,還有一個ack肯定序號是上一個seq序號+1,即y+1。完成以後客戶端的狀態編程ESTABLISHED
  • 服務端接收到消息以後狀態也變成ESTABLISHED,連接通道創建。

簡要總結就是:ui

  1. 客戶端 -> SYN -> 服務端
  2. 客戶端 <- SYN+ACK <- 服務端
  3. 客戶端 -> ACK -> 服務端

思考:TCP握手爲何不是兩次 or 四次?

設想一下,若是隻有兩次,服務端尚未肯定客戶端是否準備好了,這樣是沒法穩定的進行數據傳輸的。若是四次,服務端根據客戶端的ACK再給客戶端回覆一個ACK,沒有什麼很大的做用還形成資源浪費,那就是很沒有必要的事情了。三次正好既能夠保證可靠傳輸,也能夠提升傳輸效率,url

TCP的四次揮手

TCP的揮手旨在把連接狀態斷開

TCP斷開連接的步驟

  1. 客戶端發消息要求斷開連接(FIN)
  2. 服務端接收到請求後,會先對本身是否收到請求迴應(ACK)
  3. 服務端處理剩餘的事情,例如服務端還有沒有發送完的消息,服務端可能還有發送出去的消息沒有獲得 ACK;也有可能服務端本身有資源要釋放等。
  4. 服務端處理完本身的事情,告訴客戶端能夠關閉連接了(FIN)
  5. 客戶端收到FIN,處理本身完成的事情,好比客戶端有發送給服務端沒有收到 ACK 的請求等。
  6. 客戶端處理完成本身的事情,告訴服務端能夠關閉(ACK)

其中3和5是不須要進行揮手的,可是注意這裏,2和4是沒法合併的。因此這裏須要四次揮手,分別是1,2,4,6。

TCP的四次揮手步驟

TCP的四次揮手.jpg

  • 開始客戶端向服務端發送FIN=1要斷開連接,而且發送了一個seq序號=u,這個時候客戶端變成FIN-WAIT1
  • 服務端接收到消息以後,返回一個ACK=1肯定消息,還有ack確認序號,是上一個seq序號+1,即u+1,還有一個新的seq序號爲v,此時服務端的狀態變成CLOSE-WAIT,客戶端收到消息以後,狀態會變成FIN-WAIT2
  • 等服務端準備好全部的東西能夠關閉連接的時候,向客戶端發送ACK=1,還要發送ack確認序號,上一個seq序號+1,即u+1,還有一個新的seq序號爲w,還要發送一個FIN=1。若是有以前沒有發送完的數據,會跟着此次請求一併發送給客戶端。此時服務端的狀態變成LASE-ACK
  • 客戶端收到消息以後,把本身這裏的東西都完成向服務端發送ACK=1確認消息,還發送了ack確認序號,上一個seq序號+1,即w+1,還有一個新的seq序號爲u+1,而後客戶端的狀態就變成了TIME-WAIT,這種狀態會持續2WSL,若是等待的這段時間再也不收到後端的消息,2WSL以後會變成CLOSED。服務端接收到消息以後,狀態也變成CLOSED

簡要總結就是:

  1. 客戶端 -> FIN -> 服務端
  2. 客戶端 <- ACK <- 服務端
  3. 客戶端 <- FIN <- 服務端
  4. 客戶端 -> ACK -> 服務端

思考:爲何斷開連接的時候要多一個步驟2呢?

由於斷開連接服務端接收到FIN時,斷開鏈接要處理的問題比較多,不能直接關閉連接,這個時候若是不發送ACK迴應說是內容收到了,客戶端是沒法判斷這個消息服務端收到沒有,不能讓客戶端在這種狀況下等過久,因此應該先回復一個ACK報文說是收到了,你等會我這裏還有事情要處理。等到服務端的事情都處理完畢了,再發送一個FIN,肯定能夠斷開連接了。

思考:爲何最後客戶端確認斷開連接以後還要等待2WSL呢?

  • 第一用於保證客戶端發送的最後一個ACK報文能夠到達服務器,若是這個ACK報文丟失,服務器會以爲客戶端沒有收到我發的請求斷開報文,因而服務器就會重發一次,若是客戶端在這個2MSL時間段內收到重傳的報文,就會從新給出迴應報文,還會重啓2MSL計時器。
  • 第二是在這個2WSL時間中,可使本連接持續時間內產生的全部報文段從網絡中消失,這樣新的TCP三次握手的時候就不會出現舊連接中失效的請求報文。

面試題:TCP爲何是3次握手,4次揮手?

TCP在傳輸層,對應主機到主機的傳輸,爲應用通訊提供能力,且TCP是一個雙工協議,爲了保證雙方都創建穩定而高效的數據傳輸,使用三次握手和四次揮手的工做機制。

三次握手的步驟是:

  1. 客戶端向服務端發送SYN創建連接的請求 (大哥,能創建連接嗎?)
  2. 服務端要將ACK+SYN打包爲一條消息回覆 (老妹兒,我收到你的消息了,能夠進行連接,你收到了嗎?)
  3. 客戶端接收到消息以後給服務端發送ACK做爲回覆 (好嘞,走起~),這個時候數據傳輸通道創建。

爲何不是兩次,是由於客戶端不返回ACK,那麼服務端不知道客戶端有沒有接收到消息,若是是四次,根據ACK再返回一次ACK,浪費帶寬且沒有必要。

四次揮手的步驟是:

  1. 客戶端向服務端發送FIN斷開連接的請求 (大哥,我這邊東西都發完了,斷開連接吧~)
  2. 服務端接收到信息,給客戶端發送一個ACK進行回覆 (老妹兒?要斷開連接?我知道了,你稍等會兒啊)
  3. 服務端處理完須要處理的事情,返回FIN給客戶端 (我這邊完事兒了,斷開連接吧~)
  4. 客戶端收到消息,處理完本身的事情,返回ACK給服務端 (好嘞,掰掰~),這個時候數據傳輸通道斷開。

爲何這裏是四次,是由於斷開連接服務端收到FIN的時候,還有一些事情要處理,須要一些時間,這個時候不能讓客戶端等過久,因此先回復一個ACK表示消息已經收到了,這邊有東西要處理稍微等一下。等到事情處理完,再給客戶端發送FIN贊成斷開連接。

其實這個很好理解,在生活中,咱們收到對方發送的一個文件或者一個視頻,這個時候他們須要咱們根據內容進行回覆或者點評。咱們應該先說一句內容收到了,我看看給你回覆,這樣不會讓對方有疑問半天沒有回覆是沒有收到仍是收到了正在看。等咱們看完以後再告訴對方他們要的結果。

相關文章
相關標籤/搜索