IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法以下:算法
在发送数据时,为了计算数IP据报的校验和。应该按以下步骤:spa
在接收数据时,计算数据报的校验和相对简单,按以下步骤:code
100b+101b=010b(由于100b+101b=1001b,高位溢出1,其应该加到低位,即001b+1b(高位溢出位)=010b)
。请看我用ominipeek的抓包blog
I.将校验和字段置为0,而后将IP包头按16比特分红多个图片
校验和Header Checksum:0x618D将其重置为0X0000ip
将IP包头分段:it
1. 0x4500 2. 0x0029 3. 0x44F1 4. 0x4000 5. 0x8006 6. 0x0000 ------->这个为Header Checksum的值,咱们前面将其重置为0了 7. 0xC0A8 8. 0x01AE 9. 0x4A7D 10. 0x477D \-------------------------------------------------------
将1至10相加求出来的和为:0x29E70class
II.对各个单元采用反码加法运算(即高位溢出位会加到低位,一般的补码运算是直接丢掉溢出的高位),将获得的和的反码填入校验和字段二进制
0x0002+0x9E70=0x9E72im
0x9E72二进制为:1001 1110 0111 0010
反码为:0110 0001 1000 1101
0110 0001 1000 1101的16进制为:0x618D
看看这个 是否与IP包头中的Checksum相同
当接收到IP对其进行检测
I. 对各个单元采用反码加法运算,检查获得的和是否符合是全1(有的实现可能对获得的和会取反码,而后判断最终值是否是全0)
当收到IP数据局包的时候,要验证IP头是否正确,则能够这样进行
1. 0x4500 2. 0x0029 3. 0x44F1 4. 0x4000 5. 0x8006 6. 0x618D ------->这个为Header Checksum的值 7. 0xC0A8 8. 0x01AE 9. 0x4A7D 10. 0x477D \-------------------------------------------------------
将1至10相加求出来的和为:0x2FFD
II. 对各个单元采用反码加法运算(即高位溢出位会加到低位,一般的补码运算是直接丢掉溢出的高位),将获得的和的反码填入校验和字段:
0x0002+0x0FFD=0xFFFF
0xFFFF二进制为:1111 1111 1111 1111
1111 1111 1111 1111反码为:0
====================================================
关于这一部的补充说明,
将IP包头分段:
1. 0x4500 2. 0x0029 3. 0x44F1 4. 0x4000 5. 0x8006 6. 0x0000 ------->这个为Header Checksum的值,咱们前面将其重置为0了 7. 0xC0A8 8. 0x01AE 9. 0x4A7D 10. 0x477D