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; }