現象:Windows Server 2003 伺服器運行一段時間後,IE 無法開網頁、FTP 指令 `BIND` 失敗、Serv-U 啟動報「資源不足」。事件日誌無明顯錯誤,但網路連線極其不穩定。
根因分析:臨時連接埠耗盡
- Windows TCP/IP 協議棧為外連連線動態分配**臨時連接埠 (Ephemeral Ports)**,預設範圍 **1024-5000** (共 3977 個)
- 高併發/長連接/連線洩漏 (應用未正確 `close()`/`Disconnect()`) 導致大量連線處於 `TIME_WAIT` (預設 240 秒) / `FIN_WAIT_2` 狀態
- 臨時埠池耗盡,新連線無可用來源埠 → `WSAENOBUFS (10055)`「缺乏緩衝區空間或佇列已滿」
- 經典場景:Web 伺服器/代理/資料庫連線池/防毒掃描/備份代理 大量外連
註冊表修復:擴展臨時連接埠範圍至最大值
路徑: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
值名: MaxUserPort
類型: REG_DWORD
值: 65534 (十進制) / 0xFFFE (十六進制)
有效範圍: 5000 - 65534
預設: 5000 (0x1388)
操作步驟
- 執行 `regedit` 開啟註冊表編輯器
- 定位至上述路徑
- 右鍵空白處 → 新增 → DWORD (32 位元) 值 → 命名 `MaxUserPort`
- 雙擊修改數值資料:`65534` (選擇十進制)
- 確定、關閉註冊表編輯器
- 重新開機生效
協同優化參數 (同一註冊表路徑)
| 參數 | 建議值 | 說明 |
| TcpTimedWaitDelay | 30 (十進制, 秒) | 縮短 TIME_WAIT 等待時間 (預設 240 秒),加速埠釋放。注意: 過低可能導致舊封包干擾新連線,建議 30-60 秒 |
| MaxFreeTcbs / MaxHashTableSize | 視記憶體調大 | 增加 TCP 控制區塊 (TCB) 快取上限,支援更多並發連線 |
| SynAttackProtect | 2 | 啟用 SYN 洪水攻擊保護 (預設 1/2,視版本) |
應用層根治 (比註冊表更根本)
- 連線池配置: 資料庫/HTTP/Redis/MQ 連線池設定 `maxIdle`/`maxActive`/`maxWait`、`evictionRunInterval`/`minEvictableIdleTimeMillis`,嚴格回收閒置連線
- 啟用 Keep-Alive / 連線重用: HTTP 1.1 Keep-Alive、資料庫持久連線、減少頻繁建立/銷毀連線開銷
- 修正連線洩漏: 程式碼審查 `try-with-resources` / `using` / `finally { close() }` 確保 100% 回收
- 監控指標: `netstat -an | find /c "TIME_WAIT"`、`perfmon` → `TCPv4` → `Connections Established/Reset/Active/Passive`、應用層連線池指標
- 負載均衡器/防火牆超時: 確認中間設備空閒超時 ≥ 應用層 Keep-Alive 間隔,避免中間斷開導致半開連線堆積
驗證修復
# 重開機後
netstat -an | find /c "TIME_WAIT" # 應大幅下降
# 壓測驗證
ab -n 10000 -c 500 https://server/ # 應無 10055 錯誤
結語
`MaxUserPort=65534` 是**緩兵之計**,賴以爭取時間進行**應用層連線池優化、洩漏修復、Keep-Alive 啟用**。單純擴大埠範圍若不解決根因,最終仍會在更高併發下耗盡 65535 個埠 (理論上限)。註冊表調優 + 應用層根治 + 持續監控,才是徹底之道。