禮貌地說你好——TCP協議三次握手
禮貌地說你好——TCP協議三次握手
溝通的藝術
我們在與他人溝通的時候,最基礎的最重要的是什麼?
是好的溝通方式?是恰到好處的時機?是能夠設身處地地為他人著想?
是,但不完全是,溝通的第一步當然是先要禮貌地問好啦。
等一下,我們現在在做什麼,心理學知識普及?這不是我們的目的,也不是我們的強項。
我們只是想來介紹一下,網絡中的計算機之間是如何礼貌問好地,TCP協議是如何建立連接的。
TCP協議三次握手
TCP協議報文詳解一文中,已經詳細介紹了TCP報文的內容,那麼TCP協議中,主機和主機之間,是如何建立連接的?
首先,請求建立連接的主機我們叫做客戶端,被連接的主機叫做服務端。
第一次握手
客戶端向服務端請求建立連接的時候,會發送帶有序號為j(seq=j),並且控制位為SYN=1的數據包發送給服務端,此時客戶端狀態為SYN_SENT。
第二次握手
服務端接受到數據包後,則會在未連接隊列中為客戶端的SYN包(seq=j)新增一個條目,表明已收到客戶端的數據包。並且服務端會向客戶端發送帶有序號為k(seq=k),確認號為j+1(ack=j+1),並且控制位為SYN=1,ACK=1的數據包發送給客戶端,等待客戶端確認,此時服務端狀態則為SYN_RECV。
第三次握手
客戶端收到服務端的SYN=1, ACK=1, ack=j+1, seq=k 的數據包後,則會響應一個ACK=1, seq=j+1, ack=k+1的數據包給服務端,表示客戶端已收到服務端的數據包,並進入ESTABLISHED的狀態,表示連接已建立。服務端收到ACK數據包後,則會將對應的未連接隊列中對應的條目刪除,並進入並進入ESTABLISHED的狀態,表示連接已建立。
重試與容錯
為什麼TCP協議一定要進行3次握手,2次不行嗎?
首先假設只進行兩次握手,即服務端收到SYN數據包後馬上建立連接,並開始傳輸數據,會有什麼問題呢?
如果服務端接受到SYN數據後,立馬為相應的客戶端建立連接,但是,客戶端如果因為某些原因(比如網絡中斷等),未收到客戶端的ACK數據包,請求重新建立連接,並向服務端重新發送SYN數據包。此時在服務端又需要重新創建連接資源,但是舊的的連接實際是無效連接,反而浪費了系統資源。如果大量的客戶端長時間超時重試,則會導致服務器的資源的嚴重浪費。
總結
TCP協議中,為了保證互聯網中連接的可靠性,採用了3次握手的機制。為了防止因為建立連接中斷時,而導致頻繁建立無效連接,浪費服務器資源。服務端在第一次握手時則先維持一個未連接記錄表,最後連接建立成功,再將未連接記錄表中的數據刪除。