禮貌地說你好——TCP協(xié)議三次握手
溝通的藝術(shù)
我們在與他人溝通的時候,最基礎(chǔ)的最重要的是什么?
是好的溝通方式?是恰到好處的時機?是能夠設(shè)身處地地為他人著想?
是,但不完全是,溝通的第一步當然是先要禮貌地問好啦。
等一下,我們現(xiàn)在在做什么,心理學(xué)知識普及?這不是我們的目的,也不是我們的強項。
我們只是想來介紹一下,網(wǎng)絡(luò)中的計算機之間是如何禮貌問好地,TCP協(xié)議是如何建立連接的。

TCP協(xié)議三次握手
TCP協(xié)議報文詳解一文中,已經(jīng)詳細介紹了TCP報文的內(nèi)容,那么TCP協(xié)議中,主機和主機之間,是如何建立連接的?

首先,請求建立連接的主機我們叫做客戶端,被連接的主機叫做服務(wù)端。
第一次握手
客戶端向服務(wù)端請求建立連接的時候,會發(fā)送帶有序號為j(seq=j),并且控制位為SYN=1的數(shù)據(jù)包發(fā)送給服務(wù)端,此時客戶端狀態(tài)為SYN_SENT。
第二次握手
服務(wù)端接受到數(shù)據(jù)包后,則會在未連接隊列中為客戶端的SYN包(seq=j)新增一個條目,表明已收到客戶端的數(shù)據(jù)包。并且服務(wù)端會向客戶端發(fā)送帶有序號為k(seq=k),確認號為j+1(ack=j+1),并且控制位為SYN=1,ACK=1的數(shù)據(jù)包發(fā)送給客戶端,等待客戶端確認,此時服務(wù)端狀態(tài)則為SYN_RECV。
第三次握手
客戶端收到服務(wù)端的 SYN=1, ACK=1, ack=j+1, seq=k 的數(shù)據(jù)包后,則會響應(yīng)一個ACK=1, seq=j+1, ack=k+1的數(shù)據(jù)包給服務(wù)端,表示客戶端已收到服務(wù)端的數(shù)據(jù)包,并進入ESTABLISHED的狀態(tài),表示連接已建立。服務(wù)端收到ACK數(shù)據(jù)包后,則會將對應(yīng)的未連接隊列中對應(yīng)的條目刪除,并進入并進入ESTABLISHED的狀態(tài),表示連接已建立。
重試與容錯
為什么TCP協(xié)議一定要進行3次握手,2次不行嗎?
首先假設(shè)只進行兩次握手,即服務(wù)端收到SYN數(shù)據(jù)包后馬上建立連接,并開始傳輸數(shù)據(jù),會有什么問題呢?
如果服務(wù)端接受到SYN數(shù)據(jù)后,立馬為相應(yīng)的客戶端建立連接,但是,客戶端如果因為某些原因(比如網(wǎng)絡(luò)中斷等),未收到客戶端的ACK數(shù)據(jù)包,請求重新建立連接,并向服務(wù)端重新發(fā)送SYN數(shù)據(jù)包。此時在服務(wù)端又需要重新創(chuàng)建連接資源,但是舊的的連接實際是無效連接,反而浪費了系統(tǒng)資源。如果大量的客戶端長時間超時重試,則會導(dǎo)致服務(wù)器的資源的嚴重浪費。

總結(jié)
TCP協(xié)議中,為了保證互聯(lián)網(wǎng)中連接的可靠性,采用了3次握手的機制。為了防止因為建立連接中斷時,而導(dǎo)致頻繁建立無效連接,浪費服務(wù)器資源。服務(wù)端在第一次握手時則先維持一個未連接記錄表,最后連接建立成功,再將未連接記錄表中的數(shù)據(jù)刪除。















 
 
 











 
 
 
 