计算机网络通信时,为了检验在数据传输过程中数据是否发生了错误,通常在传输数据的时候连同校验和一块传输,以下简单的程序是数据包的包头中校验和的算法:返回的就是索求的校验和结果,当接收端接受数据时候会从新计算校验和,如果与原校验和不同就视为出错,丢弃该数据包,并返回icmp报文。
IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,采用的都是将数据流视为16位整数流进行重复叠加计算。为了计算检验和,首先把检验和字段置为0。然后,对有效数据范围内中每个16位进行二进制反码求和,结果存在检验和字段中,如果数据长度为奇数则补一字节0。当收到数据后,同样对有效数据范围中每个16位数进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全0或全1(具体看实现了,本质一样) 。如果结果不是全0或全1,那么表示数据错误。
(首先打开某文件并逐字符读取,如下的data可看做指向该文件字符内容的指针,len可看做该文件的长度,然后逐个对该文件的每一个字符进行运算操作)
u_short checksum(u_short *data,int len)
{
u_long sum=0;
for(;len>1;len-=2)
{sum+=*data++;
if(sum&0x80000000)
}
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;
}