Windows

如何防止 TCP ZeroWindow 將大文件寫入 Windows 共享?

  • December 23, 2018

我已獲得訪問 Windows Server 2003 SP1 系統 (10.a.bbb.ccc) 上的共享的權限,該系統是一個文件和列印機伺服器,並且定期將大文件複製到該共享。但是,有時這樣的複制會失敗。使用 Robocopy(在 10.xxx.yy.zzz 上)重現此問題時,我得到類似

70.4%
2013/07/31 11:20:21 ERROR 64 (0x00000040) Copying File <<file name removed>>
The specified network name is no longer available.

Waiting 30 seconds... Retrying...
        New File          105.2 m   <<file name removed>>
 0.0%

dumpcap+ Wireshark 顯示,當這種情況發生時,在復製過程中,伺服器突然不再接受 TCP 埠 445 上的任何數據,方法是將視窗大小設置為零:

No.     Time           Source                Destination           Protocol Length Info
  7303 5.841186000    10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7304 6.149715000    10.xxx.yy.zzz         10.a.bbb.ccc          TCP      55     [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
  7305 6.150137000    10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7306 6.749711000    10.xxx.yy.zzz         10.a.bbb.ccc          TCP      55     [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
  7307 6.750087000    10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7308 7.946779000    10.xxx.yy.zzz         10.a.bbb.ccc          TCP      55     [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
  7309 7.947130000    10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7310 10.349783000   10.xxx.yy.zzz         10.a.bbb.ccc          TCP      55     [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
  7311 10.350201000   10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7312 15.149910000   10.xxx.yy.zzz         10.a.bbb.ccc          TCP      55     [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
  7313 15.150283000   10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7314 24.747096000   10.xxx.yy.zzz         10.a.bbb.ccc          TCP      55     [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
  7315 24.756210000   10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7316 43.958531000   10.xxx.yy.zzz         10.a.bbb.ccc          TCP      55     [TCP ZeroWindowProbe] [TCP segment of a reassembled PDU]
  7317 43.958863000   10.a.bbb.ccc          10.xxx.yy.zzz         TCP      60     [TCP ZeroWindowProbeAck] [TCP ZeroWindow] microsoft-ds > 57918 [ACK] Seq=10864 Ack=6973070 Win=0 Len=0
  7318 75.216401000   10.xxx.yy.zzz         10.a.bbb.ccc          TCP      54     57918 > microsoft-ds [RST, ACK] Seq=6973070 Ack=10864 Win=0 Len=0
  7319 75.225543000   10.xxx.yy.zzz         10.a.bbb.ccc          TCP      66     55972 > microsoft-ds [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
  7320 75.225933000   10.a.bbb.ccc          10.xxx.yy.zzz         TCP      66     microsoft-ds > 55972 [SYN, ACK] Seq=0 Ack=1 Win=16384 Len=0 MSS=1460 WS=1 SACK_PERM=1

因此,70 秒後客戶端(此處為 Robocopy)呼叫它退出。

**我的問題:**這是 Windows 共享的已知問題嗎?可以在文件伺服器上調查/調試/跟踪什麼?是否有我們需要查看或試驗的特定設置?

提前致謝!

我同意@suprjami 並希望提供這種可能的探索途徑:與其伺服器的磁碟太慢,不如考慮它們可能出現故障(典型的硬碟驅動器在每次錯誤集群讀取時凍結大約 8 秒)、嚴重碎片化、空間不足(導致嚴重的碎片和嚴重的磁碟抖動),或者您的機器上可能有嚴重的 CPU 密集型或磁碟密集型任務,而其他所有內容(包括網路和磁碟子系統)都處於飢餓狀態。我建議檢查伺服器的事件查看器是否有磁碟錯誤,並使用一些列打開任務管理器或程序資源管理器以顯示頁面錯誤、CPU 使用率和 I/O 讀取字節和寫入字節,並查看這些數字在做什麼。

鑑於 ZeroWindow 是 TCP 接收緩衝區已滿的症狀,我敢打賭,問題要麼是在伺服器上消耗了 100% 的 CPU,要麼是導致伺服器的網路流量過大並鎖定了所有內容。

另一種可能性是中間設備的 TCP 實現中的緩衝膨脹,如果該設備正在修改它以任何方式中繼的數據包(即 NAT)。您的傳輸是否會突然飆升和傳輸率下降?

引用自:https://serverfault.com/questions/527747