????????在我們的客戶端和服務(wù)器之間進行HTTP請求發(fā)送和返回的過程中煌茬,我們是需要去創(chuàng)建一個TCP connection(因為HTTP是不存在連接的,它只有請求和響應(yīng))。請求和響應(yīng)發(fā)送的都是數(shù)據(jù)包卖漫,他們之間的通信都是需要經(jīng)過一個傳輸?shù)耐ǖ婪丫。@個通道就是客戶端發(fā)起服務(wù)器接收的鏈接通道TCP connection。這個鏈接是可以一直保持的羊始,之后你進行其他操作的時候就不需要再次去建立通道了旱幼。
? ? ? ? 那么他們是怎么建立這個通道的呢,這是就是三次握手的概念(如圖:三次握手)突委。
? ? ? ? ? ? ①首先客戶端發(fā)起創(chuàng)建連接的數(shù)據(jù)包柏卤,這里標志位(SYN)等于1,和seq等于x匀油。
? ? ? ? ? ? ②服務(wù)器端接收到客戶端的數(shù)據(jù)包之后缘缚,會知道它有一個客戶端需要創(chuàng)建一個連接,服務(wù)器端會開啟一個tcp的socked端口敌蚜,開啟之后它返回給客戶端數(shù)據(jù)包桥滨,數(shù)據(jù)包內(nèi)容為SYN=1,ACK=X+1,SEQ=Y。其中的ACK為客戶端第一次發(fā)送的SEQ+1弛车,
? ? ? ? ? ? ③客戶端拿到服務(wù)器端數(shù)據(jù)包后會知道服務(wù)器端已經(jīng)允許開發(fā)創(chuàng)建tcp連接了齐媒,然后客戶端再次發(fā)送ACK=Y+1,SEQ=Z纷跛,(ACK為服務(wù)器端發(fā)送的SEQ+1喻括,SEQ為一個新的數(shù)字)
? ? ? ? 這樣就完成了一個創(chuàng)建tcp連接的過程
三次握手的優(yōu)點
? ? ? ? 三次握手最主要的目的就是雙方確認自己與對方的發(fā)送與接收是正常的。
? ? ? ? 減少服務(wù)器端開啟很多無用的請求
????????????因為網(wǎng)絡(luò)傳輸是有網(wǎng)絡(luò)延遲的贫奠,傳輸?shù)倪^程當中如果客戶端向服務(wù)器端發(fā)送請求建立的數(shù)據(jù)包唬血,服務(wù)器端直接創(chuàng)建連接,然后服務(wù)器端發(fā)送內(nèi)容數(shù)據(jù)包給客戶端唤崭。如果在這個過程中拷恨,因為網(wǎng)絡(luò)原因服務(wù)器端發(fā)送的內(nèi)容丟失『评眩客戶端就接收不到挑随,又到達了連接超時的時間客戶端會進行關(guān)閉,然后再發(fā)起新的連接請求勒叠。這樣的話服務(wù)器端是不知道的兜挨,而且以前建立的鏈接也沒關(guān)閉,服務(wù)器端會重新開啟一個新的鏈接眯分。這樣就造成了服務(wù)器端開啟無用的鏈接端口拌汇。而三次握手就解決了這樣的一個問題