何時關閉 TCP SACK?
我一直在查看 Linux 調整參數,並查看了一些關閉 SACK 的配置。誰能解釋一下?
這將針對繁忙的 Web 伺服器進行調整。
一個基本的 TCP ACK 說“我收到了直到 X 的所有字節”。選擇性 ACK 允許您說“我收到了字節 XY 和 VZ”。
因此,例如,如果主機向您發送了 10,000 個字節,而 3000-5000 字節在傳輸過程中失去,ACK 會說“我得到了 3000 以內的所有內容”。另一端必須再次發送字節 3001-10000。SACK 可以說“我得到了 1000-2999 和 5001-10000”,主機只會發送 3000-5000。
這在高頻寬、有損(或高延遲)鏈路上非常有用。問題是它可能在特定情況下導致嚴重的性能問題。正常的 TCP ACK 將使伺服器處理高頻寬、有損連接(發送 500 字節、等待、發送 500 字節、等待等)。SACK 讓它適應高延遲,因為它確切知道實際失去了多少數據包。
這是可能發生壞事的地方。攻擊者可以強迫您的伺服器長時間保持大量的重傳隊列,然後一遍又一遍地處理整個該死的事情。這可能會佔用 CPU、佔用 RAM 並消耗超出應有的頻寬。簡而言之,輕量級系統可以針對更強大的伺服器發起 DoS。
如果您的伺服器很健壯並且不提供大文件,那麼您可以很好地避免這種情況。
如果您主要為 Intranet 或其他低延遲使用者組提供服務,那麼 SACK 不會給您帶來任何好處,並且可以出於安全原因將其關閉而不會造成性能損失。
如果您使用的是低頻寬連結(例如 1Mbps 或更低,這是一個完全任意的經驗法則),SACK 可能會通過使您的連接飽和而導致正常操作出現問題,因此應將其關閉。
最終,這取決於你。考慮您服務的對象、服務對象、服務對象,並權衡您的風險程度與 SACK 的性能影響。
這裡對 SACK 及其漏洞有一個很好的概述。