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

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

一些理論

我一直在讀一些關於 tcp 的書TIME-WAIT這裡那裡)我讀到的是,它是一個設定為2 x MSL(最大段壽命)的值,它將在「連接表」中保留連接一段時間以保證,“在允許與同一元組創建連接之前,屬於該元組先前化身的所有資料包都將失效”

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

問題 1:是否是因為處理舊連接中的段所涉及的處理較少,並且在同一元組上創建新連接的處理較少TIME-WAIT(即是否有性能優勢)?

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

Q2:這個分析正確嗎?
Q3:使用TIME-WAIT還有其他好處嗎?

一些練習

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

正如您所看到的, 中的連接數TIME-WAIT比中的連接數更多ESTABLISHED,大多數時候大約是 的兩倍,有時是四倍。

Q4:這對效能有影響嗎?
Q5:如果是這樣,降低該TIME-WAIT值是否明智/建議(以及如何做)?
TIME-WAITQ6:這個/連線數的比例ESTABLISHED正常嗎?這是否與惡意連線嘗試有關?

答案1

簡而言之,不用擔心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_WAITESTABLISHED沒有相關性,除了你擁有的短暫聯繫越多,這個比率就越大。它可能是由惡意行為引起的,但它並不比「過度的網路活動」更能說明問題。

答案2

根據我有限的 TIME_WAIT 經驗得出的一些答案:

1/2/3) 看這個那麼問題這一頁TIME_WAIT 的詳細解釋。確保連線中的所有 TCP 封包都能正確接收,這與其說是效能問題,不如說是服務品質問題。

4/5) 與 TIME_WAIT 相關的一個效能問題是,在一台非常繁忙的伺服器上,如果處於 TIME_WAIT 狀態的連線太多,您最終可能會耗盡可用連線。如果您遇到此問題,您可以嘗試減少 TIME_WAIT 值,但這可能屬於「我知道我在做什麼」調整類別。看這個問題了解更多詳細資訊。

6) TIME_WAIT 的預設值「應該」約為 240 秒(或 120 秒的封包 MSL 的兩倍)。因此,已建立/等待連線的比率將取決於您的傳入連線速率以及它們保持開啟的時間。例如,我檢查了幾台繁忙的伺服器,比率範圍從 1.3 到 400,根據伺服器及其接收的流量,我認為所有這些都是正常的。

相關內容