我在研究计算机网络中的错误检测,我了解了以下方法-
- 单位奇偶校验
- 2d奇偶校验
- 校验和
- 循环冗余检查
但我只研究了一点(lmao-pun(,就遇到了它们失败的案例。
当-时,方法失败
-
单位奇偶校验-如果偶数位被反转。
-
2d奇偶校验-如果偶数位在同一位置反转。
-
校验和-将0添加到一个帧不会改变结果,并且不维护序列。(例如,在数据10101010 11110000 11001100 10111001中,如果我们将0添加到此处为四帧(
-
CRC-g(x(=(x+l(*p(x(的n位CRC可以检测:长度小于或等于n的所有突发错误。
All burst errors affecting an odd number of bits. All burst errors of length equal to n + 1 with probability (2^(n-1) − l)/2^n − 1 All burst errors of length greater than n + 1 with probability (2^(n-1) − l)/2^n [the CRC-32 polynomial will detect all burst errors of length greater than 33 with probability (2^32 − l)/2^32; This is equivalent to a 99.99999998% accuracy rate]
从此处复制-https://stackoverflow.com/a/65718709/16778741
正如我们所看到的,这些方法之所以失败,是因为一些非常明显的缺点。
所以我的问题是——为什么这些仍然被允许而没有得到纠正,这些天我们用什么?
就像那些制造它们的人忘记交叉检查一样
这是努力和风险之间的权衡。添加的冗余位越多,未检测到错误的风险就越小。
额外的位意味着额外的内存或网络带宽消耗。这取决于应用程序,哪些额外的努力是合理的。复杂的校验和也增加了一些计算开销。
现代校验和或散列函数可以将剩余风险降低到绝大多数应用程序可以容忍的非常小的范围。
只有0.00000000002%的突发错误会被遗漏。但没有说明的是这些突发错误发生的可能性。这个数字取决于网络的实现。在大多数情况下,对于理想网络,不可检测的突发错误的可能性将非常接近零或零。
几乎为零和几乎为零的乘积非常接近于零。
CRC中未检测到的错误更多的是学术上的兴趣,而不是实际情况。