TCP連接釋放的過(guò)程可稱之為四次揮手,可以簡(jiǎn)單的這樣理解,當(dāng)建立連接時(shí)是建立了C->S和S->C,所以在釋放的時(shí)候要對(duì)兩邊都進(jìn)行釋放,具體如圖:

第一次揮手:C客戶端的應(yīng)用程序先向其TCP發(fā)出釋放報(bào)文段,并且停止發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉TCP連接,C把連接釋放報(bào)文段的終止控制位FIN=1,其序號(hào)seq=u,這個(gè)u是前面已經(jīng)傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)+1,這個(gè)時(shí)候C進(jìn)入FIN-WAIT1(終止等待1)狀態(tài),等待S的確認(rèn),TCP規(guī)定FIN段即使不攜帶數(shù)據(jù),也消耗一個(gè)序號(hào)。
第二次揮手:S服務(wù)器收到釋放報(bào)文段后即發(fā)出確認(rèn),確認(rèn)號(hào)ack=u+1,自己報(bào)文段的序號(hào)是v,同樣的v等于S傳送過(guò)的最后一個(gè)字節(jié)的序號(hào)+1,然后S進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài),TCP服務(wù)器通知應(yīng)用層,到此C->S的連接就釋放了,但是這個(gè)時(shí)候的TCP連接是一種半關(guān)閉狀態(tài),就是當(dāng)S向C發(fā)送數(shù)據(jù)的時(shí)候,C仍然要接收,只是C已經(jīng)沒(méi)有數(shù)據(jù)向S發(fā)送了。這個(gè)時(shí)候C收到了來(lái)自S的確認(rèn)后,C就進(jìn)入了FIN-WAIT-2(終止等待2)狀態(tài),等待S發(fā)出連接釋放報(bào)文。
第三次揮手:若S沒(méi)有要發(fā)送的數(shù)據(jù)了,其應(yīng)用進(jìn)程就通知TCP釋放連接,這個(gè)時(shí)候S發(fā)出的連接釋放報(bào)文段中FIN=1,現(xiàn)在假設(shè)S的序號(hào)是w(半關(guān)閉狀態(tài)S可能還向C發(fā)送一些數(shù)據(jù)),S這個(gè)時(shí)候還是發(fā)送確認(rèn)號(hào)ack=u+1,然后進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài),等待C的確認(rèn)。
第四次揮手:C收到S的釋放報(bào)文段后,必須給出確認(rèn),在確認(rèn)報(bào)文段中ACK=1,seq=u+1,ack=w+1,然后進(jìn)入TIME-WAIT(事件等待)狀態(tài),到現(xiàn)在TCP連接還沒(méi)有釋放,必須等待時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后,C才進(jìn)入CLOSED狀態(tài)。
為什么要設(shè)置這個(gè)2MSL?MSL是什么?
MSL指的是最長(zhǎng)報(bào)文壽命,一般2min,設(shè)置這個(gè)2MLS
為了保證C發(fā)送的最后一個(gè)確認(rèn)報(bào)文來(lái)夠到達(dá)S,因?yàn)檫@個(gè)報(bào)文可能會(huì)丟失,當(dāng)丟失的時(shí)候,S會(huì)因?yàn)槭詹坏酱_認(rèn)而重傳FIN+ACK報(bào)文,而C可以在2MLS事件內(nèi)接收到這個(gè)報(bào)文,接著C重傳ACK確認(rèn)報(bào)文并且重置這個(gè)2MLS。最后S和C都進(jìn)入CLOSED狀態(tài)。
值得注意的是S端的TCP連接斷開(kāi)會(huì)早于C。