1的补码校验和甚至误码

问题描述 投票:0回答:1

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

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

  1. 对所有8位数据字求和,将MSB翻转传送到LSB。
  2. 取此总和的1的补码,设置校验和,发送数据报
  3. 接收器在进入的数据报中添加了进位翻转所有接收到的8位字数据,并添加了校验和。
  4. 如果sum = 0xFF,则没有错误。否则,发生错误,丢弃数据包。

很明显,该算法可以检测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错误检查有多强大?它是否适用于偶数位错误?

networking udp checksum
1个回答
0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.