Windows
如何防止 TCP ZeroWindow 將大文件寫入 Windows 共享?
我已獲得訪問 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)。您的傳輸是否會突然飆升和傳輸率下降?