不仅是ip首部, 多种网络协议都用到了此种校验算法来求得校验和(checksum).这种算法称之为: 二进制反码求和. 不知道为什么会取这么一个别扭的名字.算校验和的时候, 要注意那些字节参与计算, 哪些不参加. // 求协议头字段的校验和(checksum) #include <iostream> unsigned short cksum(const unsigned char* buff, int n) { int sum = 0; while(n > 1) { sum += (*buff)*256 + *(buff+1); buff+=2; if(sum & 0x80000000) sum = (sum & 0xffff) + (sum >> 16); n-=2; } if(n) sum += (*buff)*256; while(sum >> 16) sum = (sum & 0xffff) + (sum >> 16); return ~sum; } int main(int argc, char* argv[]) { const unsigned char ipdata[] = {0x45, 0xc0, 0x00, 0x78, 0x99, 0xc7, 0x00, 0x00, 0x01, 0x59, 0x00, 0x00, 0x0a, 0x01, 0x7b, 0x71, 0xe0, 0x00, 0x00, 0x05 }; printf("==0x%04x/n", cksum(ipdata, 20)); std::cin.get(); }