checksum二进制反码求和计算方法

checksum二进制反码求和计算方法:

ip报文:将首部不包含数据,分成多个16位字的序列,将检验和置零,然后进行反码算术运算把所有16位字相加后,将得到的  和的反码  写入检验和字段。接收方接收到后,再按照16位字的序列计算一次,得到的和为1,取反码为0.

udp:添加一个12字节 ip伪首部(源ip 4字节 + 目的ip 4字节 + 1全零字节 + 协议类型17  1字节 +  udp长度 2字节 ),伪首部、udp首部和数据部分一起检验,数据部分不是偶数个字节,则要填入一个全零字节,此字节不发送,计算方法同上。

tcp:同udp检验。

unsigned short checksum(unsigned short *buf, int length)
{
    unsigned long sum;

    for(sum = 0; length > 0; length--) {
        sum += *buf++;
        sum = (sum>>16) + (sum&0xffff);
        sum += (sum>>16);
    }

    return ~sum;
} 

 

posted @ 2020-03-05 19:46  撒欢  阅读(1375)  评论(0编辑  收藏  举报