本文作者:黎智煊,叩丁狼高級(jí)講師逊笆。原創(chuàng)文章癣缅,轉(zhuǎn)載請(qǐng)注明出處厨剪。
tcp的4次揮手(分手)協(xié)議
通俗的4次揮手講解
第一次揮手
:雙方交流的差不多了,此時(shí)客戶端也已經(jīng)結(jié)尾了友存,接下來(lái)要斷開通信連接祷膳,所以告訴服務(wù)端“我說(shuō)完了(FIN)”,此時(shí)自身形成等待結(jié)束連接的狀態(tài)屡立。第二次揮手
:服務(wù)端知道客戶端已經(jīng)沒話說(shuō)了直晨,服務(wù)端此時(shí)還有兩句心里話要給客戶端說(shuō),“我知道你說(shuō)完了(ACK),我再給你說(shuō)兩句勇皇,&*……%¥”罩句。第三次揮手
:此時(shí)客戶端洗耳恭聽繼續(xù)處于等待結(jié)束的狀態(tài),服務(wù)器端也說(shuō)完了敛摘,自身此時(shí)處于等待關(guān)閉連接的狀態(tài)门烂,并對(duì)告訴客戶端,“我說(shuō)完了着撩,咱們斷了吧(FIN)”诅福。第四次揮手
:客戶端收知道服務(wù)端也說(shuō)完了,也要告訴服務(wù)端一聲(ACK)拖叙,因?yàn)檫B接和斷開要雙方都按下關(guān)閉操作才能斷開氓润,客戶端同時(shí)又為自己定義一個(gè)定時(shí)器,因?yàn)椴恢绖偛耪f(shuō)的這句話能不能準(zhǔn)確到達(dá)服務(wù)端(網(wǎng)絡(luò)不穩(wěn)定或者其他因素引起的網(wǎng)絡(luò)原因)薯鳍,默認(rèn)時(shí)間定為兩個(gè)通信的最大時(shí)間之和咖气,超出這個(gè)時(shí)間就默認(rèn)服務(wù)器端已經(jīng)接收到了自己的確認(rèn)信息,此時(shí)客戶端就關(guān)閉自身連接挖滤,服務(wù)器端一旦接收到客戶端發(fā)來(lái)的確定通知就立刻關(guān)閉服務(wù)器端的連接崩溪。
到此為止雙方整個(gè)通信過(guò)程就此終結(jié)。這里要聲明一下:斷開鏈接不一定就是客戶端斩松,誰(shuí)都可以先發(fā)起斷開指令伶唯,另外客戶端和服務(wù)端是沒有固定標(biāo)準(zhǔn)的,誰(shuí)先發(fā)起請(qǐng)求誰(shuí)就是客戶端惧盹。
詳細(xì)的介紹
假設(shè)Client端發(fā)起中斷連接請(qǐng)求乳幸,也就是發(fā)送FIN報(bào)文。Server端接到FIN報(bào)文后钧椰,意思是說(shuō)"我Client端沒有數(shù)據(jù)要發(fā)給你了"粹断,但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關(guān)閉Socket嫡霞,可以繼續(xù)發(fā)送數(shù)據(jù)瓶埋。所以你先發(fā)送ACK,"告訴Client端诊沪,你的請(qǐng)求我收到了养筒,但是我還沒準(zhǔn)備好,請(qǐng)繼續(xù)你等我的消息"端姚。這個(gè)時(shí)候Client端就進(jìn)入FIN_WAIT狀態(tài)闽颇,繼續(xù)等待Server端的FIN報(bào)文。當(dāng)Server端確定數(shù)據(jù)已發(fā)送完成寄锐,則向Client端發(fā)送FIN報(bào)文,"告訴Client端,好了橄仆,我這邊數(shù)據(jù)發(fā)完了剩膘,準(zhǔn)備好關(guān)閉連接了"。Client端收到FIN報(bào)文后盆顾,"就知道可以關(guān)閉連接了怠褐,但是他還是不相信網(wǎng)絡(luò),怕Server端不知道要關(guān)閉您宪,所以發(fā)送ACK后進(jìn)入TIME_WAIT狀態(tài)奈懒,如果Server端沒有收到ACK則可以重傳∠芫蓿“磷杏,Server端收到ACK后,"就知道可以斷開連接了"捏卓。Client端等待了2MSL后依然沒有收到回復(fù)极祸,則證明Server端已正常關(guān)閉,那好怠晴,我Client端也可以關(guān)閉連接了遥金。Ok,TCP連接就這樣關(guān)閉了蒜田!
數(shù)據(jù)傳輸結(jié)束后稿械,通信的雙方都可釋放連接,A和B都處于ESTABLISHED狀態(tài)冲粤。(A美莫、B連接建立狀態(tài)ESTABLISHED——A終止等待1狀態(tài)FIN-WAIT-1——B關(guān)閉等待狀態(tài)CLOSE-WAIT——A終止等待2狀態(tài)FIN-WAIT-2——B最后確認(rèn)狀態(tài)LAST-ACK——A時(shí)間等待狀態(tài)TIME-WAIT——B、A關(guān)閉狀態(tài)CLOSED)
- A的應(yīng)用進(jìn)程先向其TCP發(fā)出連接釋放報(bào)文段(FIN=1色解,序號(hào)seq=u)茂嗓,并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉TCP連接科阎,進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)述吸,等待B的確認(rèn)。
- B收到連接釋放報(bào)文段后即發(fā)出確認(rèn)報(bào)文段锣笨,(ACK=1蝌矛,確認(rèn)號(hào)ack=u+1,序號(hào)seq=v)错英,B進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài)入撒,此時(shí)的TCP處于半關(guān)閉狀態(tài),A到B的連接釋放椭岩。
- A收到B的確認(rèn)后茅逮,進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài)璃赡,等待B發(fā)出的連接釋放報(bào)文段。
- B沒有要向A發(fā)出的數(shù)據(jù)献雅,B發(fā)出連接釋放報(bào)文段(FIN=1碉考,ACK=1,序號(hào)seq=w挺身,確認(rèn)號(hào)ack=u+1)侯谁,B進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài),等待A的確認(rèn)章钾。
- A收到B的連接釋放報(bào)文段后墙贱,對(duì)此發(fā)出確認(rèn)報(bào)文段(ACK=1,seq=u+1贱傀,ack=w+1)惨撇,A進(jìn)入TIME-WAIT(時(shí)間等待)狀態(tài)。此時(shí)TCP未釋放掉窍箍,需要經(jīng)過(guò)時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后串纺,A才進(jìn)入CLOSED狀態(tài)。
想獲取更多技術(shù)干貨椰棘,請(qǐng)前往叩丁狼官網(wǎng):http://www.wolfcode.cn/all_article.html