Networking TCP校验和能否检测到错误?如果是,如何处理?

Networking TCP校验和能否检测到错误?如果是,如何处理?,networking,tcp,checksum,Networking,Tcp,Checksum,如果TCP有效负载在传输过程中损坏,则重新计算的校验和将与传输的校验和不匹配。很好,到目前为止一切都很好 如果TCP校验和在传输过程中损坏,则重新计算的校验和将与现在损坏的校验和不匹配。很好,到目前为止一切都很好 当有效负载和校验和都损坏,并且重新计算的校验和(虽然与应该的不同)恰好与现在损坏的校验和匹配时,会发生什么情况 我可以看出,使用一个好的校验和算法(以及较低级别的附加校验和),这可能非常、非常不可能,但TCP不是意味着100%可靠吗?它如何解决这些误报 以及较低级别的附加校验和 其中一

如果TCP有效负载在传输过程中损坏,则重新计算的校验和将与传输的校验和不匹配。很好,到目前为止一切都很好

如果TCP校验和在传输过程中损坏,则重新计算的校验和将与现在损坏的校验和不匹配。很好,到目前为止一切都很好

当有效负载和校验和都损坏,并且重新计算的校验和(虽然与应该的不同)恰好与现在损坏的校验和匹配时,会发生什么情况

我可以看出,使用一个好的校验和算法(以及较低级别的附加校验和),这可能非常、非常不可能,但TCP不是意味着100%可靠吗?它如何解决这些误报

以及较低级别的附加校验和

其中一些比校验和更严格,例如以太网使用a而不是校验和

这可能是非常非常不可能的,但TCP不是意味着100%可靠吗?它如何解决这些误报

我不认为可以。即使它通过硬拷贝和信鸽发送副本,宇宙射线或量子效应理论上也可能以完全相同的方式破坏副本。这是非常非常不可能的


您还可以在应用层(TCP之上)实现任意强完整性检查,例如使用加密签名。

我可以想象这种可能性是十亿分之一,因为如果TCP数据被破坏,这就是传输层,它也将意味着其他层(数据链路和网络)也会被腐蚀。我相信至少数据链路层有一个完整性校验和,所以必须让两个校验和都失败

以至少两个单独的校验和失败的方式进行腐蚀,在天文上是不可能的,甚至是不可能的

TCP校验和会产生误报吗

对。校验和比数据包小得多,因此许多不同的数据包可以匹配给定的校验和

如果是,如何处理


在TCP中,一点也不。但是,在更高的层次上,大多数数据损坏都是显而易见的,例如,您的XML不再是格式良好的;你的电子邮件不再是英文的,等等。

不,它不可能100%可靠:在1600万到100亿个数据包中,有1个未被差错控制系统捕获。我将让您计算每天/每周的发生率:)

假设

数据包有效负载:1000字节

数据包校验和:2字节

具有双重错误的数据包的概率,校验和中的一个(假设p非常小,小于1/10^5):

精确校验和的概率:

B = 1/2^16 = 6/10^4
假阳性概率:

A * B = 40 * P^2 
概率很低(p=1/10^6,然后是假阳性概率A*B=4/10^11),但在任何情况下,任何crc算法都不能为零。一个随机1000字节数据包作为另一个随机1000字节数据包出现的概率为P^8000,就好像所有字节都包含错误一样


如果p较高,例如从1/10^3到1,则上述计算不适用。在这种情况下,A=1(所有数据包都包含双重错误),误报概率仅为A*B=6/10^4。这不是一个非常相关的情况,因为超过99%的接收数据包将包含crc中的错误。

这里应该注意的是,大多数人完全忽略了一个事实,即TCP校验和实际上是一个非常差的校验和

TCP校验和是数据的16位1补码和。这笔钱 将捕获任何15位或更少的突发错误,以及所有16位突发错误 除了那些用零代替1的补码的错误 另一个(即,16个相邻1位替换为16个零位,或 反之亦然)。在均匀分布的数据上,预期会检测到 其他类型的错误,比率为1/2^16。这个 校验和还有一个主要限制:一组16位的和 无论值的顺序如何,值都是相同的 出现

资料来源:

因此,如果您在数据包的数据部分任意位置随机翻转任意数字位,则即使您根本不接触校验和,也有可能1到65536未检测到此错误,因为新数据尽管完全损坏,但实际上与旧数据具有相同的校验和。如果只交换数据部分中的两个16位值,而不管是哪一个,也不管交换的频率有多高,甚至有100%的可能性没有检测到该错误,因为16位值在数据包的数据部分中出现的顺序与计算出的校验和的值完全无关

我想说的是,您不必太担心数据和校验和都被损坏的情况,并且由于损坏的校验和与损坏的数据相匹配,因此无法检测到此错误,事实是,每天互联网上数以百万计的TCP数据包中只有损坏的数据,并且由于未损坏的校验和仍然与损坏的数据匹配,因此未检测到该错误


如果您需要传输数据,并且希望确保数据没有损坏,那么仅TCP校验和显然不足以完成此任务。我甚至敢说,CRC校验和不足以完成这项任务,因为CRC32可能无法检测到一行中超过32位受到影响的错误(这些错误可以相互“抵消”)。确保无缺陷数据传输所需的最小校验和是数据的MD5值。当然,任何比这更好的东西(SHA-1、SHA-256、SHA-384、SHA-512、惠而浦等)都会工作得更好,但MD5就足够了。MD5对于加密安全可能不再足够安全(因为它在过去被多次破坏),但作为数据校验和,MD5仍然是绝对足够的。

不是所有的数据链路层都有完整性检查,是吗?不,它们没有。我在上面链接的那篇文章提到了在某些情况下应用程序级检查的使用,例如,较低级别的crc
A * B = 40 * P^2