1s补码校验和如何用于错误检测?

nod*_*nja 18 checksum

只需添加位即可生成校验和.如何使用1s补充的额外步骤有用吗?

我理解这个理论.我知道如何计算1s补码,我知道如何添加补码使结果全1.

我想看一个如何检测错误的简单示例.

Saj*_*jid 20

我相信你正在寻找的例子可以在这里找到.

我们做1的补码的原因是,当将1的补码加到所有值的总和上,并将结果调整到机器的位长度(上例中为16位)时,它全是1.CPU有一个功能可以取1的数字补码,而取1的1的补码全是0.

原因是:CPU不喜欢使用比特,除了通常使用的块之外.因此,添加两个64位数可能需要1个周期,但单独检查该数字的所有位将需要更多(在一个简单的循环中,可能高达8x64个循环).CPU还能够轻松地获取1的补码,并检测最后一次计算的结果为零,而不检查单个位和分支.所以基本上,这是一个优化,让我们可以非常快速地检查校验和.由于大多数数据包都很好,因此我们可以动态检查校验和,并将数据更快地传输到目的地.


小智 6

例如,您需要发送 UDP 数据包中的三个字。

0110011001100000
0101010101010101
1000111100001100
Run Code Online (Sandbox Code Playgroud)

发送端的UDP对所有16位字的和进行补1。这些 16 位字的前两个之和为

0110011001100000 +
0101010101010101 =
1011101110110101 
Run Code Online (Sandbox Code Playgroud)

将第三个单词添加到上面的总和中,请注意,最后的添加有溢出,它被包裹起来

--> 0100101011000010
Run Code Online (Sandbox Code Playgroud)

1的补码是通过将0全部转为1并将1全部转为0来获得的。

因此,和的 1 补码01001010110000101011010100111101,它成为校验和。在接收器处,所有四个 16 位字都被添加,包括校验和。如果数据包中没有引入错误,那么接收器处的总和显然将为1111111111111111。如果其中一位为 0,则我们知道数据包中已引入错误。

  • 请添加对《计算机网络:自上而下的方法》一书的引用,该示例逐字取自该书。 (32认同)

bry*_*ryc 5

校验和的补码(位反转)至少有两种用途。

  1. 简化校验和验证过程

例如,如果最终校验和字节为 56,则补码(位反转)将为 199。将它们加在一起,结果为 255。推理:通过对最终校验和进行补码,当包含总和计算中的校验和数字。对 255 进行第二次补码将产生 0,对于当时的 CPU 来说,这是一种更有效的方法来确认校验和有效,而无需比较两个数字。

  1. 允许检测到一个无法检测到的错误

计算 n 个零的消息会产生零的校验和。这意味着由零组成的合法消息与内存丢失或擦除情况无法区分,应将其检测为错误。在本例中,通过对最终校验和 0 求补,结果变为 255,从而防止结果 0 仍然有效。