简介
对于了解过TCP/IP协议的来说,会注意到部分协议头中的checksum字段,如TCP, IP等。那么checksum是什么、为什么被使用、如何计算出来, 对这些问题做一个简单的讲述。
回顾
IP头结构的理解,详见本本站一篇IP头的结构文章。简单的归纳就是32bit倍数的数据, 最大头长度位数数据是4bit-IHL(单位是4字节即32bit)那么最大15*32bit=60字节;最小无可选数据为20字节。
数据结构如下:
1 | 0 1 2 3 |
我们看比较关注的几个字段:
Header Checksum, header checksum占用16bit数据空间。
Padding:补充数据,确保为32bit的倍数,那么头数据肯定也是16bit的倍数。
其他字段本文暂且用不到,如需详细了解请看另一篇文章。
定义及描述
什么是checksum, 校验和是一个用来检测数据是否和原来一致的一个值, 它的位数16bit,根据数据计算出来的。因为数据在网络上传输存在误码或者错误,那么需要一个检测值在包头判定数据是否正确。
我们把包头数据按照16bit分组,然后对每组数据按位求和, 那么这个值可认为为校验和。
IP头checksum计算方式
当发送端发送数据的时候,把checksum数据位置为0,IP头数据按照16bit分组计算出校验和值;接收端接收到的头数据同样按照16bit分组,计算出每组的反码并求和, 如果ip头在传输中不存在数据错误,那么计算结果应该全为1。
总结及后记
校验和是一种数据有效性的检测手段,优点对比MD5/CRC等是计算快速,缺点是并不能完全的保证数据的正确性, 需要应用协议或者程序去保证。 亚马逊S3某次故障中就出现内网传输数据bit错误导致的问题,所以应用层做数据校验。
版权声明:本文为博主原创文章,未经允许不得转载。