來(lái)自http://www.jellythink.com/archives/705
我用自己的話(huà)總結(jié)一下吧仔雷。
三次握手
客戶(hù)端發(fā)起請(qǐng)求命雀,服務(wù)端確認(rèn)收到請(qǐng)求翔始,客戶(hù)端再次確認(rèn)收到服務(wù)器的確認(rèn),服務(wù)器收到客戶(hù)端的確認(rèn)后三次握手結(jié)束撑螺。
- 原因:一開(kāi)始也以為兩次就可以了含思,但因?yàn)楹芸赡芸蛻?hù)端的第一次請(qǐng)求因?yàn)榫W(wǎng)絡(luò)問(wèn)題,到服務(wù)端的時(shí)候甘晤,客戶(hù)端已經(jīng)出現(xiàn)關(guān)機(jī)等狀態(tài)了茸俭,然后服務(wù)器發(fā)出確認(rèn)后就會(huì)一直等著。
但假如三次握手就不會(huì)出現(xiàn)這種狀況安皱。
當(dāng)然更多的握手會(huì)更安全调鬓,但會(huì)因此犧牲效率。
四次分手
tcp是全雙工酌伊,所以任何一方都可能發(fā)起結(jié)束請(qǐng)求的信號(hào)腾窝。
A方發(fā)出結(jié)束請(qǐng)求的信號(hào)fin,表示自己不會(huì)再發(fā)送數(shù)據(jù)了居砖,但可能還會(huì)接收數(shù)據(jù)虹脯,B方馬上確認(rèn),發(fā)出信號(hào)ack奏候,同時(shí)假如它不需要再發(fā)出數(shù)據(jù)了循集,就緊接著發(fā)出結(jié)束的信號(hào)fin。最后A發(fā)出確認(rèn)信號(hào)ack蔗草,等待2mls后結(jié)束連接咒彤。
我也思考過(guò),為什么B不在發(fā)出fin后直接斷開(kāi)連接咒精,為什么A發(fā)出ack后還要等2mls镶柱?
答案很簡(jiǎn)單,因?yàn)榘l(fā)出的信號(hào)可能到達(dá)不了對(duì)面模叙,假如你直接就關(guān)閉了歇拆,對(duì)面又一直在等你,那就gg了。
- 所以B要確認(rèn)一下對(duì)面收到自己的fin了故觅,同理厂庇,A最后等2mls的意義在于,B要是沒(méi)收到自己的ack會(huì)再次發(fā)送fin输吏,A等了2mls都沒(méi)收到第二個(gè)fin宋列,那就說(shuō)明B收到了自己的ack。