在Windows上的c#应用程序中,我计算机器的更正并将它们放在纯文本文件中。计算完这些更正后,我使用一个简单的File.Copy
网络将它们发送到机器上(在Windows上)。
如果文件在机器读取时损坏,可能会发生一些非常糟糕的事情。
根据这个上下文,我应该验证传输的文件(使用校验和或其他东西)?或者协议(它是TCP吗?)已经做到了吗?
答案 0 :(得分:2)
如果您的应用程序对文件损坏敏感,那么您应该验证....使用散列算法验证文件..
有关如何创建哈希和验证的示例代码
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;
}
答案 1 :(得分:2)
数据在您概述的工作流程中传递了许多步骤(磁盘,RAM,TCP)。所有这些地方都可能发生腐败,并且没有一个内置强校验和.CPT校验和很弱。 ECC RAM不提供绝对的安全性。
腐败将非常罕见,但迟早会发生。如果这对您来说非常重要,您可能需要构建端到端的校验和。
答案 2 :(得分:2)
原始回答
TCP is reliable and has error correction,因此您通过TCP传输的内容将是您在另一端收到的内容(包括您在文件旁边传输的校验和)。可能更好的是弄清楚为什么坏文件会使程序崩溃,并弄清楚如何检查格式以避免这种情况。
修改后的答案
TCP确实有纠错,但它被认为是弱的(它是每个数据包的16位校验和,以及每个段的另一个16位校验和。)Another answer suggests超过随机数据,如果某个位被翻转,那么TCP校验和将错误地匹配2 ^ 16个案例中的1个中的数据。 Fortunately, the actual data rate is probably lower因为除了TCP校验和之外,您的以太网和Wifi还会计算CRC错误校验码。该链接中的Stone / Partridge(第4.4节)估计了几个不同网络环境中未检测到的错误率范围,它们的范围从大约1 x 10 -10 到大约6.13 x 10 -8 。选择其中一个在局域网上的高估计值,大约8.8 x 10 -9 ,并使用Wireshark's sample capture of an SMB session估算每写入4000字节大约3个TCP数据包,并假设大约4千兆字节在请求中写入,我们可以将其建模为二项分布(然后用正态分布近似),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可能会有所帮助。