首页 > 代码库 > 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);

}

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

  得到的结果是全一,正确。


本文出自 “12038626” 博客,谢绝转载!

IP首部校验和的计算     [网络协议分析的作业]