计算机网络里面的IP/ICMP/TCP/UDP等协议的校验和算法采用的都是将数据流视为16位整数流进行重复累加计算,为了计算累加和,首先把检验和字段值为0, 然后对有效数据范围内的每个16位二进制位反码求和,结果存在校验和字段中。如果数据长度为奇数,则补一字节0, 当收到数据后,同样对数据范围中的每个16位数进行二进制反码求和。由于接收方在计算过程中包含了发送方在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全0或者全1,如果不是全0或者全1, 表示数据传输错误。
实现代码:
u_short checksum(u_short *data, int len )
{
u_long sum = 0;
for( ;len) 1; len -= 2)
{
sum += *data++;
if(sum&0x80000000)
{
sum = (sum&0xffff) + (sum>>16); //使用1的补码
}
}
if(len == 1)
{
u_short i = 0;
*(u_char *)(&i) = *(u_char *)data ;
sum += i;
}
while(sum >> 16)
{
sum = (sum&0xffff) + sum >> 16;
}
return (sum == 0xffff)?sum:~sum;
}
阅读(2601) | 评论(0) | 转发(0) |