在发送数据时,为了计算数IP据报的校验和。应该按如下步骤:
(1)把IP数据报的校验和都置为0。
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。
(3)把得到的结果存入校验和字段中。
在接收数据时,计算数据报的校验和相对简单,按如下步骤:
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。
(2)检查计算出的校验和的结果是否等于零。
(3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
下面是校验代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include<stdio.h> unsigned short checksum(unsigned short *buf,int nword) { unsigned long sum;
for(sum=0;nword>0;nword--){ sum += *buf++; sum = (sum>>16) + (sum&0xffff); }
return ~sum; } int main() { unsigned short iph[]={0x4500,0x00ad,0x7755,0x4000,0x8006, 0x0000,0x0a97,0x7819,0x0a97,0x781d}; unsigned short cksum;
cksum=checksum(iph,20); printf("%X\n",cksum); iph[5]=cksum; cksum=checksum(iph,20); printf("%X\n",cksum); if(cksum) printf("Checksum is incorrect!\n"); else printf("Checksum is correct!\n"); }
|
上面的算法应该包含一些数理规律,对此笔者懒得追究了。。。