前篇文推了TCP三次握手,現(xiàn)在給大家介紹一些什么叫做TCP的四次揮手。
1)四次揮手的詳述
假設(shè)Client端發(fā)起中斷連接請求,也就是發(fā)送FIN報(bào)文。Server端接到FIN報(bào)文后,意思是說"我Client端沒有數(shù)據(jù)要發(fā)給你了",但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關(guān)閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK,"告訴Client端,你的請求我收到了,但是我還沒準(zhǔn)備好,請繼續(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則可以重傳?!埃琒erver端收到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)
·?1)A的應(yīng)用進(jìn)程先向其TCP發(fā)出連接釋放報(bào)文段(FIN=1,序號seq=u),并停止再發(fā)送數(shù)據(jù),主動關(guān)閉TCP連接,進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài),等待B的確認(rèn)。
·?2)B收到連接釋放報(bào)文段后即發(fā)出確認(rèn)報(bào)文段,(ACK=1,確認(rèn)號ack=u+1,序號seq=v),B進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài),此時(shí)的TCP處于半關(guān)閉狀態(tài),A到B的連接釋放。
·?3)A收到B的確認(rèn)后,進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報(bào)文段。
·?4)B沒有要向A發(fā)出的數(shù)據(jù),B發(fā)出連接釋放報(bào)文段(FIN=1,ACK=1,序號seq=w,確認(rèn)號ack=u+1),B進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài),等待A的確認(rèn)。
·5)A收到B的連接釋放報(bào)文段后,對此發(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)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后,A才進(jìn)入CLOSED狀態(tài)。
2)總結(jié)四次揮手過程:
起初A和B處于ESTABLISHED狀態(tài)——A發(fā)出連接釋放報(bào)文段并處于FIN-WAIT-1狀態(tài)——B發(fā)出確認(rèn)報(bào)文段且進(jìn)入CLOSE-WAIT狀態(tài)——A收到確認(rèn)后,進(jìn)入FIN-WAIT-2狀態(tài),等待B的連接釋放報(bào)文段——B沒有要向A發(fā)出的數(shù)據(jù),B發(fā)出連接釋放報(bào)文段且進(jìn)入LAST-ACK狀態(tài)——A發(fā)出確認(rèn)報(bào)文段且進(jìn)入TIME-WAIT狀態(tài)——B收到確認(rèn)報(bào)文段后進(jìn)入CLOSED狀態(tài)——A經(jīng)過等待計(jì)時(shí)器時(shí)間2MSL后,進(jìn)入CLOSED狀態(tài)。
(3)為什么A在TIME-WAIT狀態(tài)必須等待2MSL的時(shí)間?MSL最長報(bào)文段壽命Maximum Segment Lifetime,MSL=2
答:
????兩個(gè)理由:
????????1)保證A發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)B。
????????2)防止“已失效的連接請求報(bào)文段”出現(xiàn)在本連接中。
·?1)這個(gè)ACK報(bào)文段有可能丟失,使得處于LAST-ACK狀態(tài)的B收不到對已發(fā)送的FIN+ACK報(bào)文段的確認(rèn),B超時(shí)重傳FIN+ACK報(bào)文段,而A能在2MSL時(shí)間內(nèi)收到這個(gè)重傳的FIN+ACK報(bào)文段,接著A重傳一次確認(rèn),重新啟動2MSL計(jì)時(shí)器,最后A和B都進(jìn)入到CLOSED狀態(tài),若A在TIME-WAIT狀態(tài)不等待一段時(shí)間,而是發(fā)送完ACK報(bào)文段后立即釋放連接,則無法收到B重傳的FIN+ACK報(bào)文段,所以不會再發(fā)送一次確認(rèn)報(bào)文段,則B無法正常進(jìn)入到CLOSED狀態(tài)。
·?2)A在發(fā)送完最后一個(gè)ACK報(bào)文段后,再經(jīng)過2MSL,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失,使下一個(gè)新的連接中不會出現(xiàn)這種舊的連接請求報(bào)文段。
(4)為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次握手?
答:因?yàn)楫?dāng)Server端收到Client端的SYN連接請求報(bào)文后,可以直接發(fā)送SYN+ACK報(bào)文。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來同步的。但是關(guān)閉連接時(shí),當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會立即關(guān)閉SOCKET,所以只能先回復(fù)一個(gè)ACK報(bào)文,告訴Client端,"你發(fā)的FIN報(bào)文我收到了"。只有等到我Server端所有的報(bào)文都發(fā)送完了,我才能發(fā)送FIN報(bào)文,因此不能一起發(fā)送。故需要四步握手。
請關(guān)注微信公眾號:請快點(diǎn)喜歡我