版权归原作者所有,如有侵权,请联系我们

[科普中国]-校验和

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

简介

这些数据项可以是数字或在计算检验的过程中看作数字的其它字符串。校验和(checksum)是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。TCP和UDP传输层都提供了一个校验和与验证总数是否匹配的服务功能。1

它通常是以十六进制为数制表示的形式,如:

十六进制串:

|| ||

的校验和是: 24 (十六进制)

如果校验和的数值超过十六进制的FF,也就是255,就要求其补码作为校验和。

通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。

步骤发送方生成检验和1.将发送的进行检验和运算的数据分成若干个16位的位串,每个位串看成一个二进制数,这里并不管字符串代表什么,是整数、浮点数还是位图都无所谓。

2.将IP、UDP或TCP的PDU首部中的检验和字段置为0,该字段也参与检验和运算。

3.对这些16位的二进制数进行1的补码和(one's complement sum)运算,累加的结果再取反码即生成了检验码。将检验码放入检验和字段中。

其中1的补码和运算,即带循环进位(end round carry)的加法,最高位有进位应循环进到最低位。反码即二进制各位取反,如0111的反码为1000。

接收方校验检验和1.接收方将接收的数据(包括检验和字段)按发送方的同样的方法进行1的补码和运算,累加的结果再取反码。

2.校验,如果上步的结果为0,表示传输正确;否则,说明传输有差错。

检验和算法示例图5.7所示为一个只包含4个16位二进制数进行检验和运算的简单例子。图5.7(a)所示为发送方的运算,①、②、③是3个数据,④是检验和,先置0,也参加检验和运算。⑤是它们的一的补码和,⑥是⑤的反码。发送方将⑥放到检验和字段和数据一起发出。图5.7(b)所示为接收方的运算,如果没有传输差错,最后结果应为0。

表示如:

十六进制串: 0102030405060708

的校验和是: 24 (十六进制)

IP首部校验和计算IP首部校验和字段是根据IP首部计算的校验和码,它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据校验和码。

为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

TCP和UDP校验和计算校验和还包含一个96位的伪首标,理论上它位于TCP首标的前面。这个伪首标包含了源地址、目的地址、协议和TCP长度等字段,这使得TCP能够防止出现路由选择错误的数据段。这些信息由网际协议(IP)承载,通过TCP/网络接口,在IP上运行的TCP调用参数或者结果中传递。

伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。

这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。(伪报头保证UDP和TCP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。)

文件校验和在Windows中,exe校验和是没有必要的,因为系统会负责检查,错误的exe将无法运行。但是sys文件和关键的dll文件是被要求要校验和的。

检验和程序#includeint main(){ int a[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; int i,sum=0; for (i=0;i0xff) { sum=~sum; sum+=1; } sum=sum&0xff; printf("0x%x\n",sum);}

评论
科普cuili007
庶吉士级
知道了
2023-01-01