checksum 算法
程序员文章站
2022-07-10 18:38:55
...
说明
- checksum:总和检验码,校验和,可以理解为check(校验),sum(和)。
- 在数据处理和通信领域,通过一定算法对传输的数据进行求和以校验数据的完整性和准确性。
使用
算法
- 求和的算法大致是确定的,但是一些细节不是很重要,例如:校验和使用几个字节存储,只要收发两边处理规则一样就行。
- 网上示例,如下:
USHORT CICMP::CheckSum(USHORT *buff,int Size)
{
unsigned long cksum = 0;
//将数据以字为单位累加到cksum中
while (Size > 1)
{
cksum += *buff;
Size -= sizeof(USHORT);
}
//如果为奇数,将最后一个字节扩展到双字,在累加到cksum中
if (Size)
{
cksum += *(UCHAR*)buff;
}
//将cksum的高16位和低16位相加,取反后得到效验和
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);//位运算符号:位取反!比如有int a=3;则先把十进制数3,转化为二进制数,即00000011.那么~a=11111100
}
流程
- 在数据发送端对数据进行checksum。
- 将计算出的checksum取反,存放在数据末尾或其它位置发送给接收端。
- 接收端收到数据后对所有数据进行checksum,如果checksum为0表示数据正确。
原理
- checksum为0表示数据正确原因:除了数据中的checksum值,其它数据的sum值等于checksum取反,两值相加值的所有位为1,再取反后即为0,也就是所有数据的checksum为0。
- 如果所有数据的checksum不为0说明数据发生过变化,因此数据是无效的。
个人理解
- checksum算法是不可靠的,只能在要求不是很严格的情况下使用,无法用来判断数据是否一致。
- checksum算法中每个数据都是位置无关的,因此该算法无法检测出数据发生交换,测试可知:数据发生交换c不会影响hecksum。
- checksum能在一些情况下使用,因为数据在发送过程中交换的可能性较小,发生01翻转的数据不抵消就能检测到,但是应用层一些业务逻辑出现01翻转抵消的情况好像挺常见,因此个人对checksum的可靠性表示怀疑。
上一篇: TCP/UDP的checksum校检算法实现,亲测与wireshark一致
下一篇: 蓝桥签到题