关于反码求和这个事情,IP/ICMP/IGMP/TCP/UDP等协议的 校验和算法都是相同的。
为了求网络协议的校验和,需要把报文的二进制按word,也就是2个字节分割,校验和字段填0,尾部为奇数字节则添加一个字节0. 二字节求和后取反。
其实这个事情概念上有点误导,让大家以为是所有2个字节都取反码,然后求和,最后再取反放到校验和字段。当然这样就很绕了。
那以此求和取反,当收到报文重新按2字节二进制求和时,因为最终加了取反的校验和,所以最终结果会是binary全1,即0xFFFF。
当然了,比如UDP算校验和时,还需要加个12字节伪首部,但不影响计算过程。
到这里,再讲下计算机原码,反码,补码的问题。
对正数来说,他们三个都是一样对。所以反码在这里看到了点曙光啊。反码不是取反。
对负数来说,除符号位外,其他取反则是其反码。【1】
对负数来说,补码即其反码+1,原码即符号位为1,