TCP連接為什么是三次握手,而不是兩次握手,也不是四次握手?
文本轉(zhuǎn)載自公眾號(hào):程序員喬戈里(ID:CXYqiaogeli)如需轉(zhuǎn)載請(qǐng)聯(lián)系原公眾號(hào)。
喬哥:你說(shuō)“喂喂喂,能聽(tīng)到我說(shuō)話嗎?”,是***次握手,也就是說(shuō)小萌你的發(fā)送消息的能力沒(méi)有問(wèn)題,然后我回了你一句“小萌,我可以聽(tīng)到你說(shuō)話,你能聽(tīng)到我說(shuō)話嗎?”這是第二次握手,我回了你一句,說(shuō)明了我可以聽(tīng)到你說(shuō)話(說(shuō)明了我具有接受消息的能力),我對(duì)你說(shuō)了“你能聽(tīng)到我說(shuō)話嗎”也說(shuō)明了我這里也有可以發(fā)送消息的能力。到第二次握手結(jié)束,說(shuō)明了我具有發(fā)送消息和接受消息的能力,小萌你具有發(fā)送消息的能力。然后你說(shuō)“喬哥,我聽(tīng)到你說(shuō)話了”,這是第三次握手,你聽(tīng)到我說(shuō)話,也就是說(shuō)明小萌你的接受消息的能力沒(méi)有問(wèn)題。這樣就可以進(jìn)行通話了(建立了TCP連接)
小萌:“喂,喬哥聽(tīng)得到嗎?”
喬哥:“喬哥聽(tīng)得到呀,小萌你聽(tīng)得到喬哥嗎?”
小萌:“小萌能聽(tīng)到喬哥,喬哥能聽(tīng)到小萌嗎?”
小萌:1.兩次握手,這個(gè)我想是因?yàn)榉?wù)器收到了客戶端的消息,服務(wù)器知道了客戶端是可以發(fā)送消息的,但由于沒(méi)有第三次握手,所以服務(wù)器不知道客戶端是否具有接受消息的能力;
2.客戶端從服務(wù)器接受到了消息,客戶端知道了服務(wù)器接受到了我的消息才回復(fù),說(shuō)明服務(wù)器的接受消息能力和發(fā)送消息的能力沒(méi)問(wèn)題(服務(wù)器發(fā)送出了消息);
3.綜上所述,客戶端確保了服務(wù)器的接受發(fā)送沒(méi)問(wèn)題,但是服務(wù)器僅僅只知道客戶端的發(fā)送消息沒(méi)問(wèn)題,這并不是可靠的,所以兩次握手不可以。
喬戈里:這里舉個(gè)例子,假設(shè)客戶端和服務(wù)器進(jìn)行TCP連接,然后***次發(fā)送的TCP連接請(qǐng)求發(fā)生了阻塞。
于是由于客戶端沒(méi)有收到服務(wù)器的應(yīng)答報(bào)文,客戶端認(rèn)為這個(gè)TCP連接請(qǐng)求丟失了,于是重新發(fā)送了TCP連接請(qǐng)求。這次沒(méi)有阻塞,成功連接了,因?yàn)槭怯懻摰膬纱挝帐郑灾贿M(jìn)行兩次連接就可以進(jìn)行通信了。
通信結(jié)束,然后就斷開(kāi)了連接。
這時(shí)候最開(kāi)始的阻塞的連接請(qǐng)求A客戶端以為丟失了,但是沒(méi)有丟失,只是阻塞了而已,阻塞一段時(shí)間網(wǎng)絡(luò)又暢通了,于是TCP連接請(qǐng)求A成功到達(dá)了服務(wù)器,服務(wù)器又以為是客戶端又要進(jìn)行數(shù)據(jù)傳輸,于是服務(wù)器就又對(duì)這個(gè)連接請(qǐng)求進(jìn)行應(yīng)答,兩次握手,于是又成功建立了TCP連接。
但是由于客戶端它以為這個(gè)連接請(qǐng)求已經(jīng)丟失了,所以不會(huì)利用這個(gè)建立的連接請(qǐng)求進(jìn)行數(shù)據(jù)通信,雖然服務(wù)器分配給了資源給客戶端,但是客戶端并不進(jìn)行數(shù)據(jù)傳輸,這樣就白白浪費(fèi)了服務(wù)器的資源,試想一下如果網(wǎng)絡(luò)很擁堵,那么等網(wǎng)絡(luò)變暢通以后,服務(wù)器豈不是浪費(fèi)了一堆資源,可能對(duì)于正常的連接請(qǐng)求都無(wú)法處理了!

服務(wù)器過(guò)了很長(zhǎng)時(shí)間(規(guī)定好的時(shí)間和客戶端)都沒(méi)有收到回復(fù),于是也不會(huì)為客戶端分配資源,這次連接就放棄了。
作者:?jiǎn)谈昀?,百度工程師。個(gè)人微信公眾號(hào):程序員喬戈里(ID:CXYqiaogeli)