可靠的TCP連接爲何是三次握手

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

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連接。

第一次握手:客戶端發送建立連接數據包,發送之後狀態變成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的四次揮手。

第一次揮手:

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,如有更多疑惑,歡迎留言討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章