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