TIME_WAIT状态存在的意义
什么時候會TIME_WAIT
TCP在關閉的時候有個四次揮手的過程,主動關閉方在四次揮手的最后一個ACK發送之后會變成TIME_WAIT狀態。
主動關閉方
跟握手不同,揮手可以由客戶端發起,也可以是服務端發起。發起關閉的一端我們稱之為主動關閉方,另一端稱之為被動關閉方。
四次揮手
- 主動關閉方會發送一個FIN給被動關閉方,表示數據已經發送完畢。
- 被動關閉方接收到FIN,響應一個ACK。它的接收作為一個文件結束符(end-of-file)傳遞給接收端應用進程(放在所有已排隊等候該應用進程接收的任何其他數據之后)。FIN意味著接收端在相應連接上再無額外的數據可以接收了。
- 一段時間后,被動關閉方的應用進程收到了文件結束符,發送完所有需要發送的內容,也會發送一個FIN給主動關閉方。
- 接收到這個最終的FIN的主動關閉方也需要響應一個ACK。
TIME_WAIT狀態維持多久
主動關閉方響應完最后一次ACK之后,會在TIME_WAIT這個狀態維持2MSL。
MSL
MSL全稱是maximum segment lifetime,最長分節生命期。MSL是任何IP數據報能夠在因特網存活的最長時間。我們知道,這個時間是有限的,因為每個數據報都含有一個限跳(hop limit)的8位字段,它的最大值是255(簡單的講就是不同經過超過255個路由器)。盡管這個跳數限制而不是真正的時間限制,我們仍然假設最大限跳的分組在網絡中存在的時間不可能超過MSL秒。
MSL的具體值通常為30秒或者是2分鐘。
為什么需要TIME_WAIT
可靠地實現了TCP全雙工連接的終止
我們知道,TCP是比較可靠的。當TCP向另一端發送數據時,他要求對端返回一個確認(如同我們關閉時候的FIN和ACK)。如果沒有收到確認,則會重發。
回憶一下我們最終的那個FIN與ACK,被動關閉方發送FIN,并等待主動關閉方返回的ACK。我們假設最終的ACK丟失,被動關閉方將需要重新發送它的最終那個FIN,主動關閉方必須維護狀態信息(TIME_WAIT),以允許它重發最終的那個ACK。
如果沒有了這個狀態,當他第二次收到FIN時,會響應一個RST(也是一種類型的TCP分節),會被服務器解釋成一個錯誤。
為了TCP打算執行必要的工作以徹底終止某個連接兩個方向上的數據流(即全雙工關閉),那么他必須要正確處理連接終止四個分節中任何一個分節丟失的情況。
允許老的重復分節在網絡中的消逝(為什么需要2MSL)
首先,存在這樣的情況,某個路由器崩潰或者兩個路由器之間的某個鏈接斷開時,路由協議需要花費數秒到數分鐘的時間才能穩定找出另一條通路。在這段時間內,可能發生路由循環(路由器A把分組發送給B,B又發送回給A),這種情況我們稱之為迷途。假設迷途的分組是一個TCP分節,在迷途期間,發送端TCP超時并重傳該分組,重傳分組通過某路徑到達目的地,而后不久(最多MSL秒)路由循環修復,早先迷失在這個循環中的分組最終也被送到目的地。這種分組被稱之為重復分組或者漫游的重復分組,TCP必須要正確處理這些重復的分組。
我們假設ip1:port1和ip2:port2 之間有一個TCP連接。我們關閉了這個鏈接,過一段時間后在相同IP和端口之間建立了另一個連接。TCP必須防止來自之前那個連接的老的重復分組在新連接上出現。為了做到這一點,TCP將不復用處于TIME_WAIT狀態的連接。2MSL的時間足以讓某個方向上的分組存活MSL秒后被丟棄,另一個方向上的應答也最多存活MSL秒后被丟棄。
總結
以上是生活随笔為你收集整理的TIME_WAIT状态存在的意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipad分屏功能怎么开启_英雄联盟手游设
- 下一篇: 常见的数学建模比赛汇总(参考资料)