Windows Server 2003 Service Pack 2 引入的「可擴展網路封包」(Scalable Networking Pack, SNP)雖大幅提升網路處理效能,但其核心元件「接收端調節」(Receive-Side Scaling, RSS)與 NAT 功能存在嚴重相容性衝突,導致啟用 NAT 的伺服器頻繁發生 TCP 連線重置。本文深入剖析技術根因,提供登錄檔緩解方案與長期規劃建議。
| 技術元件 | 功能描述 | 與 NAT 衝突機制 |
|---|---|---|
| TCP Chimney Offload | 將 TCP 封包處理卸載至網卡硬體,降低 CPU 負載 | 間接影響:卸載邏輯可能與 NAT 狀態表同步不一致 |
| Receive-Side Scaling (RSS) | 多核心並行處理接收封包,依 TCP 雜湊值分派 CPU | 核心衝突點:RSS 於網卡硬體計算 TCP Hash,NAT 修改 IP/埠後導致 Hash 不匹配,觸發 TCP RST |
| NetDMA | 硬體 DMA 直接搬移記憶體,減少 CPU 複製開銷 | 低風險:主要涉及記憶體搬運,不改變封包標頭 |
RSS 透過 Toeplitz 雜湊演算法,依據 來源 IP、目的地 IP、來源埠、目的地埠 四元組計算雜湊值,決定由哪個 CPU 核心處理該連線。當封包經過 NAT 裝置(或啟用「路由與遠端存取」NAT 功能的伺服器)時,封包的 IP 標頭與埠號會被轉換(SNAT/DNAT)。
衝突鏈路:
此現象在高併發、長連線(如資料庫同步、VPN 隧道、VoIP 訊令)場景下尤為明顯。
經微軟確認(KB 948496),暫時停用 RSS 可立即解決 NAT 失效問題,且不影響 TCP Chimney Offload 與 NetDMA 效能增益。
regedit,定位至:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ParametersEnableRSS0(十六進位)Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"EnableRSS"=dword:00000000
重啟後,於命令提示字元執行 netsh int tcp show global,確認 Receive-Side Scaling State 顯示 disabled。同步監控 NAT 服務日誌,確認 TCP RST 事件消失。
總結: SNP 引入的 RSS 機制與 NAT 的封包改寫本質衝突,是經典的「效能優化破壞語意正確性」案例。透過登錄檔停用 RSS 為最快止血手段,但根治之道在於套用官方修補程式或完成作業系統現代化升級。