网际校验和算法ICMP校验位计算

作者:
淡白
创建时间:
2021-06-10 14:19:34
ICMP 协议 IP

摘要:本文主要介绍了关于网络知识中的ping命令和其中的ICMP协议。ping命令使用ICMP协议来进行网络连接测试,在ping命令中,发送的数据包中包含了校验和字段。校验和的计算过程是将每两个字节相加,直到最后得出结果,并与前面的结果相加,然后取结果的反码作为最终的校验和。文章还给出了一个Go语言代码示例,展示了如何计算校验和。

面试时聊到了一些网络知识。其中ping这个东西,是我经常用到的但似乎对它又不是很了解,于是去看了下相关协议的介绍。它使用了一种协议叫ICMP(Internet Control Message Protocol)Internet控制报文协议。 报文结构:image.png 其中校验和计算:

  1. 将校验和字段置为0。
  2. 将每两个字节(16位)相加(二进制求和)直到最后得出结果,若出现最后还剩一个字节继续与前面结果相加。 (溢出)将高16位与低16位相加,直到高16位为0为止。
  3. 将最后的结果(二进制)取反。
func CheckSum(data []byte) uint16 {
	var sum uint32 //uint32符合校验位站2字节
	var length = len(data)
	var index int
	for index <= length-2{
		//对每两个字节相加 其中对每两字节中的第一个字节左移8位再加上后面一位 组成一个16位数加到结果中
		sum += uint32(data[index]) << 8 + uint32(data[index+1])
		index += 2
	}
	//如果有单独一个字节也按照16位进行相加
	if length%2==1{
		sum += uint32(data[length-1])<<8
	}
	//sum >> 16 高16位的值加32位的sum 取32位中低16位的值再取反
	sum += sum >> 16
	return uint16(^sum)
}

参考: https://blog.csdn.net/zhj082/article/details/80518322