為什么TCP 要采用「3次握手」建立連接?1個(gè)例子教會(huì)你
首先說(shuō)說(shuō)為什么是三次握手?
當(dāng)客戶(hù)端發(fā)送一次請(qǐng)求A后,但是A在網(wǎng)絡(luò)延遲了很久, 接著客戶(hù)端又發(fā)送了一次B,但是此時(shí)A已經(jīng)無(wú)效了。
接著服務(wù)器相應(yīng)了B,并返回TCP連接頭,建立連接(這里就2次哈)。
然后,A 歷經(jīng)千山萬(wàn)水終于到服務(wù)器了, 服務(wù)器一看有請(qǐng)求來(lái)了,則接受。
由于一開(kāi)始A帶著的TCP格式都是正確的,那么服務(wù)器,理所應(yīng)當(dāng)?shù)囊卜祷爻晒B接的flag,但是,此時(shí)客戶(hù)端已經(jīng)判斷該次請(qǐng)求無(wú)效,廢棄了。
然后服務(wù)器,就這么一直掛著(浪費(fèi)資源),造成的一個(gè)問(wèn)題是,md, 這個(gè)鍋是誰(shuí)的?所以,為了保險(xiǎn)起見(jiàn),再補(bǔ)充一次連接就可以了。
所以3次是最合適的。在Chinese中,以3為起稱(chēng)為多,如果你用4,5,6,7,8...次的話(huà),這不更浪費(fèi)嗎?
TCP作為一種可靠傳輸控制協(xié)議,其核心思想:既要保證數(shù)據(jù)可靠傳輸,又要提高傳輸?shù)男剩萌吻∏】梢詽M(mǎn)足以上兩方面的需求。
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接,鏈接過(guò)程是這樣:
- ***次握手:建立連接時(shí),客戶(hù)端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
- 第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶(hù)的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器 進(jìn)入SYN_RECV狀態(tài);
- 第三次握手:客戶(hù)端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入 ESTABLISHED狀態(tài),完成三次握手。
為什么要進(jìn)行三次握手?舉個(gè)栗子吧!
在紅軍時(shí)期,A連和B連分在左右翼,約定在幾時(shí)幾分一同發(fā)起打擊。這個(gè)幾時(shí)幾分的信息就需要人工通過(guò)通訊員來(lái)走路傳遞。所以A連指揮官派出通訊員。
這是***次。
假設(shè)通訊員到達(dá)了B連,并且告知了B連指揮官幾時(shí)幾分,B連指揮官一定會(huì)讓通訊員再回去通知A連指揮官,可憐的通訊員只能冒著危險(xiǎn)返回A連,因?yàn)锳連指揮官看不到通訊員返回的話(huà),不知道幾時(shí)幾分這個(gè)信息到底傳達(dá)到了B連沒(méi)有。
這是第二次。
現(xiàn)在B連指揮官開(kāi)始擔(dān)心通訊員是否回到了A連,如果沒(méi)回到,B連指揮官會(huì)設(shè)身處地的想一想A連指揮官見(jiàn)不到返回的通訊員,肯定是不敢打的,所以B連指揮官最盼望的是再次看到通訊員出現(xiàn)在B連,所以A連指揮官會(huì)讓通訊員再回B連一次。
因此可以說(shuō)三次握手是在最快最省力的情況下作出的選擇。
上面分析還不夠形象,很容易忘記,下面我們利用wireshark來(lái)證明一下上面的分析過(guò)程。
從下面的的輸出就可以很容易看出來(lái),必須要經(jīng)過(guò)前面的三次tcp請(qǐng)求才會(huì)有起一次http請(qǐng)求。
***次握手?jǐn)?shù)據(jù)包,客戶(hù)端發(fā)送一個(gè)TCP,標(biāo)志位為SYN,序列號(hào)為0, 代表客戶(hù)端請(qǐng)求建立連接,如下圖所示
(***次握手)
第二次握手的數(shù)據(jù)包,服務(wù)器發(fā)回確認(rèn)包, 標(biāo)志位為 SYN,ACK. 將確認(rèn)序號(hào)(Acknowledgement Number)設(shè)置為客戶(hù)的I S N加1以.即0+1=1,如下圖所示
(第二次握手)
第三次握手的數(shù)據(jù)包,客戶(hù)端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0,ACK標(biāo)志位為1.并且把服務(wù)器發(fā)來(lái)ACK的序號(hào)字段+1,放在確定字段中發(fā)送給對(duì)方.并且在數(shù)據(jù)段放寫(xiě)ISN的+1,如下圖所示
(第三次握手)
以上就是 wireshark中的tcp三次握手過(guò)程。
今天的分享就把到這了。