在计算UDP校验和时,我知道我们会对结果进行补充,并使用它来检查错误。但是我不明白为什么我们使用1的补码而不是2的补码(as shown here)。如果没有错误,1的补码结果为-1 (0xFFFF),2的补码结果为0 (0x0000)。
为了检查正确的传输,接收器的CPU必须首先否定结果,然后查看ALU的零标志。这将花费1个额外的周期来进行否定。如果使用了2的补码,则只需查看0标志即可完成错误检查。
发布于 2021-06-09 23:48:46
这是因为如果发送方和接收方机器的字节顺序不同,使用2的补码可能会给出错误的结果。
如果我们使用下面的例子:
0000 1111 1110 0000 1111 0000 0001 0000
在小端机器上计算的带有2补码的校验和为:
0000 0000 0001 0000
如果我们将原始数据添加到big-endian机器上的校验和中,我们将得到:
0000 0000 1111 1111
这将表明我们的校验和是错误的,尽管它不是。然而,1的恭维结果与机器的字节顺序无关,所以如果我们对1的补码数做同样的事情,我们的校验和将是:
0000 0000 0000 1111
当与数据相加时,我们会得到:
1111 1111 1111
这允许短UDP校验和工作,而不需要发送方和接收方机器具有相同的字符顺序。
https://stackoverflow.com/questions/66761735
复制相似问题