Networking

tcp TIME-WAIT 的真正好處和對生產環境的影響

  • November 30, 2011

一些理論

我一直在閱讀 tcp TIME-WAIT這里那裡),我讀到的是它是一個設置為2 x MSL(最大段壽命)的值,它在“連接表”中保持連接一段時間,以保證,“在你之前如果允許使用相同的元組創建連接,則屬於該元組先前化身的所有數據包都將死亡”

TIME-WAIT由於在連接存在或不再存在時收到的段(除了特定情況下的 SYN)將被丟棄,為什麼不立即關閉連接呢?

Q1:是不是因為處理來自舊連接的段所涉及的處理較少,而在同一元組上創建新連接的處理較少TIME-WAIT(即有性能優勢)?

如果上述解釋不成立,我認為TIME-WAIT有用的唯一原因是,如果客戶端SYN在為同一元組上的舊連接發送剩餘段之前發送一個連接,在這種情況下,接收器將重新打開連接,但隨後得到壞段,並且必須終止它。

Q2:這個分析正確嗎?

Q3:使用TIME-WAIT還有其他好處嗎?

一些實踐

我一直在查看我管理的生產伺服器上的 munin 圖。這是一個: 在此處輸入圖像描述

正如您所看到的,比 中的連接更多TIME-WAITESTABLISHED大多數時候大約是兩倍,在某些情況下是四倍。

Q4:這對性能有影響嗎?

Q5:如果是這樣,是否明智/建議減少TIME-WAIT價值(以及如何)?

Q6:這個比例TIME-WAIT/ESTABLISHED連接數正常嗎?這可能與惡意連接嘗試有關嗎?

總之,不用擔心TIME_WAIT。成本幾乎為零,通常不會造成任何問題。

在繁忙的伺服器上,埠耗盡是可能的,在這種情況下,有 sysctl 選項net.ipv4.tcp_tw_reuse = 1,它允許核心根據需要重用仍然存在的舊埠TIME_WAIT

TIME_WAIT 是 TCP 規範的一部分,用於擷取可能仍在傳輸中的數據包(請記住,並非所有連接都是可靠的,這正是 TCP 旨在解決的問題)。對於大多數現代用途,超時值可能非常高,但它通常不會干擾除了 netstat 的輸出之外的任何內容。

如果您自己控制套接字,並且確定您沒有等待數據(例如,您是最終發送者,或者您不關心響應),您可以在設置SO_NOLINGER選項後關閉套接字,這將使用 終止連接RST,並立即丟棄套接字。

所以你的問題:

Q1、Q2、Q3:它用於收集遲到的數據包,“以防萬一”,因為連結可能不可靠。它是規範的一部分,它可以防止封包遺失,並且調整它並沒有真正的好處。

Q4:沒有

Q5:不用擔心,如果需要,您可以選擇強制重用這些套接字。

Q5:TIME_WAIT並且ESTABLISHED不相關,除了你擁有的短暫連接越多,這個比例就會越大。這可能是由惡意行為引起的,但它與“過度的網路活動”一樣不是一個指標。

引用自:https://serverfault.com/questions/334410