­

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

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通過這種通信雙方相互應答確認超時重傳的機制來保證傳輸的可靠性。

 

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

Tags: