如何防止 TCP ZeroWindow 将大文件写入 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 共享的已知问题吗?在文件服务器上可以调查/调试/跟踪什么?我们需要查看或试验哪些特定设置?

提前致谢!

答案1

我同意@suprjami的观点,并愿意提供这种可能的探索途径:而不是服务器的磁盘被太慢了,请考虑它们可能出现故障(通常硬盘驱动器每读取一次坏簇就会冻结约 8 秒)、严重碎片化、空间不足(导致严重碎片化和严重的磁盘抖动),或者您的计算机上可能存在严重 CPU 限制或磁盘限制的任务,导致其他所有任务(包括网络和磁盘子系统)都处于空闲状态。我建议检查服务器的事件查看器中是否存在磁盘错误,并调出任务管理器或进程资源管理器,其中有一些列显示页面错误、CPU 使用率以及 I/O 读取字节数和写入字节数,并查看这些数字的作用。

鉴于 ZeroWindow 是 TCP 接收缓冲区已满的症状,我愿意相信问题在于要么是服务器上的某些东西消耗了 100% 的 CPU,要么是某些东西导致过多的网络流量进入服务器并锁定了所有内容。

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

答案2

在查看 TCP 调整参数之前(您可以在 Windows 上调整 TCP 堆栈,但 99.9% 的时间里,它的自动缩放功能运行良好),您能否提供更多背景信息?例如:接收服务器的规格是什么,客户端和服务器是否都在同一个第 2 层网络上,NIC 的运行速度是多少,等等。

此外,是否值得尝试 ROBOCOPY 的 /IPG 参数,或许还有 /R: 和 /W: (重试并等待)参数?

答案3

TCP 零窗口意味着接收主机不堪重负。它告诉发送主机停止发送数据,因为它需要一些时间来处理已经收到的数据。

这听起来就像是服务器中的磁盘太慢,客户端最终放弃并导致连接超时。

在离开客户端时减慢传输速度,或者在服务器中放置更快的磁盘。

相关内容