基于http的网络数据包还原方法
技术领域
本发明涉及一种网络应用协议分析方法,特别是涉及一种基于http的网络数据包还原方法。
背景技术
随着计算机网络的发展,网络应用也在不断的增多,尤其是万维网的应用,已占因特网通信量的90%,万维网信息的安全问题已经越来越被人们所重视,而作为万维网应用层核心协议的http协议是基础。当在网络上传送色情、暴力和迷信等不良信息时,将影响人们的身心健康和社会的团结,对这些危害信息和不良信息在应用层的还原可以很明确的知道该信息传送的信息,对阻拦和监控具有很直观的效果,可以帮助网络管理人员较好的监视网络。现有的基于http的网络数据包还原算法,在对网络包数据进行解析时,并不对内容是否雷同进行区分,因而识别效率低,占用资源较大,因而不能很好的适应在大流量环境下对内容进行分析,重组和还原。
发明内容
本发明针对现有技术不足,提出一种基于http的网络数据包还原方法,解决了在大流量环境下对内容进行分析的瓶颈,提高了对万维网应用协议分析的高效性与准确率。
本发明所采用的技术方案:
一种基于http的网络数据包还原方法,在TCP会话数据流重组算法的基础上,对http协议中post方法提交的数据,添加通过Content-Length的值判断数据是否发送完,对基于http的网络数据包编译前的准备工作通过下述步骤实现:
对于获取的网络数据包的一个报文数据段,设该报文数据段第一字节的序号数据报长度
其中,x、a为自然数,则对于下一个来到的报文数据段可能出现的情况,依次分析如下:
1)正常报文
y=x+a,其中y、b为自然数,
由此报文的seq可知,这个报文携带数据序号y~(y+b-1),正是上一个报文的预期后续报文,将此报文追加到正常报文队列;
2)完全重复报文
y1==y并且b1==b;
该报文携带数据序号y1~(y1+b1-1),与上一个报文携带的数据序号y~(y+b-1)完全一样,即这两个报文完全重复,则丢弃该报文;
3)重复子报文
y2==x而且b2<a
这个报文携带数据序号y2~(y2+b2-1),说明这是上一个报文的一部分,所以应该丢弃这个报文;
前述两种情况可以合并,即seq2==seq1而且len2<=len1,这里分别列出只是为了说明各种不同情况;对于部分重复报文情况,又包括下列情况:
4)部分重复报文情况一
Y3>x且y3<y2且b3<=x+a
即:seq2>seq1而且seq2<seq1+len1而且seq2+len2<=seq1+len1
即这个报文携带序号y3~(y3+b3-1),这个序号段被包含在上一个报文段中(x~x+a-1),所以应该丢弃这个报文;
5)部分重复报文情况二
y4>x且y4<x+a且y4+b4>x+a
即:seq2>seq1而且seq2<seq1+len1而且seq2+len2>seq1+len1即这个报文携带序号y4~(y4+b4-1),这个序号段前一部分y4~x+a-1被包含在上一个报文段(x~x+a-1)中,后一部分x+a~y4+b4-1是新的数据,此时应该对这个报文作如下处理:
A.计算重复字节数
(seq1+len1)-Seq2=x+a-y4
即这个报文段前(x+a-y4)个字节是重复的;
B.截取报文段新数据
丢弃这个报文段的前x+a-y4字节,截取后面的新数据,即只保留字节序号段x+a~y4+b4-1;
C.重新设置这个报文段的序列号
seq2=seq2+(x+a-y4)
即:seq2=x+a
D.重新设置这个报文段的数据长度
len2=len2-(x+a-y4)=b4-x-a+y4
E.重新设置后报文段如下
即现在这个报文段携带数据序号x+a~y4+b4-1,正好是上一个报文的后续报文,现在可以将其作为正常报文追加到正常报文队列;
6)对于提前到达的报文
n>x+a
即:seq2>seq1+len1
这个报文数据段携带序号n~n+p-1的数据,即不是上一个报文x~x+a-1的后续报文,而是提前到来的报文,此时则将这个报文放置到失序报文队列存储起来,以备后续重组使用;
重复上述步骤,直到得到携带tcp连接断开标志位FIN为1的报文,此时将正常报文队列和失序报文队列中的数据合并起来,完成报文数据重组。
所述的基于http的网络数据包还原方法,分析出http协议使用post方法时协议头部中记录消息主体长度的值,然后按照步骤1接收重组数据包,并在接受重组的过程中,累计记录数据包的有效数据长度,其中有效数据长度即不包含tcp/ip协议头的长度,当累计的数据包的长度等于协议头部中指定的长度时,即post提交的数据已经完成;这时不用再继续等到携带tcp连接断开标志位FIN为1的报文到达,即可以分析提交的报文数据。
本发明的有益积极效果:
1、本发明根据网络应用协议及其内容的相关特点进行分析设计,“因材施教”的提出了改进基于http的网络数据包还原的方法。在基本的网络数据包还原算法的基础上,对http协议中post方法提交的数据,通过添加Content-Length的值判断数据是否发送完,精简了基于http的网络数据包编译前的准备工作。有效的解决了在大流量环境下对内容进行分析的瓶颈,提高了万维网应用中对提交数据部分分析的高效性与准确率。
2、本发明根据上网行为审计的实际需求出发,关注的是本地网络通过http协议post方法向外部服务器提交的数据。所以仅分析处理本地网络到服务器单向的tcp报文,使用本算法可以在不考虑tcp应答报文的情况下完成http数据的还原。大大简化网络数据流的重组和还原流程,从而有效降低系统负荷,加快数据处理速度。显著改善了传统算法造成的网络延迟现象。
具体实施方式
实施例:对通过http协议post方法传输的一条完整信息的还原。通过对http协议post方法的分析得到传输信息的有效总长度content-length=1400byte。设已获得报文的总长度为length。
1、获得到seq1=1,len1=100的报文packet1。将packet1放入正常报文队列。length=length+len1=100。length<content-length,数据为未传输完成。
2、获得到seq2=101,len2=150的报文packet2。判断seq2==seq1+len1,packet2正是packet1的预期后续报文。将packet2放入正常报文队列。length=l ength+len2=250。length<content-length,数据为未传输完成。
3、获得到seq3=200,len3=40的报文packet3。判断seq2<seq3<seq2+len2-1,packet3的数据段与正常报文队列的数据段200~239重复。不对此报文进行处理。
4、获得到seq4=210,len4=41的报文packet4。判断seq2<seq4=seq2+len2-1,packet3的数据段与正常报文队列的数据段210~250重复。不对此报文进行处理。
5、获得到seq5=251,len5=200的报文packet5。判断seq5==seq2+len2,packet5正是packet2的预期后续报文。将packet5放入正常报文队列。length=length+len5=450。length<content-length,数据为未传输完成。
6、获得到seq6=251,len6=200的报文packet6。判断seq6==seq5且len6==len5,packet6的数据段与正常报文队列的数据段251~450重复。不对此报文进行处理。
7、获得到seq7=451,len7=150的报文packet7。判断seq7==seq5+len5,packet2正是packet 1的预期后续报文。将packet7放入正常报文队列。length=length+len7=600。length<content-length,数据为未传输完成。
8、获得到seq8=501,len8=300的报文packet8。判断seq7<seq8<seq7+len7,计算重复数据长度repeat-len=seq7+len7-seq8=100,得到有效长度valid-len=200。截取packet8数据段结尾200byte数据并将seq8设置为valid-seq8=seq7+len7=601,将处理好的packet8放入正常报文队列。length=length+valid-len=800。length<content-length,数据为未传输完成。
9、获得到seq9=801,len9=100的报文packet9。判断seq9==valid-seq8+valid-len,packet9正是处理过的packet8的预期后续报文。将packet9放入正常报文队列。length=length+len9=900。length<content-length,数据为未传输完成。
10、获得到seq10=1201,len10=100的报文packet10。判断seq10>seq9+len10,说明packet10是提前到达的报文。将packet10暂时存储,等待其前的报文到达。
11、获得到seq11=901,len11=100的报文packet11。判断seq11==seq9+len9且seq11+len11<seq10,packet 11正是packet9的预期后续报文。将packet11放入正常报文队列。length=length+len11=1000。length<content-length,数据为未传输完成。
12、获得到seq12=1001,len12=100的报文packet12。判断seq12==seq11+len11且seq12<seq10,seq12+len12<seq10+len10。packet12正是packet 11的预期后续报文并且它的数据段在packet 10的数据段之前。将packet12放入正常报文队列。length=length+len12=1100。length<content-length,数据为未传输完成。
13、获得到seq13=1101,len13=100的报文packet13。判断seq13==seq12+len12且seq13+len13==seq10。packet13正是packet12的预期后续报文段并且是packet10的前续报文段。将packet12放入正常报文队列,然后将packet10也放入正常报文队列。length=length+len12+len10=1300。length<content-length,数据为未传输完成。
14、获得到seq14=1301,len14=100的报文packet14。判断seq14==seq10+len10,packet2正是packet10的预期后续报文。将packet14放入正常报文序列。length=length+len14=1400。length==content-length,数据传输完成。
15、对正常报文队列的数据进行重组还原。