可靠的TCP連線為何是三次握手

xiaoer_03發表於2019-03-01

首先,我們們先來熟悉下經典的tcp/ip模型。

可靠的TCP連線為何是三次握手

tcp/ip 模型為了方便使用,將osi七層模型劃分成了四層,分別為網路介面層,網路層,傳輸層,應用層。

他們作用分別為:

1)網路介面層:主要作用是將ip地址和計算機的實體地址互相繫結,並實現二進位制流和計算機硬體的高低電位的轉換。
2)網路層:主要作用是通過ip地址將兩臺物理機連結起來,實現ip資料包的傳輸;
3)傳輸層:使源端主機和目標端主機上的對等實體可以進行會話。在傳輸層定義了兩種服務質量不同的協議。即:傳輸控制協議TCP(transmission control protocol)和使用者資料包協議UDP(user datagram protocol)。;
4)應用層:負責傳送各種最終形態的資料,是直接與使用者打交道的層,典型協議是HTTP、FTP等。

今天我們們主要來看下tcp模型中主要的tcp協議。

計算機通訊中,要想實現可靠的網路通訊,tcp協議是必不可少的一環。那麼tcp協議是如何實現可靠通訊的呢?這就首先要從經典的三次握手談起。

三次握手即客戶端與伺服器至少(網路超時的話會多於三個)要傳送三個資料包來建立tcp連線。

可靠的TCP連線為何是三次握手

第一次握手:客戶端傳送建立連線資料包,傳送之後狀態變成SYN_SENT,資料包內容裡面SYN標誌位為1以及一個隨機的序列號seq,假設值為j。
第二次握手:伺服器收到請求之後,傳送資料包給客戶端,伺服器狀態變為SYN_RECV,資料包內容包含標誌位SYN和ACK,值都為1。確認序列號ack值為j+1,隨機序列號seq,假設值為i。
第三次握手:客戶端收到服務端的資料包,驗證ACK和SYN為1後,傳送一個確認資料包,客戶端進入ESTABLISHED狀態,資料包包括標誌位ACK,值為1。確認序列號ack,值為i+1。序列號seq,值為j+1.

補充說明下:確認序列號ack表示的是下一次收到的包的seq,接收方通過seq和len來確認資料包是否有效,是丟棄資料包,還是放入正常資料包序列或者是放入失序資料包序列。

那麼下面我們們來看下為啥tcp是三次握手,不是兩次,一次或者四次。

第一次握手:

a傳送一個資料包給b。如果只握一次手,就建立連線,顯然是不可能的,a連b的真實性都不知道。

第二次握手:

b收到連線請求後,傳送確認建立連線請求。如果兩次握手就成功建立連線的話會出現一個問題:
a給b傳送了一個請求連線包,由於網路原因,過了很久之後b才收到這個包,b收到之後,向a返回一個資料包。這個時候由於時間超時,a會丟掉這個資料包。如果是兩次握手的話,這時候b狀態為成功建立連線,會一直等待a傳輸資料。這樣會導致伺服器資源浪費。

第三次握手:

a收到b的確認連線請求後,驗證資料正確後,再向a傳送一個確認請求,b收到後驗證資料是否正確。正確後即連線建立成功。

三次握手可以很好的避免網路超時導致的丟包情況,伺服器和客戶端都要分別收到正確的ACK之後才能表示連線建立,如果未收到,就會啟用超時重傳機制。當然如果網路確實比較差,導致連線無法建立,也不可能一直重傳。作業系統中會有設定重傳次數這個欄位,以避免無效重轉。

為啥不四次握手:

最開始本來是四次握手,四次握手的情形是伺服器傳送的SYN和ACK是分開傳送的,所以是四次,後面給進行了優化,所以就成為了三次握手。

揮手。

當客戶端和伺服器通過三次握手建立了TCP連線以後,就可以進行資料通訊了,通訊完畢後,雙方就可以斷開連線了,斷開連線就會涉及到我們們的四次揮手了。下面我們們來簡單看下tcp的四次揮手。

可靠的TCP連線為何是三次握手

第一次揮手:

client傳送一個標誌位FIN為1和一個seq為m的資料包;

第二次揮手:

server收到了client傳送的FIN報文段,向client回一個ACK報文段,ack值為m+1,server告訴client,我“同意”你的關閉請求,這個時候client不能在傳送資料,server不能再接收資料,server還能給client傳送資料;

第三次揮手:

server向client傳送FIN報文段,請求關閉連線,同時server進入LAST_ACK狀態;

第四次揮手:

client收到server傳送的FIN報文段,向server傳送ACK報文段,然後client進入TIME_WAIT狀態;server收到client的報文段以後,就關閉連線;此時,client等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,client也可以關閉連線了。

至於為啥是四次揮手,本質的原因是我們們的tcp連線是全雙工的,在兩個方向都需要關閉,所以兩個方向都需要傳送一個關閉請求和確認請求。

下面介紹下tcp可靠的一個重要機制,超時重傳。

超時重傳是TCP協議保證資料可靠性的一個重要機制,其原理是在傳送某一個資料以後就開啟一個計時器,在一定時間內如果沒有得到傳送的資料包的ACK報文,那麼就重新傳送資料,直到傳送成功為止。三次握手,正常的資料傳輸,以及四次握手過程中只要出現超時情況,都會觸發重傳。

那麼tcp是如何界定超時的呢,這時候又引出兩個新東西。一個是RTT,另外個是RTO。感興趣的同學可以下去了解,這裡就不再詳細介紹了。

總結:tcp協議是一個很複雜的協議,本篇文章由於篇幅原因只是簡單的介紹了其中很小一個知識點,並沒有很深層次的介紹tcp,如有更多疑惑,歡迎留言討論。

相關文章