1的补码校验和甚至误码

时间:2018-03-03 05:07:06

标签: networking udp checksum

我试图围绕1的补码校验和错误检测,就像在UDP中使用的那样。

我对简化示例的理解是对类似UDP的1的补码校验和错误检查算法在8位字上运行(我知道UDP使用16位字):

  1. 对所有8位数据字进行求和,将MSB翻转进行到LSB。
  2. 取此总和的1个补码,设置校验和,发送数据报
  3. 接收方在传入数据报中添加了进位翻转所有收到的8位字数据,并添加了校验和。
  4. 如果sum = 0xFF,则没有错误。否则,发生错误,丢弃数据包。
  5. 很明显,该算法可以检测1位错误,并且可以检测任何奇数位错误。如果8位数据字中只有一位被破坏,则sum +校验和将永远不会等于0xFF。一个简单的例子是A = 00000000,B = 00000001,然后〜(A + B)= 11111110.如果A(接收器)= 00000001,B(接收器)= 00000001,总和+校验和将是0x00!= 0xFF

    我的问题是:

    如果这可以检测到2位错误,我不太清楚。我的直觉说不,一个简单的例子是A = 00000001,B = 00000000,然后sum + checksum将是0xFF,但A和B中有两个从发送者到接收者的总错误。如果同一个单词中出现2位错误,则有可能检测到它,但似乎无法保证。

    UDP错误检查有多强大?它是否适用于偶数位错误?

1 个答案:

答案 0 :(得分:0)

可以检测到一些偶数位变化,有些则不能。

将检测到任何更改总和的错误。因此,将检测到改变总和的2位错误,但不会检测到不会改变总和的2位错误。

单个字中的2位错误(简化示例中的单个字节)将改变该字的值,这将改变总和,因此将始终检测到。将检测到跨越不同字的大多数2位错误,但是在不同方向上改变相同位的2位错误(一个0-> 1,另一个1-> 0)将不会改变总和 - 由其中一个更改位创建的值的更改将被另一个更改位创建的值的相等但相反的更改抵消 - 因此将不会检测到该错误。

因为这个校验和只是一个补充,它也无法检测到算术值为零的单词的插入或删除(因为这是一个补码计算,这意味着内容全部为0的单词全部1s。)

它也无法检测到单词的转置,(因为a + b给出与b + a相同的和),或者更一般地说它将无法检测到将一个单词添加到一个单词的错误,因为它们从其他(因为a + b给出与(a + n)+(bn)相同的和,例如3 + 3 = 4 + 2 = 5 + 1)。您可以将转置和取消错误情况视为由多对相同位更改组成。