Chinaunix首页 | 论坛 | 博客
  • 博客访问: 834294
  • 博文数量: 97
  • 博客积分: 3042
  • 博客等级: 中校
  • 技术积分: 1610
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-21 11:48
文章存档

2015年(1)

2014年(3)

2013年(4)

2012年(43)

2011年(44)

2010年(2)

分类: LINUX

2012-08-23 16:00:37

计算机网络里面的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;
}
阅读(2610) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~