簡單說說TCP三次握手、四次揮手機制

跳躍的鍵盤手發表於2020-09-08

1.什麼是TCP

TCP全稱Transmission Control Protocol(傳輸控制協議),是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。是為了在不可靠的網際網路絡上提供可靠的端到端位元組流而專門設計的一個傳輸協議。

 關鍵資訊:

   1)面向連線

   2)可靠的

   3)基於位元組流

   4)傳輸層協議

   5)端到端

TCP的三次握手和四次揮手是分別發生在建立連線和斷開連線的過程中。

2.為什麼需要三次握手

前面我們提到說TCP是面向連線的,那麼顯然通訊的雙方如果想進行對話(資料互動)首先需要“建立連線”。那麼問題來了,如何確認通訊雙方是否建立連線了呢?TCP“三次握手”開始登場了。

請欣賞如下TCP三次握手經典圖例:(客戶端請求服務端獲取資料)

 1.第一次握手:客戶端首先向服務端傳送請求,tcp報文頭中傳送標識SYN=1(SYN表示客戶端請求跟服務端建立連線),序號Seq=x。

 2.第二次握手:服務端在接收到客戶端傳送的請求之後,需要告訴客戶端已收到請求,tcp報文頭中傳送標識SYN=1,ACK=1(SYN表示服務端請求跟客戶端建立連線,ACK表示對客戶端的連線請求進行應答),序號Seq=y,確認號=x+1(表示對客戶端傳送的序號Seq=x的請求進行確認)。

 3.第三次握手:客戶端在接收到服務端傳送的請求和確認資訊之後,同樣需要告訴服務端已收到資訊,tcp報文頭中傳送標識ACK=1(ACK表示對服務端的連線請求進行應答),序號Seq=x+1,確認號Ack=y+1(表示對服務端傳送的序號Seq=y的請求進行確認)

 當三次握手都成功的時候,我們發現此時客戶端傳送的資訊服務端能夠收到並且服務端傳送的資訊客戶端也能收到,通訊雙方連線成功

這裡我們要注意以下兩點:

1、圖中的傳送請求中的傳送標識SYN、ACK表示的是傳送報文中兩個標識位!而Seq和Ack分別代表傳送序號和確認號。

2、服務端在接收到了客戶端的連線請求後,回覆中同時傳送了SYN、ACK兩個標識位,將建立連線的請求和對客戶端的確認應答在同一個資料包中傳送了,這也是為什麼只需要三次握手,就能建立連線。

WireShark工具抓包演示效果:

 

 3.為什麼需要四次揮手

當客戶端和服務端之間的資料傳輸完畢之後,我們就需要釋放連線(一直建立連線會浪費資源),那為啥需要四次揮手呢?下面我們結合四次揮手經典圖例一起分析下:

 1.第一次揮手:客戶端向服務端傳送斷開連線的請求,告訴服務端我這邊不需要再請求你的資料了,tcp報文頭中傳送標識FIN=1(表示客戶端請求跟服務端斷開連線),序號Seq=u

 2.第二次揮手:服務端在接收到客戶端傳送的斷開請求後,需告訴客戶端已收到請求,tcp報文頭中傳送標識ACK=1(ACK表示對客戶端的斷開連線的請求進行應答),序號Seq=v,確認號Ack=u+1(表示對客戶端傳送的序號Seq=u的請求進行確認)。

 3.第三次揮手:當服務端資料傳輸完畢之後,向客戶端發起斷開連線的請求,告訴客戶端我這邊也不需要再傳送資料了,tcp報文頭中傳送標識FIN=1,ACK=1(FIN表示服務端請求跟客戶端斷開連線,ACK表示對上一次客戶端的斷開連線的請求進行應答),序號Seq=w,確認號Ack=u+1(表示對客戶端傳送的序號Seq=u的請求進行確認)

 4.第四次揮手:客戶端接收到服務傳送的斷開連線請求後,需告訴服務端已收到資訊,作出應答,tcp報文頭中傳送標識ACK=1(ACK表示對服務端的斷開連線的請求進行應答),序號Seq=u+1,確認號Ack=w+1(表示對服務端傳送的序號Seq=w的請求進行確認)

 我想說到這裡大家都會有幾個疑問

1、第二次揮手的時候。為什麼不能像握手的時候一樣,服務端對客戶端斷開連線的請求做確認應答的時候,同時向客戶端傳送斷開連線的請求。這樣“三次揮手”不就可以了麼???

解答:在實際的網路中,服務端在接收到客戶端斷開連線的請求的時候,此時服務端可能還有資料沒有傳輸完畢,不能立即向客戶端傳送斷開連線的請求!所以當客戶端主動發起斷開請求的時候,伺服器先回應一個確認,等所有資料傳輸完畢後再傳送伺服器斷開的請求。

2、在圖中我們能看到,客戶端的TIME_WAIT狀態會持續2MSL再變成CLOSED,MSL(Maximum Segment Lifetime)的中文可以譯為“報文最大生存時間”!它是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。那這裡為什麼需要維持2MSL呢?

解答:第4次揮手的時候客戶端向服務端傳送斷開連線的請求的確認ACK,如果客戶端傳送完成後就直接就關閉連線,如果由於網路原因服務端沒有收到ACK,那服務端就沒法關閉連線了!因此客戶端在回覆確認後,還需要等待,萬一服務端沒有收到應答還會繼續傳送斷開連線的請求;

4.TCP是如何保證可靠傳輸的

      前面我們還說到TCP是可靠的,TCP為了保證報文傳輸的可靠,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的位元組發回一個相應的確認(ACK);如果傳送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的資料(假設丟失了)將會被重傳。

     簡單來說,TCP通過這種通訊雙方相互應答確認超時重傳的機制來保證傳輸的可靠性。

 

感興趣的同學可以多瞭解瞭解,每天豐富自己一點點。

相關文章