連三次握手,四次揮手都不知道,還敢說自己是學IT的?

前言

  • 衆所周知,TCP(傳輸控制協議)是面向連接的、高可靠的、基於字節流的運輸層傳輸協議。不像UDP傳輸時直接把東西丟給對方,TCP建立傳輸連接時需要嚴格的三次握手,釋放連接時也需要四次揮手。那麼這三次握手和四次揮手又是啥東西呢?

三次握手

三次握手概述

  • 所謂三次握手就是TCP連接建立時需要在客戶和服務器之間交換三個TCP報文段。
  • 其目的在於
  1. 要使每一方能夠明確知道對方的存在,就像拉朋友打遊戲前——“在?”,“在”,“雞?”,“來”。
  2. 要允許雙方協商一些參數(如最大窗口值、最大報文段長度MSS、是否使用窗口擴大選項和時間戳選項以及服務質量等)——“啥地圖?”,“海島就成。”
  3. 能夠對運輸實體資源(如緩存大小、連接表中的項目等)進行分配——“有時間打吧,別一會兒掛機了”,“有”。

三次握手過程

第一次握手

第一次握手

  • 第一次握手由客戶端發起,向服務端發出請求報文,其中同步位SYN爲1,表示這是個請求報文,seq爲序號,然後等待服務器確認,此時客戶端進入SYN_SENT狀態。

第二次握手

第二次握手

  • 第二次握手由服務端發出,對客戶端的請求表示確認ACK=1表示確認,同意連接,ack = x+1表示確認收到前x序號內容。同時服務端再發送一個SYN包,請求客戶端的確認,seq置爲y,表明傳輸數據時的第一個字節序號。SYN+ACK包發送完畢,服務端進入SYN_RECV狀態。

第三次握手

在這裏插入圖片描述

  • 客戶端收到服務器給出的報文段後發出ACK包對其進行確認,ack=y+1,seq=x+1,此報文段發送完畢後,連接建立成功,開始傳輸數據,雙方進入ESTAB-LISHED狀態。
    在這裏插入圖片描述

爲什麼要第進行三次握手(要對確認進行確認)?

  • 爲了防止已失效的連接請求報文段突然又傳送到了,因而產生錯誤。
  • 如果採取兩次握手,相當於第二次握手結束便建立連接,如果發送SYN的一方不想連接了,也不會有反饋,另一方卻一直在等待,浪費了時間。當然可以採取4次甚至N次握手,但是有必要嗎?建立連接的時間太長,效果也會大打折扣。所以3次只是折中方案,保證了可靠性,又節儉了建立連接的時間。(摘自小飛

四次揮手

四次揮手概述(原因)

  • 數據傳輸結束後,通信雙方要釋放連接
  • 由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。
  • 這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

四次揮手過程

第一次揮手

第一次揮手

  • 客戶端首先發送FIN報文段(連接釋放報文段),主動關閉客戶端到服務器的數據傳輸,FIN置爲1,其序號seq=u,並等待B的確認。

第二次揮手

第二次揮手

  • 服務端收到客戶端的連接釋放報文段,對其發出確認,發回一個ACK確認報文,確認號收到的序號加一即u+1,此時從客戶端到服務器方向的連接就釋放完成,TCP連接處於半關閉狀態,如果服務器端仍要發送數據,那麼客戶端依舊需要接收。

第三次揮手

第三次揮手

  • 第三次揮手依舊由服務端發出,類似第一次揮手,如果服務端沒有要向客戶端發送的數據了,應用進程通知TCP釋放連接,同時發送一個FIN報文,ACK置爲1,seq序號置爲w,確認號ack置爲u+1。

第四次揮手

第四次揮手

  • 客戶端收到服務端的FIN報文,對其進行確認,發出確認報文,確認號置ack爲w+1,自己的序號seq=u+1。至此,雖然完成了四次揮手但連接並未完全釋放。必須經過時間2MSL後才能真正釋放掉。

四次揮手中客戶端服務端各狀態

在這裏插入圖片描述

爲什麼要經過2MSL時間才能釋放

  1. 爲了保證A發送的最後一個ACK報文段能夠到達B
  2. 防止已失效的連接請求報文段出現在本連接中

後記

  • 三次握手和四次揮手講解完畢。
  • 如有錯誤的地方,請大佬指正。
  • 轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章