三次握手
為什么需要三次握手览妖,網(wǎng)上有很多的資料解釋?zhuān)鞣N試圖使用故事、比喻來(lái)達(dá)到通俗易懂的效果诅病,然而并未觸及核心。故事看著挺有道理粥烁,但依然不能解決疑惑贤笆。最終看到讓人心悅誠(chéng)服的回答就是一句話 因?yàn)?TCP 是雙向通訊協(xié)議,作為響應(yīng)一方(Responder) 要想初始化發(fā)送通道讨阻,必須也進(jìn)行一輪 SYN + ACK
芥永。TCP 為什么是三次握手,而不是兩次或四次钝吮? - 安江澤的回答
A需要與B通信埋涧。 A 告訴B,我要與你通信奇瘦,起始位置為xxx棘催。 B 回復(fù)A 好的,我知道你的起始位置為xxx耳标。 也就是兩次握手足以讓A向B發(fā)起通信巧鸭。
然而tcp是雙向通信協(xié)議,B也需要向A發(fā)起申請(qǐng)麻捻,因此還需要兩次握手纲仍。
只不過(guò)出于優(yōu)化的目的將B的回復(fù)和B對(duì)A的申請(qǐng)合并了而已呀袱。
因此,如果只需要單向通信郑叠,兩次握手即可夜赵。
雙向通信,三次握手是優(yōu)化方案乡革。
三次握手時(shí)的tcp報(bào)文
第一次握手:
客戶(hù)端發(fā)送一個(gè)TCP的SYN標(biāo)志位置1的包指明客戶(hù)打算連接的服務(wù)器的端口寇僧,以及初始序號(hào)X,保存在包頭的序列號(hào)(Sequence Number)字段里
第二次握手 :
服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時(shí)沸版,將確認(rèn)序號(hào)(Acknowledgement Number)設(shè)置為客戶(hù)的I S N加1以.即X+1嘁傀。
第三次握手:
客戶(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
四次揮手
本質(zhì)還是雙向通信導(dǎo)致的。
A告訴B我要停止發(fā)送信息了视粮,你不用接受了细办,免得浪費(fèi)系統(tǒng)資源。 B說(shuō)好的蕾殴,我知道你不會(huì)發(fā)數(shù)據(jù)給我了笑撞。但這個(gè)時(shí)候B 還是可以發(fā)送數(shù)據(jù)的,當(dāng)然B要盡快完成發(fā)送钓觉,就像java中做些final的事情茴肥,然后說(shuō),我也沒(méi)有數(shù)據(jù)要發(fā)送了荡灾,A你可以準(zhǔn)備刪除套接字了瓤狐。 A回復(fù)B是好的,我知道你也不會(huì)發(fā)送數(shù)據(jù)了批幌,我先關(guān)閉了(這里其實(shí)會(huì)等待一段時(shí)間芬首,容錯(cuò)性設(shè)計(jì))。