icmp报文校验算法
来源:互联网 发布:淘宝手办店黑店 编辑:程序博客网 时间:2024/06/04 14:29
备忘用
检验和算法在 TCP/IP 协议族中是比较常见的算法。IP、ICMP、UDP和TCP报文头部都有校验和字段,不过IP、TCP、UDP只针对首部计算校验和
而 ICMP 对首部和报文数据一起计算校验和。
检验和算法可以分成两步来实现。
首先在发送端,有以下三步:
1.把校验和字段置为0。
2.对需要校验的数据看成以16bit为单位的数字组成,依次进行二进制求和。
3.将上一步的求和结果取反,存入校验和字段。
其次在接收端,也有相应的三步:
1.对需要校验的数据看成以16bit为单位的数字组成,依次进行二进制求和,包括校验和字段。
2.将上一步的求和结果取反。
3.判断最终结果是否为0。如果为0,说明校验和正确。如果不为0,则协议栈会丢掉接收到的数据。
从上可以看出,归根到底,校验和算法就是二进制反码求和。由于先取反后相加与先相加后取反,得到的结果是一样的,所以上面的步骤都是先求和后取反。
下面用C语言来实现校验和算法,代码如下:
/** * addr 指向需校验数据缓冲区的指针 * len 需校验数据的总长度(字节单位)***下面的addr是icmp报文结构(strcut)的地址,被强制转换成了unsigned short, 32*位机子上是16位,两字节,所以每次加下地址都加了16位的数据*** */unsigned short checkSum(unsigned short *addr, int len){ unsigned int sum = 0; while(len > 1){ sum += *addr++; len -= 2; } // 处理剩下的一个字节 if(len == 1){ sum += *(unsigned char *)addr; } // 将32位的高16位与低16位相加 sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return (unsigned short) ~sum;}
上面的代码首先定义了一个32位无符号整型的变量sum,用来保存16bit二进制数字相加的结果,由于16bit相加可能会产生进位,所以这里使用32位变量来保存结果,其中高16bit保存的是相加产生的进位。
然后下面的 while 循环,对数据按16bit累加求和。
接下来的if语句判断是否还剩下8bit(一字节)。如果校验的数据为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加。
之后的两行代码作用是将 sum 高16bit的值加到低16bit上,即把累加中最高位的进位加到最低位上。(sum >> 16)将高16bit右移到低16bit,(sum & 0xffff)将高16bit全部置为0。注意,这两步都不会改变sum原来的值。
进行了两次相加可以保证 sum 高16bit都为0,没有进位了。
最后取反,并返回。
扩展:
为什么使用二进制反码求和,而不是原码或补码呢?
这是因为,使用反码计算校验和比较简单和快速。对于网络通信来说,最重要的就是效率和速度。
以上转载自实验楼:
c语言实现ping程序—感谢课程教师tianji
- icmp报文校验算法
- icmp校验和算法详解
- ICMP校验和算法 说明
- ICMP报文
- ICMP报文
- ICMP报文
- ICMP报文
- ICMP报文
- ICMP/ICMP报文分析
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP 校验和算法
- IP、ICMP、UDP、TCP校验和算法
- I/O接口递归
- SlidingMenu的一些常用属性
- Argparse Tutorial
- 集成学习——装袋算法
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- icmp报文校验算法
- 用例设计-常用正交表9个
- dubbo和mq的使用场景
- bootstrap中的table组件
- 聚类分析的典型应用和技术
- ROS 资源名字规范
- PP代码生成器(二) 解决方案, 生成任务, 辅助设计面板
- 欢迎使用CSDN-markdown编辑器
- 个人练习题库(个人保存)