简介

对于了解过TCP/IP协议的来说,会注意到部分协议头中的checksum字段,如TCP, IP等。那么checksum是什么、为什么被使用、如何计算出来, 对这些问题做一个简单的讲述。

回顾

IP头结构的理解,详见本本站一篇IP头的结构文章。简单的归纳就是32bit倍数的数据, 最大头长度位数数据是4bit-IHL(单位是4字节即32bit)那么最大15*32bit=60字节;最小无可选数据为20字节。

数据结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 0                   1                   2                   3  
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

我们看比较关注的几个字段:
Header Checksum, header checksum占用16bit数据空间。
Padding:补充数据,确保为32bit的倍数,那么头数据肯定也是16bit的倍数。
其他字段本文暂且用不到,如需详细了解请看另一篇文章。

定义及描述

什么是checksum, 校验和是一个用来检测数据是否和原来一致的一个值, 它的位数16bit,根据数据计算出来的。因为数据在网络上传输存在误码或者错误,那么需要一个检测值在包头判定数据是否正确。
我们把包头数据按照16bit分组,然后对每组数据按位求和, 那么这个值可认为为校验和。

IP头checksum计算方式

当发送端发送数据的时候,把checksum数据位置为0,IP头数据按照16bit分组计算出校验和值;接收端接收到的头数据同样按照16bit分组,计算出每组的反码并求和, 如果ip头在传输中不存在数据错误,那么计算结果应该全为1。

总结及后记

校验和是一种数据有效性的检测手段,优点对比MD5/CRC等是计算快速,缺点是并不能完全的保证数据的正确性, 需要应用协议或者程序去保证。 亚马逊S3某次故障中就出现内网传输数据bit错误导致的问题,所以应用层做数据校验。


版权声明:本文为博主原创文章,未经允许不得转载。