禮貌地說(shuō)你好——TCP協(xié)議三次握手
溝通的藝術(shù)
我們?cè)谂c他人溝通的時(shí)候,最基礎(chǔ)的最重要的是什么?
是好的溝通方式?是恰到好處的時(shí)機(jī)?是能夠設(shè)身處地地為他人著想?
是,但不完全是,溝通的第一步當(dāng)然是先要禮貌地問(wèn)好啦。
等一下,我們現(xiàn)在在做什么,心理學(xué)知識(shí)普及?這不是我們的目的,也不是我們的強(qiáng)項(xiàng)。
我們只是想來(lái)介紹一下,網(wǎng)絡(luò)中的計(jì)算機(jī)之間是如何禮貌問(wèn)好地,TCP協(xié)議是如何建立連接的。
TCP協(xié)議三次握手
TCP協(xié)議報(bào)文詳解一文中,已經(jīng)詳細(xì)介紹了TCP報(bào)文的內(nèi)容,那么TCP協(xié)議中,主機(jī)和主機(jī)之間,是如何建立連接的?
首先,請(qǐng)求建立連接的主機(jī)我們叫做客戶端,被連接的主機(jī)叫做服務(wù)端。
第一次握手
客戶端向服務(wù)端請(qǐng)求建立連接的時(shí)候,會(huì)發(fā)送帶有序號(hào)為j(seq=j),并且控制位為SYN=1的數(shù)據(jù)包發(fā)送給服務(wù)端,此時(shí)客戶端狀態(tài)為SYN_SENT。
第二次握手
服務(wù)端接受到數(shù)據(jù)包后,則會(huì)在未連接隊(duì)列中為客戶端的SYN包(seq=j)新增一個(gè)條目,表明已收到客戶端的數(shù)據(jù)包。并且服務(wù)端會(huì)向客戶端發(fā)送帶有序號(hào)為k(seq=k),確認(rèn)號(hào)為j+1(ack=j+1),并且控制位為SYN=1,ACK=1的數(shù)據(jù)包發(fā)送給客戶端,等待客戶端確認(rèn),此時(shí)服務(wù)端狀態(tài)則為SYN_RECV。
第三次握手
客戶端收到服務(wù)端的 SYN=1, ACK=1, ack=j+1, seq=k 的數(shù)據(jù)包后,則會(huì)響應(yīng)一個(gè)ACK=1, seq=j+1, ack=k+1的數(shù)據(jù)包給服務(wù)端,表示客戶端已收到服務(wù)端的數(shù)據(jù)包,并進(jìn)入ESTABLISHED的狀態(tài),表示連接已建立。服務(wù)端收到ACK數(shù)據(jù)包后,則會(huì)將對(duì)應(yīng)的未連接隊(duì)列中對(duì)應(yīng)的條目刪除,并進(jìn)入并進(jìn)入ESTABLISHED的狀態(tài),表示連接已建立。
重試與容錯(cuò)
為什么TCP協(xié)議一定要進(jìn)行3次握手,2次不行嗎?
首先假設(shè)只進(jìn)行兩次握手,即服務(wù)端收到SYN數(shù)據(jù)包后馬上建立連接,并開(kāi)始傳輸數(shù)據(jù),會(huì)有什么問(wèn)題呢?
如果服務(wù)端接受到SYN數(shù)據(jù)后,立馬為相應(yīng)的客戶端建立連接,但是,客戶端如果因?yàn)槟承┰颍ū热缇W(wǎng)絡(luò)中斷等),未收到客戶端的ACK數(shù)據(jù)包,請(qǐng)求重新建立連接,并向服務(wù)端重新發(fā)送SYN數(shù)據(jù)包。此時(shí)在服務(wù)端又需要重新創(chuàng)建連接資源,但是舊的的連接實(shí)際是無(wú)效連接,反而浪費(fèi)了系統(tǒng)資源。如果大量的客戶端長(zhǎng)時(shí)間超時(shí)重試,則會(huì)導(dǎo)致服務(wù)器的資源的嚴(yán)重浪費(fèi)。
總結(jié)
TCP協(xié)議中,為了保證互聯(lián)網(wǎng)中連接的可靠性,采用了3次握手的機(jī)制。為了防止因?yàn)榻⑦B接中斷時(shí),而導(dǎo)致頻繁建立無(wú)效連接,浪費(fèi)服務(wù)器資源。服務(wù)端在第一次握手時(shí)則先維持一個(gè)未連接記錄表,最后連接建立成功,再將未連接記錄表中的數(shù)據(jù)刪除。