为了计算一份数据包的IP校验和,首先将校验和字段设置为0。然后,对首部中的每16 bit 进行二进制反码求和(整个首部看成由一串16 bit 的字组成)。结果存在校验和字段中。
当收到一份IP数据报后,同样对首部中每个16 bit 进行二进制反码求和。由于接收方在计算过程中包含了发送方存在首部中的校验和,所以,如果首部在传输过程中没有发生任何差错,那么接收方计算得到的结果应该全为1,否则就是校验和发生错误,该数据报将被丢弃。但不生成差错报文,由上层去发现丢失的数据包并进行重传。
ICMP、IGMP、TCP和UDP都采用这种校验和算法。
还有一个问题就是数据报每经过一个路由器,TTL字段将减1。因此,路由器每次转发数据报的时候还需要将校验和加1。没有对IP首部进行重新计算得到新的校验和。
例: