checksum校验

原理

        P/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,采用的都是将数据流视为16位整数流进行重复叠加计算。为了计算检验和,首先把检验和字段置为0。然后,对有效数据范围内中每个16位进行二进制反码求和,结果存在检验和字段中,如果数据长度为奇数则补一字节0。当收到数据后,同样对有效数据范围中每个16位数进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全0或全1(具体看实现了,本质一样; 校验时可能返回~checksum) 。如果结果不是全0或全1,那么表示数据错误。

例子:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. unsigned short checksum(unsigned short *pdate, int size)  
  4. {  
  5.     unsigned int sum=0;  
  6.     while (size>1)  
  7.     {     
  8.         sum += *pdate;  
  9.         pdate++;  
  10.         size -= sizeof(short);  
  11.     }     
  12.       
  13.     if (size)  
  14.         sum += *(unsigned char*)pdate;  
  15.       
  16.     while(sum>>16)  
  17.     {     
  18.         sum = (sum & 0xffff) + (sum>>16);  
  19.     }     
  20.   
  21.     return ~sum;  
  22. }  
  23.   
  24. int main(void)  
  25. {  
  26.     unsigned short checksum_code=0;  
  27.     unsigned short date[] = {0,0x4500, 0x0029, 0x44f1,0x4000, 0x8006, 0xc0a8, 0x01ae, 0x4a7d, 0x477d};//date[0]存放校验码  
  28.     unsigned short check_res=0;  
  29.   
  30.     checksum_code = checksum((unsigned short*)date, sizeof(date));//产生校验码  
  31.     date[0] = checksum_code;  
  32.     printf("generate:%x\n", checksum_code);  
  33.   
  34.     check_res= checksum((unsigned short*)date, sizeof(date));//校验结果  
  35.     printf("check result:%x\n", check_res);  
  36.     return 0;  
  37. }  

编译运行:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值