IP首部校验和计算原理


 IP 首部中的校验和为例,计算过程可分为三个步骤:

首部校验和即对IP首部的校验:

 

1.把校验和字段以全零填充;

2.对每 16 位(2 Byte)进行二进制反码求和;

(先对每 16 位求反码然后求和若相加后最高位有进位,那么不能舍弃,一定要加到低位,才能是结果正确。0x0319BB 拆分成0X03+0X19BB

3.对得到的结果即为首部校验和。


抓包示例如下图所示:


 0X45 中分开表示,4-----ipv4的版本号;5代表-----IP报头的长度,以字节为单位。



对如下十六进制数据求反码校验和:

0x45c0,0x0044,0x0009,0x0000,0x0159,0x0000(归零的校验和),0x5900,0x0009,0xe000,0x0005

对以上数据直接相加得结果:0x180bd 

按照2中规则,对此数据的处理应该是将16位数最高位的进位0x010x80bd相加,即得到中间结果:0x80be

按照3中规则对其取反即得校验和:0x7f41


关于接收时的验证:

2中所述,将所有16位数据直接相加,并将进位数据加到最低位,此时与计算过程相比,数据中多了一个反码数据,因此如果传输途中没有差错,此时的计算结果应当是16位全1数据。

下面结合上面的示例说明计算原理,由校验和的计算过程可知,所有数据(含校验和数据)的代数和应当小于0x03FFFF,其中最高位的0x0316位数据的进位数据。因此对于发送时计算校验和的过程和接收时根据校验和校验的过程这两个过程中的求和运算,16位的进位数据是完全相同的,因此在接收校验时可直接把所有数据相加并把最终的进位数据加到最低位,若传输无误则结果必然是全1

-------------------------------------------------------------

另一中描述,和上述相似。

16位首部校验和:

steve的书上是这样说的:
 a、把校验和字段置零
 b、对首部中每个16位进行二进制反码求和(整个首部看成是由一串16BIT的字组成),结果存在校验和字段中。
 c、收到一份IP数据报后,同样对首部的每个16bit进行二进制反码求和(高位溢出添加到低位,与通常的补码运算直接丢弃溢出的高位不同)。
 d、接收方在计算过程中包含了发送方存在的首部校验和,因此,首部在发送过程中如果没有任何差错,那么接收方计算的检验结果应该全为1(0xFFFF),否则表明数据包接收错误,丢弃该IP包。
注意:这里的二进制反码求和理解应该为对各个16Bbit进行求和后取反,关键是这些16bit的单元加在一起,如果没有整除16(size还存在不足16位),则应该加上剩余的部分,这是的结果应该会超出16位,所以要对高出16位的的和再次与低16位相加得到cksum,这是第一步。而第一步相加是很可能会再次产生进位,因此需要再次把进位移到低16位相加的到最终的cksum的反码,这是将结果取反即可。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值