一种确定修改数据后的数据包校验和的方法

文档序号:7567836阅读:402来源:国知局
专利名称:一种确定修改数据后的数据包校验和的方法
技术领域
本发明涉及数据校验技术,尤其是涉及一种确定修改数据后的数据包校验和的方法。
背景技术
校验和是用来验证数据从源主机到目的主机的一致性的。在TCP/IP协议族中用到的都是16位的校验和,各部分的校验和有着自己的意义。在现有技术中,确定16位校验和的基本算法包括以下步骤a.把所有要用来确定校验和的数据分成16位为一组的N个段,若字节数不是偶数,则增加一个字节的全0填充,此填充只是为了确定校验和,确定完毕就将其丢弃;b.对这N个数据段求和,得出一个可能大余16位的和值;c.把大于16位的进位值按上面的规则与低16位进行相加,如果又产生了进位,则再加一次;d.把得到的这个值按位取反,就得到的校验和的值。
对于TCP/IP协议,TCP数据包校验和有其自己的特点,如图1所示,它在TCP头101的前面加入了一个伪头102,在确定校验和时把TCP头101、伪头102和整个TCP数据103都包括进去。
下面举例说明现有技术所述的算法例如确定一个TCP数据包的校验和,首先,将该TCP数据包中的数据分成16位为一组的N个数据段A1、A2、A3、......、AN,对所述的这N个数据段求和得XY,即A1+A2+A3+......+AN=XY,其中,X为和值的高16位,Y为和值的低16位。根据TCP协议数据包长度的规定可知上述N个数据段的和不会超过0xFFFFFFFF,也就是说,在X前面不可能再有进位。
将高16位的X与低16位的Y相加,这时有两种情况第一种情况X+Y=Z,这种情况中,Z之前没有进位,将Z按位取反,得到的值为校验和;第二种情况X+Y=1Z,这种情况中,Z之前有进位1,所以要再把Z与进位1相加,将得到的和值按位取反后,得到的值为校验和。
上述方法的缺点是当TCP数据包中的数据有改动时,该改动包括伪头的中源和目的IP地址的修改,需要按上述方法重新确定一遍校验和,若数据包改动较小时也要完全按照上述方法根据所有数据重算一遍校验和,从而浪费处理器资源,导致效率低下,这种缺点在TCP数据包较长时就更加明显。

发明内容
有鉴于此,本发明的主要目的是提供一种确定修改数据后的数据包校验和的方法,从而节约处理器资源,提高工作效率。
为了实现上述目的,本发明的技术方案具体是这样实现的一种确定修改数据后的数据包校验和的方法,其特征在于,该方法包括A、将该数据包中所有涉及到修改的数据段所对应的修改前数据相加,得到一个和值x;B、将该数据包中所有涉及到修改的数据段所对应的修改后数据相加,得到一个和值y;C、获取所述数据包在修改前的校验和Z;D、根据式(M<<k)+(Z-M)-x+y的值获取修改数据后的校验和,其中,M<<k为将M左移k位,k为所述数据段的位数,M为涉及修改的数据段的个数。
步骤D中所述获取修改数据后的数据包校验和的方法为将[(M<<k)+(Z-M)-x+y]的值的高k位与低k位相加,判断得到的和值是否产生了进位,如果是,则将该和值的进位与该和值的低k位相加,将相加后的和值按位取反后,所得到的值作为修改数据后的校验和;否则,将[(M<<k)+(Z-M)-x+y]的值的高k位与低k位相加后的和值按位取反后,所得到的值作为修改数据后的校验和。
所述的数据段为16位的数据段。
所述的和值x、和值y以及[(M<<k)+(Z-M)-x+y]的值为32位。
所述的数据包为TCP数据包。
所述的TCP数据包中用于确定校验和的数据包括整个TCP数据、TCP头和伪头。
步骤C中,所述获取修改数据前的校验和的方式为从校验和字段中读取修改数据前的校验和;在步骤D之后还包括将修改数据后的校验和存入校验和字段。
如果所述的M未知,则将修改前数据与修改后数据做异或运算,根据运算结果确定M的值。
由于本发明所述的方法在数据包修改后,不用根据整个数据包中的数据确定修改后数据包的校验和,而只根据所改动的数据以及修改前数据包的校验和来确定修改后数据包的校验和,从而大大简化了确定修改后数据包校验和的方法,大大节约了处理器资源,提高了工作效率,尤其是当所述数据包非常大时,上述效果会更加突出。


图1为带有伪头的TCP数据包的报文格式;图2为本发明实施例所述方法的流程图。
具体实施例方式
下面结合附图和具体实施例对本发明再作进一步详细的说明。
在本实施例中,以TCP数据包为例来说明本发明所述的方法,如图2所示,本实施例所述的方法包括A、当TCP数据包修改后,将该数据包中所有涉及到修改的数据段所对应的修改前数据相加,得到一个和值x,所述的数据段为确定数据包修改前校验和时所分成的16位数据段;B、将该数据包中所有涉及到修改的数据段所对应的修改后数据相加,得到一个和值y;C、从校验和字段中读取修改前的校验和Z;D、利用公式(1)取校验和来确定该TCP数据包修改后的校验和Z1[(M<<16)+(Z-M)-x+y](1)式(1)中,(M<<k)表示将M左移k位;所述的M为涉及修改的16位数据段的个数,一般情况下,M是已知的,如果M未知,则将修改前的数据与修改后的数据做异或运算,根据计算结果确定M的值;所述的Z为所述数据包在修改前的校验和,利用公式(1)得到一个32位数,再将该32位数的高16位和低16位相加,判断得到的和值是否产生了进位,如果是,则将该和值的进位与该和值低16位相加,将相加后的和值按位取反后,所得到的值作为修改数据后的数据包校验和;否则,将[(M<<16)+(Z-M)-x+y]的值的高16位与低16位相加后的和值按位取反后,所得到的值作为修改数据后的数据包校验和。
E、将修改后的校验和存入校验和字段。
利用本发明所述方法求出的校验和与利用现有技术中所述的方法求出的校验和是相等的,下面证明本发明所述方法的正确性。
由于把校验和的值按位取反后所得的值是唯一的,所以下面以校验和在按位取反之前的值作为校验和来说明本发明所述的方法。
假设有一个TCP数据包的原校验和为Z,当该TCP数据包修改后,假设该数据包校验和Z1,在修改前数据包中的N个16位数据段中,假设涉及到数据修改的16位数据段在修改前的值为B1、B2、B3、......BM,其中的M为涉及修改的16位数据段的个数,这些16位数据段对应的修改后的值为C1、C2、C3、......CM。并且,所有B和C的值都是已知的,数据只做了修改,没有新增和删除。
假设B1+B2+B3+......+BM=x=mn,所述的x为32位的数,m为x的高16位,n为x的低16位;假设C1+C2+C3+......+CM=y,所述的y为32位的数;假设所述的TCP数据包中没有做修改的16位数据段按位相加的和值为s=pq,所述的s为32位的数,p为s的高16位,q为s的低16位。
因此可得,所述未修改之前的TCP数据包中所有16位数据段中数据的和值为x+s=mn+pq,将该和值的高16位与低16位相加,得到(m+p)+(n+q)=m+n+p+q,很明显,由于(m+n+p+q)有一个进位或者无进位都能正确地得到未修改之前的TCP数据包的校验和Z,也就是说(m+n+p+q)与未修改之前的TCP数据包的校验和Z唯一对应,通过(m+n+p+q)可以唯一获得未修改之前的TCP数据包的校验和Z。下面的论证中的情况与此相似,无论数据段的和值是否产生进位都可正确地地获得校验和,因此在整篇的论证说明中可以不考虑数据段的和值产生进位时的情况。
类似的,可以通过(m+n)来确定x的校验和;也可以通过(p+q)来确定s的校验和。
再确定x和s的总校验和(m+n)+(p+q)=m+n+p+q=Z;由此可以看出先对数据包中的一部分16位数据段以及剩余的16位数据段分别确定校验和,之后再将这两个较验和相加,得到的和值也为整个数据包的校验和。
因此,在修改数据包之后,涉及修改的16位数据段的校验和y,与未涉及修改的16位数据段的校验和s相加,得到的和值为数据包修改后的校验和,即利用s+y所得值的高16位与低16位相加,可得修改数据后的校验和Z1。
下面证明利用[(M<<16)+(Z-M)-x]取校验和等价于利用s取校验和。
a、首先验证现有技术中获取校验和的等效性运算。
例如获取TCP数据包修改前的校验和,首先,将该TCP数据包中的数据分成16位为一组的N个数据段A1、A2、A3、......、AN,对所述的这N个数据段求和得XY,即A1+A2+A3+......+AN=XY,其中,X为和值的高16位,Y为和值的低16位。根据TCP协议数据包长度的规定可知上述N个数据段的和不会超过0xFFFFFFFF,也就是说,在X前面不可能再有进位。
假设X+Y=Z,则可以得等价运算,如式(2)Z=(1+X)+(Y-1)=......=(n+X)+(Y-n) (2)式(2)中,n+X要保证不会造成16位和产生进位。
下面证明在某种特殊情况下,即(Y<n)时,对于校验和的计算式(2)仍然准确,如式(3)所示(n+X)+(Y-n)=X+[(Y-n)+n]=X+Y=Z (3)b、在本实施例中,由校验和等价运算式(2)可以得出Z=(Z-1)+1=......=(Z-M)+M (4)其中,(Z-M)的值设定为二进制中的一个无符号短整型值,所以不会出现负数。由于本实施例中的校验和为16位,所以对于较验和的运算,M和M右移16位的值是等价的,也就是说根据(M<<16)+(Z-M)计算出来的校验和的值与式(4)所计算得出的值一样,同样为Z。
x是由M个16位数据相加的和,所以该M个16位数据相加最多进位M-1,也就是说,x的高16位最大为M-1,而[(M<<16)+(Z-M)]的高16位不小于M,所以[(M<<16)+(Z-M)]大于x。利用[(M<<16)+(Z-M)-X]取校验和就等价于M+Z-M-(m+n)=Z-m-n=p+q,而s=pq,所以,利用[(M<<16)+(Z-M)-X]取校验和就等价于利用s取校验和。
根据上述的结论在修改数据包之后,涉及修改的16位数据段的校验和y,与未涉及修改的16位数据段的校验和s相加,得到的和值为数据包修改后的校验和。因此,数据包修改后的校验和值Z1就等价于利用[(M<<16)+(Z-M)-X+Y]取校验和,所以可验证式(1)的正确性。
以上所述,仅为本发明较佳的具体实施方式
,但本发明的保护范围并不局限于此,任何熟悉该技术的人在本发明所揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。
权利要求
1.一种确定修改数据后的数据包校验和的方法,其特征在于,该方法包括A、将该数据包中所有涉及到修改的数据段所对应的修改前数据相加,得到一个和值x;B、将该数据包中所有涉及到修改的数据段所对应的修改后数据相加,得到一个和值y;C、获取所述数据包在修改前的校验和Z;D、根据式(M<<k)+(Z-M)-x+y的值获取修改数据后的校验和,其中,M<<k为将M左移k位,k为所述数据段的位数,M为涉及修改的数据段的个数。
2.如权利要求1所述的方法,其特征在于,步骤D中所述获取修改数据后的数据包校验和的方法为将[(M<<k)+(Z-M)-x+y]的值的高k位与低k位相加,判断得到的和值是否产生了进位,如果是,则将该和值的进位与该和值的低k位相加,将相加后的和值按位取反后,所得到的值作为修改数据后的校验和;否则,将[(M<<k)+(Z-M)-x+y]的值的高k位与低k位相加后的和值按位取反后,所得到的值作为修改数据后的校验和。
3.如权利要求1所述的方法,其特征在于,所述的数据段为16位的数据段。
4.如权利要求3所述的方法,其特征在于,所述的和值x、和值y以及[(M<<k)+(Z-M)-x+y]的值为32位。
5.如权利要求1所述的方法,其特征在于,所述的数据包为TCP数据包。
6.如权利要求5所述的方法,其特征在于,所述的TCP数据包中用于确定校验和的数据包括整个TCP数据、TCP头和伪头。
7.如权利要求1所述的方法,其特征在于,步骤C中,所述获取修改数据前的校验和的方式为从校验和字段中读取修改数据前的校验和;在步骤D之后还包括将修改数据后的校验和存入校验和字段。
8.如权利要求1所述的方法,其特征在于,如果所述的M未知,则将修改前数据与修改后数据做异或运算,根据运算结果确定M的值。
全文摘要
本发明公开了一种确定修改数据后的数据包校验和的方法,该方法包括A.将该数据包中所有涉及到修改的数据段所对应的修改前数据相加,得到一个和值x;B.将该数据包中所有涉及到修改的数据段所对应的修改后数据相加,得到一个和值y;C.获取所述数据包在修改前的校验和Z;D.根据式(M<<k)+(Z-M)-x+y的值获取修改数据后的校验和,其中,M<<k为将M左移k位,k为所述数据段的位数,M为涉及修改的数据段的个数。利用本发明所述的方法,可简化原有的确定数据修改后数据包校验和的方法,节约了处理器资源,提高了工作效率。
文档编号H04L29/06GK1635728SQ20031012510
公开日2005年7月6日 申请日期2003年12月27日 优先权日2003年12月27日
发明者熊立群, 王亮, 古江春, 邹勇 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1