IP首部检验和

在发送数据时,为了计算数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");
}

上面的算法应该包含一些数理规律,对此笔者懒得追究了。。。