1. 程式人生 > >形象的理解TCP協議為什麼要“三次握手”

形象的理解TCP協議為什麼要“三次握手”

       我們先來看看專業的解讀是怎麼簡單描述“三次握手”的。以下圖片來自百度百科:

       如果你看完一臉懵圈,不妨想想三次握手的目的?那就是確保客戶端和伺服器能夠正常通訊。當然,本文只是從非專業的角度解釋為何TCP建立連線的三次握手就能保證正常通訊,為何不是兩次或者四次?至於其中的各種細節,請參考專業書籍(如計算機網路),這裡只是對其原理進行更容易理解的闡述,方便不非專業人士瞭解三次握手的原理,從而進一步深入並專業地學習。接下來,我會用非常“不專業”的描述,讓你明白這看似冗雜的“三次握手”。

       首先HTTP網路通訊是雙向的,也就是說客戶端和伺服器是雙向通訊的。我們可以簡單的把客戶端理解為你本人,伺服器端理解為你的追求者(你的物件~)。而你倆要建立正常通訊,有兩個前提。1. 你說的話對方能聽到,而且你自己知道你說的話對方能聽到; 2. 對方的話你也要能聽到,而且對方知道Ta的話你聽得到。一次模擬的“三次握手”開始了。

        你對你物件說:“我喜歡你!”等待著Ta的回答(這是第一次握手)。相當於客戶端傳送syn包(同步序列編號Synchronize Sequence Numbers)(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認。假設這條資訊成功傳達給對方了(這時第一次握手成功完成),Ta也願意建立通訊於是就回答:“聽到了!”(第二次握手)。相當於伺服器確認客戶的SYN(ack=j+1),並向客戶端傳送(syn=k)。假設你物件回給你的話你也聽到了,那麼第二次握手就完成了。

        這時候你說的話你物件能聽到,而且你確認了這一事實,你物件說話你也能聽到。但是還沒完,請看我上面說的兩點,還差半點“對方並不知道她(他)自己的話你又是否聽得到”,因為你沒有回覆Ta。於是第三次握手開始了,你對Ta說:“我知道你聽到了!”,對方也能聽到並確認了。(客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED(TCP連線成功)狀態,完成三次握手!)。至此,通訊真的可以建立了。因為雙方都確認了另一方能收到自己發出的資訊。

        這就是理解三次握手的原理!至於Backlog引數,TCP頭結構,標誌控制,序列標識等內容,你理解上面的描述後也能更好地理解了。