千家信息网

IP首部校验和的计算

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,IP首部校验和的计算方法:算法:SHORT checksum(USHORT* buffer, int size){unsigned long cksum = 0;while(size>1){cksum
千家信息网最后更新 2025年01月21日IP首部校验和的计算

IP首部校验和的计算方法:

算法:

SHORT checksum(USHORT* buffer, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>>16) + (cksum&0xffff);
cksum += (cksum>>16);
return (USHORT)(~cksum);
}

(1)把IP数据包的校验和字段置为0;   
(2)把首部看成以16位为单位的数字组成,依次进行二进制求和(注意:求和时应将最高位的进位保存,所以加法应采用32位加法);   
(3)将上述加法过程中产生的进位(最高位的进位)加到低16位(采用32位加法时,即为将高16位与低16位相加,之后还要把该次加法最高位产生的进位加到低16位)   
(4)将上述的和取反,即得到校验和。

例子:

IP头:

45 00 00 31

89 F5 00 00

6E 06 00 00(校验字段)

DE B7 45 5D -> 222.183.69.93

C0 A8 00 DC -> 192.168.0.220

计算:

4500 + 0031 +89F5 + 0000 + 6e06+ 0000 + DEB7 + 455D + C0A8 + 00DC =3 22C4

0003 + 22C4 = 22C7

~22C7 = DD38 ->即为应填充的校验和

当接受到IP数据包时,要检查IP头是否正确,则对IP头进行检验,方法同上:

计算:

4500 + 0031 +89F5 + 0000 + 6E06+ DD38 + DEB7 + 455D + C0A8 + 00DC =3 FFFC

0003 + FFFC = FFFF


0