TCP/IP 雖承諾可靠、有序傳輸,但在高延遲、丟包的惡劣網絡環境下(如跨國機房、併發下載),單次發送緩衝區過大 往往導致數據損壞、文件校驗失敗。本文記錄一次真實的文件傳輸故障排查,揭示 Socket.SendBufferSize 對傳輸穩定性的關鍵影響。
SendBufferSize/ReceiveBufferSize 初始 64KB。| Server SendBuffer | Client ReceiveBuffer | Server A (LAN) | Server B (跨國) | Server B + 迅雷併發 |
|---|---|---|---|---|
| 8 KB | 8 KB | ✅ 正確 | ❌ 大文件錯誤 | ❌ 大文件錯誤 |
| 4 KB | 8 KB | ✅ 正確 | ⚠️ 大文件較多錯誤 | ❌ 大部分錯誤 |
| 2 KB | 8 KB | ✅ 正確 | ✅ 無錯誤 | ⚠️ 個別錯誤 |
| 1 KB | 8 KB | ✅ 正確 | ✅ 全部正確 | ✅ 全部正確 |
結論:在高延遲、不穩定網絡下,將發送緩衝區限制在 1~2 KB 可顯著提升傳輸可靠性。上傳測試結果一致。
Send 觸發更大的 TCP 段。網絡抖動導致丟包時,重傳單位變大,重傳超時 (RTO) 退避更劇烈,擁塞窗口 (cwnd) 震盪加劇。// 動態調整策略:根據 RTT、丟包率自適應
int CalcOptimalSendBuffer(long rttMs, double lossRate) {
if (rttMs > 200 || lossRate > 0.01) return 1024; // 1 KB
if (rttMs > 100 || lossRate > 0.005) return 2048; // 2 KB
return 8192; // 8 KB (LAN/優質線路)
}
// 設置
socket.SendBufferSize = CalcOptimalSendBuffer(currentRtt, currentLossRate);
socket.NoDelay = true 禁用 Nagle 算法,減小交互延遲。WouldBlock、TimedOut 觸發應用層重試。「TCP 保證可靠」是指字節流可靠,非單次 Send 語義可靠。在弱網環境下,主動限制發送緩衝區、配合應用層校驗與重傳,才是構建健壯傳輸系統的正確姿勢。