协议层的首部里都会有一个校验字段checksum,由发送端计算和存储,由接收端验证,用来保证报文在传输过程中的完整性
checksum的计算方法多样,而对于IP Header和ICMP Header中的checksum,采用相同的计算方法-加法校验和算法
计算校验和
IP Header中的checksum只校验IP首部,不校验数据部分
ICMP Header中的checksum校验ICMP首部和数据部分
反码求和法
反码求和法,是先求和,然后再取反
发送时
- 将校验和字段设置为0
- 每16个bit(即2个字节)组成一个数,相加
- 取反码,填入校验和字段
书上或网上都这样描述,大致是没错的,但是实际经不起推敲,有一些细节并没有关注到
比如不管是IP Header还是ICMP Header中的checksum都是16个bit,而这些数字相加有可能超过16个bit,怎么办?难道只是简单地把高位数字省略?
当然不是
IP首部