您好,登錄后才能下訂單哦!
MSL是Maximum Segment Lifetime的英文縮寫,可譯為“最長報文段壽命”,它是任何報文在網(wǎng)絡(luò)上存在的最長的最長時間,超過這個時間報文將被丟棄。我們都知道IP頭部中有個TTL字段,TTL是time to live的縮寫,可譯為“生存時間”,這個生存時間是由源主機(jī)設(shè)置設(shè)置初始值但不是但不是存在的具體時間,而是一個IP數(shù)據(jù)報可以經(jīng)過的最大路由數(shù),每經(jīng)過一個路由器,它的值就減1,當(dāng)此值為0則數(shù)據(jù)報被丟棄,同時發(fā)送ICMP報文通知源主機(jī)。RFC793中規(guī)定MSL為2分鐘,但這完全是從工程上來考慮,對于現(xiàn)在的網(wǎng)絡(luò),MSL=2分鐘可能太長了一些。因此TCP允許不同的實現(xiàn)可根據(jù)具體情況使用更小的MSL值。TTL與MSL是有關(guān)系的但不是簡單的相等關(guān)系,MSL要大于TTL。
下面我們來看一張TCP連接釋放的圖:
(此圖摘自謝希任計算機(jī)網(wǎng)絡(luò)第六版)
從上圖我們注意到,在TCP連接釋放的過程中,從TIME_WAIT狀態(tài)到CLOSED狀態(tài)有一個超時設(shè)置,這個超時設(shè)置是2MSL(RFC793定義MSL為2分鐘),那么為什么在TIME_WAIT后必須等待2MSL時間呢?主要原因有兩點(在我的上一篇博客中有講,我們再來說下吧):
1.為了保證客戶端(我們記為A端)發(fā)送的最后一個ACK報文段能夠到達(dá)服務(wù)器端。這個ACK報文段有可能丟失,因而使處在LASK—ACK端的服務(wù)器端(我們記為B端)收不到對已發(fā)送的FIN+ACK報文段。B會超時重傳這個FIN+ACK報文段,而A就能在2MSL時間內(nèi)收到這個重傳的FIN+ACK報文段。接著A重傳一次確認(rèn),重新啟動2MSL計時器。最后,A和B都正常進(jìn)入到CLOSED狀態(tài)。如果A在TIME_WAIT狀態(tài)不等待一段時間,而是在發(fā)送完ACK確認(rèn)后立即釋放連接,那么就無法收到B重傳的FIN+ACK報文段,因而也不會再發(fā)送一次確認(rèn)報文段,這樣,B就無法正常進(jìn)入CLOSED狀態(tài)。
2.我們都知道,假如A發(fā)送的第一個請求連接報文段丟失而未收到確認(rèn),A就會重傳一次連接請求,后來B收到了確認(rèn),建立了連接。數(shù)據(jù)傳輸完畢后,就釋放了連接。A共發(fā)送了兩個連接請求報文段,其中第一個丟失,第二個到達(dá)了B。假如現(xiàn)在A發(fā)送的第一個連接請求報文段沒有丟失,而是在某些網(wǎng)絡(luò)節(jié)點長時間都留了,以至于延誤到連接釋放后的某個時間才到達(dá)B,這本來是已失效的報文段,但B并不知道,就會又建立一次連接。而等待的這2MSL就是為了解決這個問題的,A在發(fā)送完最后一個確認(rèn)報后,在經(jīng)過時間2MSL,就可以使本鏈接持續(xù)時間內(nèi)所產(chǎn)生的所有報文段都從網(wǎng)絡(luò)中消失,這樣就可以使下一個新的連接中不會出現(xiàn)這種舊的連接請求報文段。
我們回到MSL,在2MSL時間內(nèi),該地址上的連接(客戶端地址,端口和服務(wù)器的端口地址)不能被使用,比如我們在建立一個連接后關(guān)閉連接然后迅速重啟連接,那么就會出現(xiàn)端口不可用的情況。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。