傳輸層

TIME-WAIT 狀態

掛掉電話後,你重撥同一個號碼前可能會停頓一下——以防最後一句話還在線上回響,或你的道別沒被完全收到。TCP 在連線的最末端做類似的事。先關閉的那一端不會立刻把一切忘光;它會進入一個叫 TIME-WAIT 的等待狀態,停留一段短而明確的時間,才真正釋放連線。

具體來說,主動關閉者在終止過程送出它最後那個 ACK 後,進入 TIME-WAIT,等待兩倍的最大區段存活時間(封包在網路中能存活的最長時間的兩倍,總共常是幾秒鐘)。它這麼做有兩個理由。第一,若它最後那個 ACK 遺失了,對端會重送它的 FIN;停留在這裡能讓關閉者重新確認它,而不是回一個令人困惑的 RST。第二,等待確保屬於這條連線的任何舊的、延遲的區段都從網路中排空死去,這樣它們才不會被誤認為「未來某條剛好重用相同四元組(相同 IP 與埠)的連線」的資料。

為什麼重要:TIME-WAIT 是刻意、正確的安全餘裕——它不是臭蟲,儘管它常引起困惑。一台高負載的伺服器(更常見的是繁忙的用戶端)若大量開關短連線,可能累積許多卡在 TIME-WAIT 的通訊端,暫時佔住本地連接埠號。這就是為什麼系統提供調校旋鈕,以及為什麼長壽的持久連線(一條連線重用於多個請求)比快速汰換新連線更受偏好。

關閉後,用戶端對伺服器的連線會以 TIME-WAIT 的狀態出現幾秒鐘。如果伺服器的 FIN 因為用戶端最後那個 ACK 遺失而被重送,用戶端仍在原地能乾淨地確認它——而那個四元組在等待結束前不會被重用。

短暫的 2MSL 等待:接住落單的 FIN,讓舊區段消亡。

大量通訊端處於 TIME-WAIT 通常表示短命連線很多,而不是洩漏。這是設計使然。激進地把它關掉,可能重新引入它本來要防的那種臭蟲(誤認的舊封包)。

又称
2MSL waitTIME-WAITTIME_WAIT 狀態