IP/ICMP/IGMP/TCP/UDP/等协议的校验和算法是相同的,采用的都是将数据流视为16位整数流进行重复的叠加计算。
计算校验和的步骤:
(1)把校验和字段置为0。
(2)对IP头部的每16bit进行二进制求和。
(3)如果和的高16位不位0,则将和的高16位和低16位反复的相加,直到和的16位为0,从而获得一个16位的值。
(4)将该16位的值取反,存入校验和字段。
例如:
IP报头
45 00 00 31
89 F5 00 00
6E 06 00 00 //校验字段
DE B7 45 5D //源IP地址
C0 A8 00 DC //目的IP地址
根据如上的IP报头,可以求得校验和为:
4500+0031+89F5+0000+6E06+0000+DEB7+455D+C0A8+00DC = 322C4
由于计算的和为322C4的高16位不为0,所以将和的高16位和低16位进行反复的相加,直到和的高16位位0为止。
0003+22C4 = 22C7然后将结果进行取反操作~22C7 = DD38则DD38为最终的校验和。