ICMP协议计算并验证校验和


ICMP协议基本格式如图所示:
ICMP协议基本格式

1. 什么是校验和

校验和基本上是一个从数据包计算出来的值来检查其完整性。通过完整性,我们可以检查收到的数据是否没有错误。这是因为在网络上传输时,数据包可能会损坏,并且接收端必须知道数据是否已损坏。这是校验和字段添加到报文的原因。在源端,计算校验和并将其作为字段设置在报文中。在目标端,再次计算校验和,并用报文中现有的校验和值进行交叉检查,看看数据包是否正常。icmp需要通过其报文信息与本身数据一起校验(IP只需校验头部信息)。因此,就算法而言,imcp校验和是:imcp报文中所有16位字的补码总和的16位补码。

2.怎么验证校验和

以IP数据包为例:

4500 003c 1c46 4000 4006 b1e6 ac10 0a63 ac10 0a0c

其中’be16’ 对应于在源端(发送数据包的端)设置的校验和。请注意,如前所述,在目标端计算校验和时,该字段将设置为零。

  1. 将所有这些值转换为二进制:
4500 -> 0100010100000000
003c -> 0000000000111100
1c46 -> 0001110001000110
4000 -> 0100000000000000
4006 -> 0100000000000110
0000 -> 0000000000000000 // 请注意,校验和设置为零,因为我们在目标端计算校验和
ac10 -> 1010110000010000
0a63 -> 0000101001100011
ac10 -> 1010110000010000
0a0c -> 0000101000001100
  1. 将二进制一一相加:
4500 -> 0100010100000000
003c -> 0000000000111100
453C -> 0100010100111100 /// 第一个结果

453C -> 0100010100111100 // 第一个结果加上下一个 16 位字。
1c46 -> 0001110001000110
6182 -> 0110000110000010 // 第二个结果。

6182 -> 0110000110000010 // 第二个结果加上下一个 16 位字。
4000 -> 0100000000000000
A182 -> 1010000110000010 // 第三个结果。

A182 -> 1010000110000010 // 第三个结果加上下一个 16 位字。
4006 -> 0100000000000110
E188 -> 1110000110001000 // 第四个结果。

E188 -> 1110000110001000 // 第四个结果加上下一个 16 位字。
AC10 -> 1010110000010000
18D98 -> 11000110110011000 // 一个奇数位(进位),将该奇数位添加到结果中,因为我们需要将校验和保持为 16 位。

18D98 -> 11000110110011000
8D99 -> 1000110110011001 // 第五个结果

8D99 -> 1000110110011001 // 第五个结果加上下一个 16 位字。
0A63 -> 0000101001100011
97FC -> 1001011111111100 // 第六个结果

97FC -> 1001011111111100 // 第六个结果加上下一个 16 位字。
AC10 -> 1010110000010000
1440C -> 10100010000001100 // 又是一个进位,所以我们加上它(和之前一样)

1440C -> 10100010000001100
440D -> 0100010000001101 // 这是第七个结果

440D -> 0100010000001101 //第七个结果加上下一个16位字
0A0C -> 0000101000001100
4E19 -> 0100111000011001 // 最终结果。
  1. 现在 0100111000011001 就是我们对头部所有 16 位字求和的最终结果。将其进行补码:
4E19 -> 0100111000011001
B1E6 ->1011000111100110 // 校验和
  1. 将此校验和与数据包中获得的校验和进行比较,您会发现两者完全相同,因此 IP 标头的完整性并未丢失。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值