做网络文件拷贝,要不要校验数据
Doing network file copy, should I validate data
在 Windows 上的一个 c# 应用程序中,我正在为一台机器计算校正并将它们放入一个纯文本文件中。计算完这些修正后,我使用简单的 File.Copy
通过网络将它们发送到机器(也在 Windows 上)。
如果文件在机器读取时损坏,可能会发生一些非常糟糕的事情。
根据这个上下文,我应该验证传输的文件(使用校验和或其他方式)吗?还是协议(是 TCP?)已经做到了吗?
如果您的应用程序对文件损坏很敏感,那么是的,您应该验证....使用散列算法验证文件..
关于如何创建散列和验证的示例代码
string data = Flie.ReaddAllText();
SHA1 sha1 = SHA1.Create();
byte[] hashData = sha1.ComputeHash(Encoding.Default.GetBytes(data));
验证
// create the hash of transffered file and compare it with stored hash
if (string.Compare(InputDataHash, storedHashData) == 0)
{
return true;
}
else
{
return false;
}
数据在您概述的工作流中经过许多步骤(磁盘、RAM、TCP)。所有这些地方都可能发生损坏,其中 none 个内置了强大的校验和。TCP 校验和很弱。 ECC RAM不提供绝对安全。
腐败将非常罕见,但迟早会发生。如果这对您来说真的很重要,您可能需要构建端到端校验和。
原回答
TCP is reliable and has error correction,因此您通过 TCP 传输的内容将是您在另一端接收的内容(这包括您与文件一起传输的任何校验和)。可能更好的办法是找出错误文件导致程序崩溃的原因,并弄清楚如何检查格式以避免这种情况。
修改后的答案
TCP 确实具有纠错功能,但被认为较弱(它是每个数据包的 16 位校验和,加上每个段的另一个 16 位校验和。)Another answer suggests that over random data, if a bit gets flipped then the TCP checksum will incorrectly match the data in 1 out of 2^16 cases. Fortunately, the actual data rate is probably lower because in addition to TCP checksums, your Ethernet and Wifi also computes a CRC error check code. Stone/Partridge in that link (Section 4.4) estimate a range of undetected error rates in a couple of different network environments, and they range from about 1 x 10-10 to about 6.13 x 10-8. Choosing one of their high estimates over a local area network at about 8.8 x 10-9, and using Wireshark's sample capture of an SMB session to estimate about 3 TCP packets per 4000 bytes written, and assuming about 4 gigabytes are written in the request, we can model it as a binomial distribution (then approximated by a normal distribution), we can estimate about a 1 x 10-20 chance that there's at least one bad undetected packet in the transfer that could corrupt your input file。
...但是,如果您的网络嘈杂或不可靠,未检测到的错误率可能高出许多数量级,a value derived from a well distributed cryptographic checksum 可能是有益的。
在 Windows 上的一个 c# 应用程序中,我正在为一台机器计算校正并将它们放入一个纯文本文件中。计算完这些修正后,我使用简单的 File.Copy
通过网络将它们发送到机器(也在 Windows 上)。
如果文件在机器读取时损坏,可能会发生一些非常糟糕的事情。
根据这个上下文,我应该验证传输的文件(使用校验和或其他方式)吗?还是协议(是 TCP?)已经做到了吗?
如果您的应用程序对文件损坏很敏感,那么是的,您应该验证....使用散列算法验证文件..
关于如何创建散列和验证的示例代码
string data = Flie.ReaddAllText();
SHA1 sha1 = SHA1.Create();
byte[] hashData = sha1.ComputeHash(Encoding.Default.GetBytes(data));
验证
// create the hash of transffered file and compare it with stored hash
if (string.Compare(InputDataHash, storedHashData) == 0)
{
return true;
}
else
{
return false;
}
数据在您概述的工作流中经过许多步骤(磁盘、RAM、TCP)。所有这些地方都可能发生损坏,其中 none 个内置了强大的校验和。TCP 校验和很弱。 ECC RAM不提供绝对安全。
腐败将非常罕见,但迟早会发生。如果这对您来说真的很重要,您可能需要构建端到端校验和。
原回答
TCP is reliable and has error correction,因此您通过 TCP 传输的内容将是您在另一端接收的内容(这包括您与文件一起传输的任何校验和)。可能更好的办法是找出错误文件导致程序崩溃的原因,并弄清楚如何检查格式以避免这种情况。
修改后的答案
TCP 确实具有纠错功能,但被认为较弱(它是每个数据包的 16 位校验和,加上每个段的另一个 16 位校验和。)Another answer suggests that over random data, if a bit gets flipped then the TCP checksum will incorrectly match the data in 1 out of 2^16 cases. Fortunately, the actual data rate is probably lower because in addition to TCP checksums, your Ethernet and Wifi also computes a CRC error check code. Stone/Partridge in that link (Section 4.4) estimate a range of undetected error rates in a couple of different network environments, and they range from about 1 x 10-10 to about 6.13 x 10-8. Choosing one of their high estimates over a local area network at about 8.8 x 10-9, and using Wireshark's sample capture of an SMB session to estimate about 3 TCP packets per 4000 bytes written, and assuming about 4 gigabytes are written in the request, we can model it as a binomial distribution (then approximated by a normal distribution), we can estimate about a 1 x 10-20 chance that there's at least one bad undetected packet in the transfer that could corrupt your input file。
...但是,如果您的网络嘈杂或不可靠,未检测到的错误率可能高出许多数量级,a value derived from a well distributed cryptographic checksum 可能是有益的。