在网络传送的数据包为了保证传送正确都含有效验字段,IP、arp、tcp等每
个数据段都有自己的效验和。
效验的计算并不复杂。把相应数据包段的所有数据看成一个字节数组
{a,b,c,d,e},把他们分成16bit一组
{[ab],[cd],[e0]}
计算其和:
[ab]
[cd]
[e0]
--------
[xy]
计算采用循环进位,最高位的进位加到最低位,
如果计算出的[xy]所有位都为1(即为1111 1111)则效验通过。
如果[cd]为效验和的话,已经填好其他各个字节,如何计算出[cd]
(checksum)的值呢?我们首先用0填充[cd],然后算出[xy],则正确的[cd]应该为计
算出的[xy]按位求反的结果。这样才能保证整个数据包段通过效验。
实际程序中,因为现在的机器都是32位的,所以采用变通的算法:
Byte-by-byte "Normal" Swapped
Order Order
Byte 0/1: 00 01 0001 0100
Byte 2/3: f2 03 f203 03f2
Byte 4/5: f4 f5 f4f5 f5f4
Byte 6/7: f6 f7 f6f7 f7f6
--- --- ----- -----
Sum1: 2dc