此心光明罢荡,亦復(fù)何言
TCP建立連接時三次握手,斷開時為何4次握手的自我理解:(面試常問)
現(xiàn)在來說明為何分手要4次
因為連接時,調(diào)用socket的connect函數(shù)發(fā)送SYN包区赵,而服務(wù)器端只是accept一下,就一次發(fā)送了SYN和ACK標(biāo)志位漱受,而到了斷開連接時大家都要調(diào)用各自的close函數(shù)結(jié)束這段socket(騷)戀情骡送,所以兩次close分別觸發(fā)了兩次FIN包昂羡,導(dǎo)致沒有和ACK合并為一個包,所以握手3次摔踱,分手要4次虐先。
下面來正經(jīng)的蛹批,TCP/IP協(xié)議三次握手與四次握手流程解析
三次握手
所謂三次握手(Three-Way Handshake)即建立TCP連接腐芍,就是指建立一個TCP連接時甸赃,需要客戶端和服務(wù)端總共發(fā)送3個包以確認連接的建立冗酿。在socket編程中裁替,這一過程由客戶端執(zhí)行connect來觸發(fā)弱判,整個流程如下圖所示:
四次揮手
三次握手耳熟能詳昌腰,四次揮手估計就...遭商,所謂四次揮手(Four-Way Wavehand)即終止TCP連接劫流,就是指斷開一個TCP連接時祠汇,需要客戶端和服務(wù)端總共發(fā)送4個包以確認連接的斷開。在socket編程中诗力,這一過程由客戶端或服務(wù)端任一方執(zhí)行close來觸發(fā)我抠,整個流程如下圖所示:
由于TCP連接時全雙工的圈澈,因此康栈,每個方向都必須要單獨進行關(guān)閉喷橙,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后贰逾,發(fā)送一個FIN來終止這一方向的連接疙剑,收到一個FIN只是意味著這一方向上沒有數(shù)據(jù)流動了言缤,即不會再收到數(shù)據(jù)了,但是在這個TCP連接上仍然能夠發(fā)送數(shù)據(jù)轿曙,直到這一方向也發(fā)送了FIN导帝。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉您单,而另一方則執(zhí)行被動關(guān)閉睹限,上圖描述的即是如此。
上面是一方主動關(guān)閉染服,另一方被動關(guān)閉的情況柳刮,實際中還會出現(xiàn)同時發(fā)起主動關(guān)閉的情況秉颗,具體流程如下圖:
流程和狀態(tài)在上圖中已經(jīng)很明了了,在此不再贅述菇怀,可以參考前面的四次揮手解析步驟
思考:
為什么建立連接是三次握手爱沟,而關(guān)閉連接卻是四次揮手呢呼伸?
答:
這是因為服務(wù)端在LISTEN狀態(tài)下括享,收到建立連接請求的SYN報文后奶浦,把ACK和SYN放在一個報文里發(fā)送給客戶端。
而關(guān)閉連接時隙咸,當(dāng)收到對方的FIN報文時沐悦,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對方了五督,所以己方可以立即close藏否,也可以發(fā)送一些數(shù)據(jù)給對方后,再發(fā)送FIN報文給對方來表示同意現(xiàn)在關(guān)閉連接充包,因此,己方ACK和FIN一般都會分開發(fā)送淆储。