tcp TIME-WAIT 的真正好處和對生產環境的影響
一些理論
我一直在閱讀 tcp
TIME-WAIT
(這里和那裡),我讀到的是它是一個設置為2 x MSL
(最大段壽命)的值,它在“連接表”中保持連接一段時間,以保證,“在你之前如果允許使用相同的元組創建連接,則屬於該元組先前化身的所有數據包都將死亡”。
TIME-WAIT
由於在連接存在或不再存在時收到的段(除了特定情況下的 SYN)將被丟棄,為什麼不立即關閉連接呢?Q1:是不是因為處理來自舊連接的段所涉及的處理較少,而在同一元組上創建新連接的處理較少
TIME-WAIT
(即有性能優勢)?如果上述解釋不成立,我認為
TIME-WAIT
有用的唯一原因是,如果客戶端SYN
在為同一元組上的舊連接發送剩餘段之前發送一個連接,在這種情況下,接收器將重新打開連接,但隨後得到壞段,並且必須終止它。Q2:這個分析正確嗎?
Q3:使用TIME-WAIT還有其他好處嗎?
一些實踐
我一直在查看我管理的生產伺服器上的 munin 圖。這是一個:
正如您所看到的,比 中的連接更多
TIME-WAIT
,ESTABLISHED
大多數時候大約是兩倍,在某些情況下是四倍。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
不相關,除了你擁有的短暫連接越多,這個比例就會越大。這可能是由惡意行為引起的,但它與“過度的網路活動”一樣不是一個指標。