1 的补码校验和偶位错误
1's complement checksum even bit errors
我正在努力研究 UDP 中使用的 1 的补码校验和错误检测。
我对在 8 位字上运行的类似 UDP 的 1 的补码校验和错误检查算法的简化示例的理解(我知道 UDP 使用 16 位字):
- 将所有8位数据字相加,将MSB翻转到LSB。
- 对这个和取1的补码,设置校验和,发送数据报
- 接收方在传入数据报中添加进位翻转所有接收到的8位数据字,添加校验和。
- 如果总和 = 0xFF,则没有错误。否则,发生错误,丢弃数据包。
很明显,该算法可以检测到 1 位错误,并扩展到任何奇数位错误。如果 8 位数据字中只有一位损坏,则总和 + 校验和永远不会等于 0xFF。一个简单明了的例子是 A = 00000000,B = 00000001,然后 ~(A + B) = 11111110。如果 A(receiver) = 00000001,B(reciever) = 00000001,总和 + 校验和将为 0x00 != 0xFF
我的问题是:
我不太清楚这是否可以检测到2位错误。我的直觉说不,一个简单的例子是 A = 00000001,B = 00000000,那么 sum + checksum 将是 0xFF,但是从发送方到接收方的 A 和 B 总共有两个错误。如果 2 位错误发生在同一个字中,则有可能检测到它,但似乎并不能保证。
UDP 错误检查有多稳健?它适用于偶数位错误吗?
有些 even-bit 变化可以被检测到,有些则不能。
任何改变总和的错误都会被检测到。因此,将检测到改变和的 2 位错误,但不会检测到不改变和的 2 位错误。
单个字(在您的简化示例中为单个字节)中的 2 位错误将改变该字的值,这将改变总和,因此将始终被检测到。大多数跨不同字的 2 位错误将被检测到,但是在不同字中以不同方向(一个 0->1,另一个 1->0)更改同一位的 2 位错误不会改变总和 -由其中一个更改位创建的值更改将被另一个更改位创建的 equal-but-opposite 值更改抵消 - 因此不会检测到该错误。
因为这个校验和只是简单的加法,所以它也无法检测算术值为零的单词的插入或删除(因为这是一个补码计算,所以意味着内容全为0的单词或全1)。
它也无法检测到单词的换位(因为 a+b 给出与 b+a 相同的总和),或者更一般地说,它无法检测到一个单词加减相同数量的错误来自另一个(因为 a+b 给出与 (a+n)+(b-n 相同的总和),例如 3+3=4+2=5+1)。您可以考虑换位和 cancelling-error 情况由多对 same-bit 变化组成。
我正在努力研究 UDP 中使用的 1 的补码校验和错误检测。
我对在 8 位字上运行的类似 UDP 的 1 的补码校验和错误检查算法的简化示例的理解(我知道 UDP 使用 16 位字):
- 将所有8位数据字相加,将MSB翻转到LSB。
- 对这个和取1的补码,设置校验和,发送数据报
- 接收方在传入数据报中添加进位翻转所有接收到的8位数据字,添加校验和。
- 如果总和 = 0xFF,则没有错误。否则,发生错误,丢弃数据包。
很明显,该算法可以检测到 1 位错误,并扩展到任何奇数位错误。如果 8 位数据字中只有一位损坏,则总和 + 校验和永远不会等于 0xFF。一个简单明了的例子是 A = 00000000,B = 00000001,然后 ~(A + B) = 11111110。如果 A(receiver) = 00000001,B(reciever) = 00000001,总和 + 校验和将为 0x00 != 0xFF
我的问题是:
我不太清楚这是否可以检测到2位错误。我的直觉说不,一个简单的例子是 A = 00000001,B = 00000000,那么 sum + checksum 将是 0xFF,但是从发送方到接收方的 A 和 B 总共有两个错误。如果 2 位错误发生在同一个字中,则有可能检测到它,但似乎并不能保证。
UDP 错误检查有多稳健?它适用于偶数位错误吗?
有些 even-bit 变化可以被检测到,有些则不能。
任何改变总和的错误都会被检测到。因此,将检测到改变和的 2 位错误,但不会检测到不改变和的 2 位错误。
单个字(在您的简化示例中为单个字节)中的 2 位错误将改变该字的值,这将改变总和,因此将始终被检测到。大多数跨不同字的 2 位错误将被检测到,但是在不同字中以不同方向(一个 0->1,另一个 1->0)更改同一位的 2 位错误不会改变总和 -由其中一个更改位创建的值更改将被另一个更改位创建的 equal-but-opposite 值更改抵消 - 因此不会检测到该错误。
因为这个校验和只是简单的加法,所以它也无法检测算术值为零的单词的插入或删除(因为这是一个补码计算,所以意味着内容全为0的单词或全1)。
它也无法检测到单词的换位(因为 a+b 给出与 b+a 相同的总和),或者更一般地说,它无法检测到一个单词加减相同数量的错误来自另一个(因为 a+b 给出与 (a+n)+(b-n 相同的总和),例如 3+3=4+2=5+1)。您可以考虑换位和 cancelling-error 情况由多对 same-bit 变化组成。