通过网络将大量数据(~1TB)从一个存储移动到另一个存储后,我注意到目标系统上的文件与原始文件不同。
设置:带有 Windows 共享的 PC(Windows 7 64)-> 1000BaseT 网络 2x 1G 交换机 -> PC(Windows XP)作为 Windows 共享客户端或带有 Windows 共享的 NAS(可能是 Samba?)-> 1000BaseT 网络 1x 1G 交换机 -> PC(Windows 7 64)作为 Windows 共享客户端
程序:使用 Total Commander 从共享中复制 - 未报告错误 -> 在 Total Commanded 中同步目录(按内容比较) - 一些文件不同 -> Total Commander 的差异(在同步目录输出中双击) - 一些标记为不同的文件确实显示差异,其中一些文件这次报告为相同。我尝试过 PC-PC 和 PC-NAS,两者都一样。
我检查了其中一个文件(约 60GB),发现差异似乎总是单个字节,原始值为 0,目标值为 128。它们随机分布在整个文件中,大约有 10 个。重新运行 diff 会显示其中一些仍然存在,而另一些发生了变化,但数量大致相同。
编辑:为了回答 syneticon-dj 对 TC 的怀疑,我必须指出,我编写了一个简单的 C# 应用程序,它使用 .NET API 读取两个文件并逐字节比较它们。这就是我在上一段中获得差异信息的方法。
似乎每 6 GB 左右的网络传输就会失败 1 位。这怎么可能?这是正常现象吗?它怎么会在 TCP 级别通过校验和?我如何知道哪里出了问题以及应该替换什么?
编辑:如果网络传输不太可能导致错误,那么真正的原因可能是什么?
答案1
我宁愿怀疑 TC 的“按内容比较”功能存在错误,并使用本地校验和生成对双方的文件进行双重检查,例如MD5 或 SHA-1 哈希并通过视觉来比较校验和。
一些理由
以太网帧每帧具有 32 位的 CRC 校验和。TCP 增加了 16 位 CRC 校验和。具有单比特错误的错误数据包通过两个校验和的可能性比单个 32 位 CRC 校验(2^-32)要小,但比两个概率的乘积(2^-16 * 2^-32 = 2^-48)要大。具体位置取决于算法的特性。
假设有效载荷大小为 1.400 字节(即如果您不使用巨型帧),并将其四舍五入为 2048 字节以便于计算,这大致意味着每 2^42 到 2^58 字节(5.4 TB 到 250 PB)就会出现一次错误如果传输的每个帧都带有单字节错误。
然而,如果不这样做,这一点肯定会引起注意 - 如此高的 CRC 校验失败率实际上会抑制您的以太网传输 - 您的文件复制传输速率会非常低。而且,您会在托管交换机的 RMON 端口计数器中看到大量 CRC 校验失败。
因此,考虑到错误的性质,它不太可能是传输错误 - 这些错误看起来也更加随机。
答案2
我怀疑这两台机器的内存有问题。请运行memtest86对它们两者。
答案3
IP 校验和是 16 位 CRC。大约每 65000 个损坏的数据包中就有 1 个会漏掉。如果您要传输大文件,最好使用专用的文件复制器,对较小的块使用加密校验和。例如,对 1 MB 块运行 MD5 和 SHA1,如果一个或两个校验和不同,则重新传输一个块。
建议的块大小(1 MB)更多的是直觉,而不是由可靠的工程决定的,如果大约每 6 GB 出现一次错误,这将导致总流量增加大约 0.1%。