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