checksum二进制反码求和计算方法:tcp
ip报文:将首部不包含数据,分红多个16位字的序列,将检验和置零,而后进行反码算术运算把全部16位字相加后,将获得的 和的反码 写入检验和字段。接收方接收到后,再按照16位字的序列计算一次,获得的和为1,取反码为0.spa
udp:添加一个12字节 ip伪首部(源ip 4字节 + 目的ip 4字节 + 1全零字节 + 协议类型17 1字节 + udp长度 2字节 ),伪首部、udp首部和数据部分一块儿检验,数据部分不是偶数个字节,则要填入一个全零字节,此字节不发送,计算方法同上。code
tcp:同udp检验。blog
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; }