ping包的checksum校验和

PING包发送里面有一个比较关键的就是checksum即校验和

checksum本来就是ICMP包内的数据 怎么又从ICMP包开始计算?后来看了一下文档,就是就算ICMP的时候checksum本身

的字段要置零

//计算网际效验和函数 pBuf指向ICMP数据开始的地方
uint16_t checksum(uint16_t *pBuf,int iSize)
{
    uint32_t cksum=0;
    pBuf[1]=0;//checksum字段本身应该置零
    while(iSize>1)
    {
        cksum+=*pBuf++;
        iSize-=sizeof(uint16_t);
    }
    if(iSize)
    {
        cksum+=*(uint16_t*)pBuf;
    }
    cksum=(cksum>>16)+(cksum&0xffff);
    cksum+=(cksum>>16);
    return(uint16_t)(~cksum);
}
原文地址:https://www.cnblogs.com/yuandaozhe/p/11418687.html