当前位置: 技术问答>linux和unix
ip数据包的校验和
来源: 互联网 发布时间:2016-09-01
本文导语: 这里要说的是首部校验和字段。 在发送数据时,为了计算数IP据报的校验和。应该按如下步骤: (1)把IP数据报的首部都置为0,包括校验和字段。 (2)把首部看成以16位为单位的数字组成,...
这里要说的是首部校验和字段。
在发送数据时,为了计算数IP据报的校验和。应该按如下步骤:
(1)把IP数据报的首部都置为0,包括校验和字段。
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。
(3)把得到的结果存入校验和字段中。
在接收数据时,计算数据报的校验和相对简单,按如下步骤:
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。
(2)检查计算出的校验和的结果是否等于零。
(3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
上面我在网上查的
我要问的是有没有可能头部被修改后检查还能通过?比如调换相邻的16bit最后计算的结果是一样的
在发送数据时,为了计算数IP据报的校验和。应该按如下步骤:
(1)把IP数据报的首部都置为0,包括校验和字段。
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。
(3)把得到的结果存入校验和字段中。
在接收数据时,计算数据报的校验和相对简单,按如下步骤:
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。
(2)检查计算出的校验和的结果是否等于零。
(3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
上面我在网上查的
我要问的是有没有可能头部被修改后检查还能通过?比如调换相邻的16bit最后计算的结果是一样的
|
校验的目的只是防止网络传输中的不完整,要求比较低。
比如奇偶校验,甚至只是检验报文个数,只需要任意修改两个报文就能通过校验,因为校验本身是只防君子不防小人了。
如果要做很严格的校验,那就不是一两个位就能搞定了的,MD5都用了整整32个字符。
比如奇偶校验,甚至只是检验报文个数,只需要任意修改两个报文就能通过校验,因为校验本身是只防君子不防小人了。
如果要做很严格的校验,那就不是一两个位就能搞定了的,MD5都用了整整32个字符。
|
补充一下四楼的说法。
这个校验的确只是防止数据在传输中出错的时候来用的,从编码角度来看,一种纠错编码能识别的错误长度是N,那么当出错的bit数超过N以后,是无法识别出来的。
比如奇偶校验,有用吗?有用!串口通讯就是用的奇偶校验。那你要问了,我如果错了2个bit,那奇偶校验和不变呀!对!所以你如果真要数据无损传输,还需要在应用时另外再加上数据校验方法,比如数据传输完了,计算一下crc之类。
crc对于数据完整性是很管用的,随便哪里出错一点就会校验不通过;但不要指望能防止恶意篡改数据。毕竟crc算法是公开的,我改了其中某个字段,然后顺手把crc校验和也给你改了,你自然发现不了。
这个校验的确只是防止数据在传输中出错的时候来用的,从编码角度来看,一种纠错编码能识别的错误长度是N,那么当出错的bit数超过N以后,是无法识别出来的。
比如奇偶校验,有用吗?有用!串口通讯就是用的奇偶校验。那你要问了,我如果错了2个bit,那奇偶校验和不变呀!对!所以你如果真要数据无损传输,还需要在应用时另外再加上数据校验方法,比如数据传输完了,计算一下crc之类。
crc对于数据完整性是很管用的,随便哪里出错一点就会校验不通过;但不要指望能防止恶意篡改数据。毕竟crc算法是公开的,我改了其中某个字段,然后顺手把crc校验和也给你改了,你自然发现不了。