IP协议的校验和的计算方法是16位反码加,而不是通常的补码加,因此在一台以补码运算为基础的计算机上,只能通过软件模拟。具体来说,就是需要进位加回。这可以用32位补码加结合位运算完成。

端序问题也值得考虑。在小端机器上计算校验和时,是否需要将16位大端表示的数据转换呢?假设IP头按照大端运算为[A,B] + [C,D] + ... + [X, Y]=[a, b],按照小端运算为[B, A] + [D, C] + ... + [Y, X]=[c, d],那么a、b与c、d是否有关系呢?

实际上[a,b]=[d,c],因此[c,d]通过小端序写回时其值就是[a,b],可以在运算时全程使用小端序。要证明这一点,从数学归纳法不难看出,只需证明[A,B]+[C,D]=[B,A]+[D,C]就可以了。

注意到等式两侧,由于反码加的特点,都是B与D的进位加到A与C的和,A与C的进位加到B与D的和。因此无论如何,算出的值都相等。这种性质只有反码加具有,也许这也是IP校验和采用反码的一个原因吧。

有兴趣的也可以看看RFC关于校验和的内容