unsigned short checksum(unsigned short *buf, int nword) { unsigned long sum; for(sum = 0; nword > 0; nword--) sum += *buf++; sum = (sum>>16) + (sum&0xffff); sum += (sum>>16); return -sum; } 让 我 们 假 设 一个 IP 头数据,来解 cksum 的惑 IP 头数据: 01000101 /*ver_hlen*/ 00000000 /*tos*/ 00000000 00000010 /*len*/ 00000000 00000000 /*id*/ 00000000 00000000 /*offset*/ 00000100 /*ttl*/ 00010001 /*type*/ 00000000 00000000 /*cksum(0)*/ 01111111 00000000 00000000 00000001 /*sip*/ 01111111 00000000 00000000 00000001 /*dip*/ (1)16 比 特 分 组 ; (2)校 验 和 清 ‘0’ (3)求 所 有 16 比 特 之 和 01000101 00000000 /*ver_hlen*/ 00000000 00000010 /*len*/ --------------------- 01000101 00000010 00000000 00000000 /*id*/ --------------------- 01000101 00000010 00000000 00000000 /*offset*/ --------------------- 01000101 00000010 00000100 000100