首先簡單介紹一下TCP三次握手在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接。 |
第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認。html
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器 進入SYN_RECV狀態。linux
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入 ESTABLISHED狀態,完成三次握手。服務器
經過這樣的三次握手,客戶端與服務端創建起可靠的雙工的鏈接,開始傳送數據。tcp
三次握手的最主要目的是保證鏈接是雙工的,可靠更多的是經過重傳機制來保證的。 可是爲何必定要進行三次握手來保證鏈接是雙工的呢,一次不行麼?兩次不行麼?咱們舉一個現實生活中兩我的進行語言溝通的例子來模擬三次握手。htm
第一次對話blog
老婆讓甲出去打醬油,半路碰到一個朋友乙,甲問了一句:哥們你吃飯了麼?get
結果乙帶着耳機聽歌呢,根本沒聽到,沒反應。甲內心想:跟你說話也沒個音,不跟你說了,溝通失敗。說明乙接受不到甲傳過來的信息的狀況下溝通確定是失敗的。table
若是乙聽到了甲說的話,那麼第一次對話成功,接下來進行第二次對話。im
第二次對話數據
乙聽到了甲說的話,可是他是老外,中文很差,不知道甲說的啥意思也不知道怎樣回答,因而隨便回答了一句學過的中文 :我去廁所了。甲一聽馬上笑噴了,「去廁所吃飯」?道不一樣不相爲謀,離你遠點吧,溝通失敗。說明乙沒法作出正確應答的狀況下溝通失敗。
若是乙聽到了甲的話,作出了正確的應答,而且還進行了反問:我吃飯了,你呢?那麼第二次握手成功。
經過前兩次對話證實了乙可以聽懂甲說的話,而且能作出正確的應答。接下來進行第三次對話。
第三次對話
甲剛和乙打了個招呼,忽然老婆喊他,「你個死鬼,打個醬油咋這麼半天,看我回家咋收拾你」,甲是個妻管嚴,聽完嚇得二話不說就跑回家了,把乙本身晾那了。乙心想:這什麼人啊,得,我也回家吧,溝通失敗。說明甲沒法作出應答的狀況下溝通失敗。
若是甲也作出了正確的應答:我也吃了。那麼第三次對話成功,兩人已經創建起了順暢的溝通渠道,接下來開始持續的聊天。
經過第二次和第三次的對話證實了甲可以聽懂乙說的話,而且能作出正確的應答。可見,兩我的進行有效的語言溝通,這三次對話的過程是必須的。
同理對於TCP爲何須要進行三次握手咱們能夠同樣的理解:
爲了保證服務端可以接收到客戶端的信息並能作出正確的應答而進行前兩次(第一次和第二次)握手,
爲了保證客戶端可以接收到服務端的信息並能作出正確的應答而進行後兩次(第二次和第三次)握手。