网际校验和算法(Internet CheckSum)

时间:2024-03-30 11:38:01

网际校验和算法

反码算数运算:

两个数进行二进制反码求和的运算很简单。它的规则是从低位到高位逐列进行计算。0和0相加是0,0和1相加是1,1和1相加是0但要产生一个进位1,加到下一列。如果最高位相加后产生进位,则最后得到的结果要加1。

网际校验和算法概述:

  • 在发送方,先把被校验的数据划分为许多16位字的序列。如果数据的字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。用反码算数运算把所有16位字相加后,然后再对和取反码,便得到校验和。

  • 在接收方,将收到的数据报(包括校验和字段),将所有16位字再使用反码算数运算相加一次,将得到的和取反,即得出校验和的计算结果。如果数据报在传输过程中没有任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。

举例

“A,B,C,…,Y,Z”分别表示一系列8位组,用[A,B]这样形式的字节组来表示A*256+B的整数,那么该字节序列的反码和就可以通过以下两种表达式之一给出:

[A,B] +’ [C,D] +’ … +’ [Y,Z]

[A,B] +’ [C,D] +’ … +’ [Z,0]

其中,+’ 表示反码算数运算相加,第一个公式适用于偶数个字节的校验和,第二个公式适用于计算奇数个字节的校验和。

原理:

1、校验和的计算:将缓冲区的数据中挨个数累加(X),然后取反输出(~X)。

2、校验:将缓冲区的数据和校验和(X)一起求校验和,累加和(Y(及取反输出(Y)。Y =缓冲区的数据累加(X(+校验和(X)=0XFFFF。Y=0。所以当结果为0,说明数据传输没问题。

如果校验和计算时高16位(XH)不等于零,(XH)+(XL)= Z,新校验和为~Z。 校验时,再次求校验和 :先求和(XH)*2^16 +(XL)+ ~Z= (XH)*2^16 +(XL)+ 0XFFFF - Z =(XH)*2^16+(0XFFFF -(XH))=Y.YH=XH,YL=(0XFFFF -(XH),YH+YL=0XFFFF.

程序截图

网际校验和算法(Internet CheckSum)

项目代码下载(java实现)

点击下载项目代码