MSL是Maximum Segment Lifetime的英文縮寫,可譯為“最長報(bào)文段壽命”,它是任何報(bào)文在網(wǎng)絡(luò)上存在的最長時(shí)間,超過這個(gè)時(shí)間報(bào)文將被丟棄。
為了保證客戶端發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)服務(wù)器。
因?yàn)檫@個(gè)ACK有可能丟失,從而導(dǎo)致處在LAST-ACK狀態(tài)的服務(wù)器收不到對(duì)FIN-ACK的確認(rèn)報(bào)文。服務(wù)器會(huì)超時(shí)重傳這個(gè)FIN-ACK,接著客戶端再重傳一次確認(rèn),重新啟動(dòng)時(shí)間等待計(jì)時(shí)器。最后客戶端和服務(wù)器都能正常的關(guān)閉。假設(shè)客戶端不等待2MSL,而是在發(fā)送完ACK之后直接釋放關(guān)閉,一但這個(gè)ACK丟失的話,服務(wù)器就無法正常的進(jìn)入關(guān)閉連接狀態(tài)。
兩個(gè)理由:
1. 保證客戶端發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)服務(wù)端。
這個(gè)ACK報(bào)文段有可能丟失,使得處于LAST-ACK狀態(tài)的B收不到對(duì)已發(fā)送的FIN+ACK報(bào)文段的確認(rèn),服務(wù)端超時(shí)重傳FIN+ACK報(bào)文段,而客戶端能在2MSL時(shí)間內(nèi)收到這個(gè)重傳的FIN+ACK報(bào)文段,接著客戶端重傳一次確認(rèn),重新啟動(dòng)2MSL計(jì)時(shí)器,最后客戶端和服務(wù)端都進(jìn)入到CLOSED狀態(tài),若客戶端在TIME-WAIT狀態(tài)不等待一段時(shí)間,而是發(fā)送完ACK報(bào)文段后立即釋放連接,則無法收到服務(wù)端重傳的FIN+ACK報(bào)文段,所以不會(huì)再發(fā)送一次確認(rèn)報(bào)文段,則服務(wù)端無法正常進(jìn)入到CLOSED狀態(tài)。
2. 防止“已失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中。
客戶端在發(fā)送完最后一個(gè)ACK報(bào)文段后,再經(jīng)過2MSL,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失,使下一個(gè)新的連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求報(bào)文段。
為什么TIME_WAIT狀態(tài)需要經(jīng)過2MSL才能返回到CLOSE狀態(tài)?
理論上,四個(gè)報(bào)文都發(fā)送完畢,就可以直接進(jìn)入CLOSE狀態(tài)了,但是可能網(wǎng)絡(luò)是不可靠的,有可能最后一個(gè)ACK丟失。所以TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報(bào)文。