TCP time wait為什麼持續2MSL

2022-04-10 09:20:12 字數 759 閱讀 3109

timewait先發起close的一端的第二階段:

a fin b,b ack a,b fin a 此時a收到b的fin之後,a處於time_wait,a無法確定自己接下來的ack of fin是否被b收到,所以time_wait還是會持續一段時間。接著可能發生兩件事情:

第一種,那麼a可以確定第一次的ack沒有及時到達b,繼續傳送ack,直到發生第二種。此時a可以關閉連線,因為在第乙個msl內,a收到的最後一次fin包傳送之前的資料報都已經從網路消失,因為這些資料報到此時已經超過了msl;又繼續等待第二個msl,確保a傳送的ack消失之前重發的fin都沒有到達a,而且在ack消失的同時對方重發的fin也已經消失——那麼說明網路狀態要麼足夠差,重發這麼多fin都沒有被a收到,要麼a的ack已經被b接收。

理解為什麼是2msl的原因:假設網路狀態極好,fin的ack立即被對方b接收到,對方立即close,那麼此時a應該等待1msl,因為只有等待這麼久才能確保對方close之前的包都已經在網路中超時消失。但是如果ack有延遲t才到達b,那麼a應該等待t+msl;ack實際上最大的延遲是msl,所以time_wai應該等待2msl再變成close。

保持2msl並不是為了解決所有問題,只是為了防止乙個問題,那就是防止對方真的close後,還有包在網路中傳遞,並不是為了確保對方連重傳的fin包都消失,實際上應該假設對方重傳的fin包一定會被a收到。

再看b的close,應用層在socketclose之後,可能已經程序退出了,只不過核心還有socket的狀態在維護,當然程序可能沒有退出。

為什麼為什麼為什麼為什麼為什麼你要做一名程式設計師?

from 本文是從 why why why why why are you a developer?這篇文章翻譯而來。做乙個程式設計師很忙,你需要去寫 去建立meme,去進行測試,以及隨時關注最新最熱的gem 開源軟體技術。最近,我一直在想讓自己的節奏慢下來,去做一些心裡一直想做但沒有去做的事,去思...

MySQL相關 (想到什麼寫什麼,持更 )

普通索引和唯一索引 innodb建立索引時,只可以建立b tree索引,是不可以建立hash索引的,而hash索引相對於b tree索引,雖然無法實現排序,範圍檢索的效果,但是在等值檢索時比b tree索引的效率高很多。所以innodb在b tree索引的基礎上又新增了自適應hash索引,只不過這個...

03 為什麼封裝,為什麼有this?

為什麼封裝?嬰兒太多了,所以我們會考慮將每個出生的嬰兒的 文件 我們都會放於乙個盒子裡 這樣方便以後我們查詢他的身份證資訊。於是在這個盒子上,我們打了乙個孔,叫set 方法,如果是身份證,我們就取名 setcode 方法,這樣就將乙個人的身份證資訊建立 set了。但放進去後,我們有時候還需要檢驗這個...