如何防止 TCP ZeroWindow 将大文件写入 Windows 共享?

Mar*_*ica 6 networking windows server-message-block tcp tcp-window

我已获得访问 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%
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

因此,在 70 秒后,客户端(此处:Robocopy)调用它退出。

我的问题:这是 Windows 共享的已知问题吗?可以在文件服务器上调查/调试/跟踪什么?是否有我们需要查看或试验的特定设置?

提前致谢!

小智 3

我同意@suprjami,并愿意提供这种可能的探索途径:不是服务器的磁盘太慢而是考虑它们可能出现故障(典型的硬盘驱动器在每次错误的集群读取时冻结约 8 秒),严重碎片化,空间不足(导致严重的碎片和严重的磁盘抖动),或者您的计算机上可能有严重的 CPU 密集型或磁盘密集型任务,导致其他一切(包括网络和磁盘子系统)都处于饥饿状态。我建议检查服务器的事件查看器是否有磁盘错误,并拉出任务管理器或进程资源管理器的一些列来显示页面错误、CPU 使用情况以及 I/O 读取字节和写入字节,并查看数字的作用。

考虑到 ZeroWindow 是 TCP 接收缓冲区已满的症状,我敢打赌问题要么是消耗了服务器上 100% 的 CPU,要么是导致服务器的网络流量严重过多并锁定了所有内容。

另一种可能性是中间设备的 TCP 实现中的缓冲区膨胀,如果该设备正在修改它以任何方式(即 NAT)中继的数据包。您的传输是否会偶然出现传输率上升或下降的情况?