一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种信令分析场景中HTTP数据流会话的重组方法与流程

2022-11-16 14:25:38 来源:中国专利 TAG:

一种信令分析场景中http数据流会话的重组方法
技术领域
1.本发明涉及通信技术领域,尤其是一种信令分析场景中http数据流会话的重组方法。


背景技术:

2.信令解码分析系统是针对网络信令数据进行分析的主要手段之一。实现信令会话生成是信令解码分析系统的主要功能。现代网络信令数据大多通过tcp层承载,而http协议报文又占了其中的较大部分。http协议的信令会话生成需要通过实时解析信令报文数据,来重组合成并输出话单结果。
3.信令解码分析涉及以下相关术语和定义:
4.tcp是一种面向连接的、可靠的、基于字节流的传输层通信协议,由ietf的rfc 793定义。
5.http是互联网上应用最为广泛的一种网络协议。
6.tcp重组:通有过tcp序列号来将tcp会话传输的内容序的拼接,从而重组还原tcp原始会话内容。
7.五元组是指源ip地址、源端口、目的ip地址、目的端口和传输层协议。
8.传统的http会话重组方法中,在报文处理过程中不需要留存码流信息,但由于仅依靠报文到达的时间顺序来划分会话,在客户端先传送多个请求,而服务端再返回多个响应的情况下关联结果不准确,也没有考虑针对乱序情况的处理。


技术实现要素:

9.有鉴于此,本发明实施例提供一种信令分析场景中http数据流会话的重组方法,以提高重组的准确性以及提高处理性能。
10.本发明实施例的一方面提供了一种信令分析场景中http数据流会话的重组方法,包括:
11.获取一个tcp报文帧,以所述tcp报文帧的五元组为关键字进行映射表查找,确定tcp会话信息;
12.根据所述tcp会话信息中包含http载荷的情况进行对应的报文匹配处理,具体地:当所述tcp会话信息中包含http载荷时,执行http请求与响应的载荷报文匹配;当所述tcp会话信息中不包含http载荷时,执行tcp中ack确认号的载荷报文匹配;
13.根据所述报文匹配处理的结果,进行请求与响应的载荷乱序队列处理,完成http数据流会话的重组。
14.可选地,所述方法还包括:
15.确定http数据包的边界序号信息,所述边界序号信息包括请求开始序号、请求结束序号、响应开始序号、响应结束序号;
16.对报文会话判断过程中的tcp序号的大小进行判断,以确定tcp分片间的相对位
置。
17.可选地,所述确定http数据包的边界序号信息,包括:
18.记录http报文头部的起始序号以及http报文头部的末尾序号;
19.若http报文头部包含内容长度字段,则判定当前报文包含报文载荷,对http报文进行解析直到报文头部结束标识后,解析出载荷长度值,以当前报文末尾序号为报文载荷起始序号,计算当前报文载荷的结束序号,完成当前http报文的边界计算;
20.若http报文头部包含chunked字段,判定当前报文的报文载荷为分段载荷方式,对http报文进行解析直到报文头部结束标识后,解析一行数据并获取每行数据的数据块的长度,计算当前数据块的结束序号,对整个http报文来说,取最后的数据块的结束序号作为当前报文载荷的结束序号;当数据块长度不为0时,表示后续还有数据块,继续循环执行本步骤;当数据块长度为0时,完成当前http报文的边界计算。
21.可选地,所述对报文会话判断过程中的tcp序号的大小进行判断,包括:
22.当tcp分片出现seq序号值跨过0xffffffff的情况时,封装一个tcpseq类,实现整形数值与tcpseq类的相互转换,并重载大于、小于判断函数,实现对tcp序号的比较判断;
23.当比较短时间内同一tcp流同向的两个tcp序号先后顺序时,先计算两个序号的差值并取绝对值,当两个序号的差值的绝对值大于0x80000000时,视为两个tcp序号出现溢出,此时将两个tcp序号以纯数值方式比较,得出结果并将结果取反即为最终比较结果。
24.可选地,所述方法还包括:
25.在解析http报文头部或解析数据块长度的过程中,如果因到达tcp帧结尾而读取不到一行完整数据,则将此行不完整数据加入待处理请求或响应缓存队列,并记录此行数据的起始序号与此tcp帧的结尾序号;
26.其中,所述tcp帧的结尾序号等于tcp帧序号 tcp携带的载荷大小。
27.可选地,所述http请求与响应的载荷报文匹配,包括:
28.在同一tcp流中遇到以http报文请求头部起始的tcp帧时,http报文请求头部起始的tcp帧中,报文载荷起始的若干字节内容为get/head/post/options/put/delete/trace/connect,该过程具体为:
29.当报文头部起始序号紧接tcp三握手的载荷结束序号时,检测载荷是否以http请求方法get/head/post/options/put/delete/trace/connect开头;若是则判断为http数据流并划分为第一个会话;若否则标记该tcp流为非http数据流,该tcp流后续帧不进行处理;
30.当报文头部起始序号大于最后http会话请求结尾序号,是超前报文,加入请求载荷乱序队列;
31.当报文头部起始序号等于最后http会话请求结尾序号,生成下一个http会话记录;
32.从后到前检索http会话表,根据边界序号判断所属http会话;
33.在同一tcp流中遇到以http报文响应头部起始的tcp帧时,http报文响应头部起始的tcp帧中,报文载荷起始的若干字节内容为http/1.1,或者http/1.0,或者http/0.9,该过程具体为:
34.当报文头部起始序号紧接tcp三握手的载荷结束序号时,划分为第一个会话;否则按下一步处理;
35.当报文头部起始序号大于最后http会话响应结尾序号,则确定为超前报文,将超前报文加入响应载荷乱序队列;否则按下一步处理;
36.从后到前检索http会话表,根据边界序号判断所属http会话;
37.遇到非http报文请求/响应头部起始的tcp帧,从后到前检索http会话表根据边界序号判断所属http会话;
38.如果tcp帧包含http报文请求/响应结尾且结尾后有剩余数据,将剩余数据部分按http报文头部进行处理。
39.可选地,所述http请求与响应的载荷报文匹配这一步骤中,http报文头部处理过程包括:
40.对http报文进行头部解析,确定报文边界序号;
41.如果报文头部数据不完整,则对报文头部进行分情况处理;
42.若处理后还有剩余数据,则将会话归属指向下一个会话记录,然后返回执行对http报文进行头部解析,确定报文边界序号的步骤,直至处理后没有剩余数据。
43.可选地,所述tcp中ack确认号的载荷报文匹配这一步骤中,tcp中ack确认报文是带ack标记、没有载荷的tcp报文,分上下行方向,上行报文的确认序号与本会话的响应序号范围对应;下行报文的确认序号与本会话的请求序号范围对应,该步骤具体包括:
44.当收到同一tcp流的上行/下行ack确认报文时,获取确认序号,判断是否大于tcp流中最后的http会话对应响应/请求序号范围,若大于则加入对应ack乱序队列;否则从后到前检索http会话表根据确认序号判断所属http会话;其中,ack乱序队列是一个按确认序号递增排列的有序队列;
45.当处理完一条本会话报文后,检查ack乱序队列是否空,如果非空,按以下过程处理:
46.当队列首节点的确认序号大于最后一个http会话对应载荷范围时,结束本次处理;否则按下一步处理;
47.从后到前检索http会话表,根据确认序号判断队列首节点所属http会话,移除该节点,重复调用本过程处理下一节点。
48.可选地,所述请求与响应的载荷乱序队列处理,包括:
49.针对请求/响应载荷乱序队列,当队列非空时,按以下过程处理:
50.当队列首节点载荷起始序号值与最后一个http会话待处理请求/响应缓存队列的结尾序号匹配,取出缓存数据并重组合并,进而继续按http报文头部进行处理;否则按下一步处理;
51.当队列首节点载荷起始序号大于最后一个http会话请求/响应载荷范围时,结束本次处理;否则按下一步处理;
52.从后到前检索http会话表,根据边界序号判断队列首节点所属http会话,移除该节点,重复调用本过程处理下一节点。
53.本发明实施例的另一方面还提供了一种电子设备,包括处理器以及存储器;
54.所述存储器用于存储程序;
55.所述处理器执行所述程序实现如前面所述的方法。
56.本发明实施例还公开了一种计算机程序产品或计算机程序,该计算机程序产品或
计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器可以从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行前面的方法。
57.本发明的实施例获取一个tcp报文帧,以所述tcp报文帧的五元组为关键字进行映射表查找,确定tcp会话信息;根据所述tcp会话信息中包含http载荷的情况进行对应的报文匹配处理,具体地:当所述tcp会话信息中包含http载荷时,执行http请求与响应的载荷报文匹配;当所述tcp会话信息中不包含http载荷时,执行tcp中ack确认号的载荷报文匹配;根据所述报文匹配处理的结果,进行请求与响应的载荷乱序队列处理,完成http数据流会话的重组。本发明提高了重组的准确性以及提高处理性能。
附图说明
58.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
59.图1为本发明实施例的整体步骤流程图;
60.图2为整段载荷方式报文样例图;
61.图3为分段载荷方式报文样例图;
62.图4为普通数据块报文样例图;
63.图5为结束数据块报文样例图;
64.图6为一种乱序判断样例的示意图;
65.图7为http请求与响应载荷报文匹配的步骤流程图;
66.图8为http报文头部处理过程流程图;
67.图9为粘包样例图;
68.图10为分片包样例;
69.图11为一个http请求响应报文关联样例图;
具体实施方式
70.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
71.针对现有技术存在的问题,本发明实施例的一方面提供了一种信令分析场景中http数据流会话的重组方法,包括:
72.获取一个tcp报文帧,以所述tcp报文帧的五元组为关键字进行映射表查找,确定tcp会话信息;
73.根据所述tcp会话信息中包含http载荷的情况进行对应的报文匹配处理,具体地:当所述tcp会话信息中包含http载荷时,执行http请求与响应的载荷报文匹配;当所述tcp会话信息中不包含http载荷时,执行tcp中ack确认号的载荷报文匹配;
74.根据所述报文匹配处理的结果,进行请求与响应的载荷乱序队列处理,完成http
数据流会话的重组。
75.可选地,所述方法还包括:
76.确定http数据包的边界序号信息,所述边界序号信息包括请求开始序号、请求结束序号、响应开始序号、响应结束序号;
77.对报文会话判断过程中的tcp序号的大小进行判断,以确定tcp分片间的相对位置。
78.可选地,所述确定http数据包的边界序号信息,包括:
79.记录http报文头部的起始序号以及http报文头部的末尾序号;
80.若http报文头部包含内容长度字段,则判定当前报文包含报文载荷,对http报文进行解析直到报文头部结束标识后,解析出载荷长度值,以当前报文末尾序号为报文载荷起始序号,计算当前报文载荷的结束序号,完成当前http报文的边界计算;
81.若http报文头部包含chunked字段,判定当前报文的报文载荷为分段载荷方式,对http报文进行解析直到报文头部结束标识后,解析一行数据并获取每行数据的数据块的长度,计算当前数据块的结束序号,对整个http报文来说,取最后的数据块的结束序号作为当前报文载荷的结束序号;当数据块长度不为0时,表示后续还有数据块,继续循环执行本步骤;当数据块长度为0时,完成当前http报文的边界计算。
82.可选地,所述对报文会话判断过程中的tcp序号的大小进行判断,包括:
83.当tcp分片出现seq序号值跨过0xffffffff的情况时,封装一个tcpseq类,实现整形数值与tcpseq类的相互转换,并重载大于、小于判断函数,实现对tcp序号的比较判断;
84.当比较短时间内同一tcp流同向的两个tcp序号先后顺序时,先计算两个序号的差值并取绝对值,当两个序号的差值的绝对值大于0x80000000时,视为两个tcp序号出现溢出,此时将两个tcp序号以纯数值方式比较,得出结果并将结果取反即为最终比较结果。
85.可选地,所述方法还包括:
86.在解析http报文头部或解析数据块长度的过程中,如果因到达tcp帧结尾而读取不到一行完整数据,则将此行不完整数据加入待处理请求或响应缓存队列,并记录此行数据的起始序号与此tcp帧的结尾序号;
87.其中,所述tcp帧的结尾序号等于tcp帧序号 tcp携带的载荷大小。
88.可选地,所述http请求与响应的载荷报文匹配,包括:
89.在同一tcp流中遇到以http报文请求头部起始的tcp帧时,http报文请求头部起始的tcp帧中,报文载荷起始的若干字节内容为get/head/post/options/put/delete/trace/connect,该过程具体为:
90.当报文头部起始序号紧接tcp三握手的载荷结束序号时,检测载荷是否以http请求方法get/head/post/options/put/delete/trace/connect开头;若是则判断为http数据流并划分为第一个会话;若否则标记该tcp流为非http数据流,该tcp流后续帧不进行处理;
91.当报文头部起始序号大于最后http会话请求结尾序号,是超前报文,加入请求载荷乱序队列;
92.当报文头部起始序号等于最后http会话请求结尾序号,生成下一个http会话记录;
93.从后到前检索http会话表,根据边界序号判断所属http会话;
94.在同一tcp流中遇到以http报文响应头部起始的tcp帧时,http报文响应头部起始的tcp帧中,报文载荷起始的若干字节内容为http/1.1,或者http/1.0,或者http/0.9,该过程具体为:
95.当报文头部起始序号紧接tcp三握手的载荷结束序号时,划分为第一个会话;否则按下一步处理;
96.当报文头部起始序号大于最后http会话响应结尾序号,则确定为超前报文,将超前报文加入响应载荷乱序队列;否则按下一步处理;
97.从后到前检索http会话表,根据边界序号判断所属http会话;
98.遇到非http报文请求/响应头部起始的tcp帧,从后到前检索http会话表根据边界序号判断所属http会话;
99.如果tcp帧包含http报文请求/响应结尾且结尾后有剩余数据,将剩余数据部分按http报文头部进行处理。
100.可选地,所述http请求与响应的载荷报文匹配这一步骤中,http报文头部处理过程包括:
101.对http报文进行头部解析,确定报文边界序号;
102.如果报文头部数据不完整,则对报文头部进行分情况处理;
103.若处理后还有剩余数据,则将会话归属指向下一个会话记录,然后返回执行对http报文进行头部解析,确定报文边界序号的步骤,直至处理后没有剩余数据。
104.可选地,所述tcp中ack确认号的载荷报文匹配这一步骤中,tcp中ack确认报文是带ack标记、没有载荷的tcp报文,分上下行方向,上行报文的确认序号与本会话的响应序号范围对应;下行报文的确认序号与本会话的请求序号范围对应,该步骤具体包括:
105.当收到同一tcp流的上行/下行ack确认报文时,获取确认序号,判断是否大于tcp流中最后的http会话对应响应/请求序号范围,若大于则加入对应ack乱序队列;否则从后到前检索http会话表根据确认序号判断所属http会话;其中,ack乱序队列是一个按确认序号递增排列的有序队列;
106.当处理完一条本会话报文后,检查ack乱序队列是否空,如果非空,按以下过程处理:
107.当队列首节点的确认序号大于最后一个http会话对应载荷范围时,结束本次处理;否则按下一步处理;
108.从后到前检索http会话表,根据确认序号判断队列首节点所属http会话,移除该节点,重复调用本过程处理下一节点。
109.可选地,所述请求与响应的载荷乱序队列处理,包括:
110.针对请求/响应载荷乱序队列,当队列非空时,按以下过程处理:
111.当队列首节点载荷起始序号值与最后一个http会话待处理请求/响应缓存队列的结尾序号匹配,取出缓存数据并重组合并,进而继续按http报文头部进行处理;否则按下一步处理;
112.当队列首节点载荷起始序号大于最后一个http会话请求/响应载荷范围时,结束本次处理;否则按下一步处理;
113.从后到前检索http会话表,根据边界序号判断队列首节点所属http会话,移除该
节点,重复调用本过程处理下一节点。
114.本发明实施例的另一方面还提供了一种电子设备,包括处理器以及存储器;
115.所述存储器用于存储程序;
116.所述处理器执行所述程序实现如前面所述的方法。
117.本发明实施例还公开了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器可以从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行前面的方法。
118.下面结合说明书附图,对本发明的具体实现过程进行详细说明:
119.针对现有技术的问题,本发明介绍如何利用http载荷的边界序号,切分不同的会话,匹配请求与响应报文内容,实现对http数据流会话进行重组的方法。
120.http流是以一个tcp流为基础,在信令分析中以一组五元组确定一个唯一的tcp流。
121.当收到信令报文数据后首先以五元组关联到一个tcp流会话中,后续http请求与响应处理方法均以基于同一tcp流基础上进行处理。
122.http报文分为请求与响应两大类,对应tcp流中的上下行方向。一般的,从客户端发送到服务端的为请求报文,方向为上行流量;从服务端发送到客户端的为响应报文,方向为下行流量。
123.一个tcp-http流包含一个或多个http请求和响应报文。一个http会话对应一组http请求与响应报文。
124.每种报文内又可分为报文头部与报文载荷。
125.通常http报文载荷有两种方式,一种是整段载荷方式,以报文头部包含content-length:字段标识,通过此字段可以知道整个报文载荷的长度。另一种是分段载荷方式,以报文头部包含transfer-encoding:chunked为标识,此种方式的载荷长度位于报文载荷内,需要分段解析。
126.本方案包括[s1]http数据包边界序号确定、[s2]tcp序号大小判断、[s3]http报文头部分包情况处理、[s4]http请求与响应载荷报文匹配、[s5]tcp ack确认报文匹配、[s6]http请求/响应载荷乱序队列处理等主要技术方案步骤。
[0127]
本方案设计中一个唯一的五元组对应一个tcp会话信息,一个tcp会话信息可能对应一个或多个http会话记录。本方案整体流程图如图1所示:
[0128]
步骤1,收取一个tcp报文帧,以tcp帧的五元组为关键字进行映射表查找对应tcp会话信息,没有则创建新的tcp会话信息。
[0129]
步骤2,判断tcp帧是否包含http载荷,是则调用[s4]http请求与响应载荷报文匹配过程,否则调用[s5]tcp ack确认报文匹配过程。
[0130]
步骤3,调用[s6]请求/响应载荷乱序队列处理过程。
[0131]
各个主要方案步骤之间的逻辑关系如下:
[0132]
[s1]http数据包边界序号确定处理方法,用于确定本http报文的起止边界序号值,对应存入各http会话记录的请求开始序号、请求结束序号、响应开始序号、响应结束序号字段中。上述边界值字段用于[s4]、[s5]、[s6]步骤中判断会话归属的相关操作。
[0133]
[s2]tcp序号大小判断是基础处理方法,用于[s4]、[s5]、[s6]步骤中判断序号大小的具体操作。
[0134]
[s3]http报文头部分包情况处理,在http报文头部处理过程中处理报文头部不完整的情况,将不完整的头部行加入缓存;在[s6]步骤中判断序号匹配时取出使用。
[0135]
[s5]tcp ack确认报文匹配这个步骤是http数据流会话重组的一部分。http数据流指其传输上层内容为http协议的tcp数据流。
[0136]
信令分析的目的是将采集到的各个离散的数据帧按内在会话关系(五元组等)重新分组梳理,然后再将每组的所有消息各种内容进行统计,得出如流量(以ip层往上开始计算),包数,ack确认时延等话单信息。
[0137]
在信令分析这个场景下,以上话单信息字段需要将tcp ack确认报文纳入统计范围,所以http会话重组这个主题不仅需要处理包含http载荷的tcp帧,还需要处理不包含http载荷的tcp ack确认报文帧。
[0138]
下面从http数据包边界序号确定、tcp序号大小判断、http报文头部分包情况处理、http请求与响应载荷报文匹配、tcp ack确认报文匹配、http请求/响应载荷乱序队列处理等技术方案展开阐述。下面所描述的各个处理步骤只要彼此之间未构成冲突就可以组合交叉使用。
[0139]
s1、http数据包边界序号确定
[0140]
在同一五元组下传输http数据流过程中,当tcp连接建立成功后,首段tcp载荷为http报文头部。http报文头部为文本格式,以\r\n作为报文行结束标识,以空行作为报文头部结束标识。
[0141]
步骤1,记报文头部起始序号为head_begin,记报文头部末尾序号为head_end。
[0142]
步骤2,如果http报文头部包含content-length:内容长度字段,则当前报文包含报文载荷,解析到报文头部结束标识后,转到步骤3;如果http报文头部包含transfer-encoding:chunked字段,即报文载荷为分段载荷方式,解析到报文头部结束标识后,转到步骤4;否则按没有载荷处理。
[0143]
步骤3,解析出载荷长度值clen。以当前报文末尾序号head_end为报文载荷起始序号,计算当前报文载荷的结束序号payload_end=head_end clen。当前http报文边界计算完成。
[0144]
步骤4,解析一行数据,以\r\n作为行结束标识,标记结束序号为chunk_begin,获取数据块的长度chunk_size,计算当前数据块的结束序号chunk_end=chunk_begin chunk_size 2。对整个http报文来说,取最后的数据块结束序号chunk_end值作为当前报文载荷的结束序号payload_end。当数据块长度不为0时,表示后续还有数据块,继续循环执行本步骤;当数据块长度为0时,表示此数据块后结束整个http报文,当前http报文边界计算完成。
[0145]
整段载荷方式报文样例图如图2所示,分段载荷方式报文样例图如图3所示,普通数据块报文样例图如图4所示,结束数据块报文样例图如图5所示。
[0146]
s2、tcp序号大小判断
[0147]
在报文会话判断过程中,经常需要进行tcp序号大小判断,以确定tcp分片间的相对位置。由于tcp协议规定tcp序号值使用4个字节表示,而第一个报文的序号值为随机生
成,所以后续传输tcp分片可能出现seq序号值跨过0xffffffff的情况。当出现这种溢出情况时,我们不能简单使用纯数值的大小比较方法,为此我们封装一个tcpseq类,实现整形数值与tcpseq类的相互转换方法,并重载大于、小于判断函数,实现对tcp序号的比较判断。
[0148]
鉴于单个tcp流中极少出现短时间内连续传输数据大于2gbytes的情况,所以当比较短时间内同一tcp流同向的两个tcp序号先后顺序时,先计算两个序号的差值并取绝对值,当其绝对差值大于0x80000000(2gbytes),视为两个tcp序号出现溢出,此时将两个tcp序号以纯数值方式比较,得出结果并将结果取反即为最终比较结果。
[0149]
当其绝对差值不大于0x80000000,将两个tcp序号以纯数值方式比较,结果即为最终比较结果。
[0150]
一种乱序判断样例如图6所示,报文1序号seq1为0xffffffe4,报文2序号seq2为0xffffffd9,报文3序号seq3为0x27。
[0151]
报文1、2序号比较:计算差值seq1-seq2=11,单纯比较值seq1》seq2,因为其绝对值小于0x80000000,所以综合比较结果报文1》报文2。
[0152]
报文1、3序号比较:计算差值seq1-seq3=4294967229,单纯比较值seq1》seq3,因为绝对值大于0x80000000,所以综合比较结果为报文1《报文3。
[0153]
s3、http报文头部分包情况处理
[0154]
针对载荷报文,逐行解析头部内容,若报文头部后面包含载荷,按边界序号进行判断,跳过载荷解析。在解析http报文头部,或数据块长度过程中,如果因到达tcp帧结尾而读取不到一行完整数据,则将此行不完整数据加入待处理请求或响应缓存队列,并记录此行数据的起始序号与此tcp帧的结尾序号(即tcp帧序号 tcp携带的载荷大小)。
[0155]
s4、http请求与响应载荷报文匹配,本处理过程总流程图如图7所示。
[0156]
其中,http报文头部处理过程流程图如图8所示。
[0157]
http报文请求头部起始的tcp帧,报文载荷起始的若干字节内容为get/head/post/options/put/delete/trace/connect等。
[0158]
在同一tcp流中遇到以http报文请求头部起始的tcp帧时,使用以下过程:
[0159]
当报文头部起始序号紧接tcp三握手[syn]帧的载荷结束序号时,检测其载荷是否以http请求方法get/head/post/options/put/delete/trace/connect开头。是则判断为http数据流并划分为第一个会话;否则标记该tcp流为非http数据流,该tcp流后续帧不进行处理。
[0160]
当报文头部起始序号大于最后http会话请求结尾序号,是超前报文,加入请求载荷乱序队列。
[0161]
当报文头部起始序号等于最后http会话请求结尾序号,生成下一个http会话记录。
[0162]
从后到前检索http会话表,根据边界序号判断所属http会话。
[0163]
http报文响应头部起始的tcp帧,报文载荷起始的若干字节内容为http/1.1,或者http/1.0,或者http/0.9。例如http/1.1 200ok\r\n、http/1.1 206partial content\r\n等。
[0164]
在同一tcp流中遇到以http报文响应头部起始的tcp帧时,使用以下过程:
[0165]
当报文头部起始序号紧接tcp三握手[syn ack]帧的载荷结束序号时,划分为第一
个会话;否则按下一步处理。
[0166]
当报文头部起始序号大于最后http会话响应结尾序号,是超前报文,加入响应载荷乱序队列;否则按下一步处理。
[0167]
从后到前检索http会话表,根据边界序号判断所属http会话。
[0168]
遇到非http报文请求/响应头部起始的tcp帧,从后到前检索http会话表根据边界序号判断所属http会话。
[0169]
如果tcp帧包含http报文请求/响应结尾且结尾后有剩余数据,将剩余数据部分按http报文头部进行处理。
[0170]
s5、tcp ack确认报文匹配
[0171]
tcp ack确认报文特征是带ack标记、没有载荷的tcp报文,分上下行方向,上行报文的确认序号与本会话的响应序号范围对应;下行报文的确认序号与本会话的请求序号范围对应。
[0172]
当收到同一tcp流的上行/下行ack确认报文时,获取确认序号,判断是否大于tcp流中最后的http会话对应响应/请求序号范围。大于则加入对应ack乱序队列;否则从后到前检索http会话表根据确认序号判断所属http会话。
[0173]
ack乱序队列是一个按确认序号递增排列的有序队列。
[0174]
当处理完一条本会话报文后,检查ack乱序队列是否空,如果非空,按以下过程处理:
[0175]
当队列首节点的确认序号大于最后一个http会话对应载荷范围时,结束本次处理;否则按下一步处理。
[0176]
从后到前检索http会话表,根据确认序号判断队列首节点所属http会话,移除该节点,重复调用本过程处理下一节点。
[0177]
s6、请求/响应载荷乱序队列处理
[0178]
针对请求/响应载荷乱序队列,当队列非空时,按以下过程处理:
[0179]
当队列首节点载荷起始序号值与最后一个http会话待处理请求/响应缓存队列的结尾序号匹配,取出缓存数据并重组合并,进而继续按http报文头部进行处理;否则按下一步处理。
[0180]
当队列首节点载荷起始序号大于最后一个http会话请求/响应载荷范围时,结束本次处理;否则按下一步处理。
[0181]
从后到前检索http会话表,根据边界序号判断队列首节点所属http会话,移除该节点,重复调用本过程处理下一节点。
[0182]
图9是一个粘包样例,1个tcp帧中包含4个http报文的。在处理完第一个报文后,判断head_end1《frame_end1,继续将head_end1至frame_end1的数据进行处理。
[0183]
图10是一个分片包样例,两个http报文分布在3个tcp帧中。
[0184]
其中报文1的载荷前半部分位于tcp帧1,后半部分位于tcp帧2。
[0185]
从报文1头部解析出载荷长度并算出载荷结束序号payload_end1。
[0186]
报文2的信息头前半部分位于tcp帧2,后半部分位于tcp帧3。
[0187]
根据payload_end1即head_begin2,定位出报文2的头部起始位置并开始逐行解析。当解析到[content]遇到tcp分片结束,将[content]加入待处理缓存队列,记录分片的
结束序号frame_end2。
[0188]
当tcp帧3到达时,判断frame_begin3等于frame_end2,取出缓存数据与tcp帧3的载荷数据,重组合并成完整一行数据[content-length:510\r\n],继续进行报文头部解析。
[0189]
图11是一个http请求响应报文关联样例。
[0190]
如图11所示:第1个上行tcp帧到达,解析出http请求1,创建http会话1。
[0191]
第1个下行tcp帧到达,解析响应1头部得出响应1载荷结束序号dn_seq5,会话1的响应报文位于下行第1、2个tcp帧中。
[0192]
第2个上行tcp帧到达,此时会话1的响应报文传输未完成,客户端发起第2、3个get请求,对应创建http会话2、3。
[0193]
第2个下行tcp帧到达,此时判断序号可知dn_seq5位于当前帧内,即存在粘包情况。对dn_seq5之前的数据划分进会话1,对dn_seq5开始的数据进行头部解析及划分进会话2。解析完响应2头部可得出响应2载荷结束序号dn_seq11。
[0194]
关于乱序情况,如下行第4、5帧所示,其均属于载荷部分,若第5帧先于第4帧到达,此时仍可按边界序号判断其属于会话2,不需要加入乱序队列进行缓存,减轻复制内存块导致的系统开销,节省内存使用,加快系统处理速度。
[0195]
第6个下行tcp帧到达,查找会话表得知其不属于会话1、2序号范围,且会话3没有设置响应序号范围值,固将其划分至会话3。
[0196]
综上所述,本发明具有以下特点:
[0197]
1、http载荷边界确定方法。根据http应用层的报文特征,确定每个http请求或响应数据的边界序号,同时解决现有技术对chunk模式载荷编码判断不准的问题。
[0198]
2、http请求与对应响应包的匹配算法。本方案实现了以边界序号对http报文进行拆解,再进行重组会话划分的处理,解决现有技术不能准确处理http粘包报文会话划分的问题。
[0199]
3、tcp序号溢出情况的序号判断处理方法,本方案通过封装一个tcp序号类型结构,判断当两值接近序号最大值附近时则认为出现seq溢出,从而反转比较结果,否则按正常方式比较大小。而不需要按现有技术中提及对每个序号均作偏移变换,适应本方案的乱序报文处理,简化序号大小判断逻辑,提高系统运行效率。
[0200]
相较于现有技术,本发明具有以下优点:
[0201]
本发明提出http请求与对应响应包的匹配算法,以http载荷为单位的边界序号对报文数据进行拆解重组,而非仅以tcp报文帧的ack序号来划分会话,解决现有技术不能准确处理http粘包报文会话划分的问题。
[0202]
本发明支持乱序报文处理,通过边界序号范围判断的方法,仅当乱序的报文包含http头部的情况下才需要缓存数据片段,而当http数据载荷中出来乱序报文时不需要缓存,能减少系统的内存占用与复制开销,提升系统性能,适应信令分析系统中仅需要对http报文头部进行解析处理的场景。
[0203]
本发明提出tcp序号溢出情况的序号判断处理方法,通过判断两值是否接近溢出临界区,来作对应处理,而非将所有报文的序号均作偏移变换,简化了序号大小判断逻辑,提升溢出情况的处理效率。
[0204]
在一些可选择的实施例中,在方框图中提到的功能/操作可以不按照操作示图提
到的顺序发生。例如,取决于所涉及的功能/操作,连续示出的两个方框实际上可以被大体上同时地执行或所述方框有时能以相反顺序被执行。此外,在本发明的流程图中所呈现和描述的实施例以示例的方式被提供,目的在于提供对技术更全面的理解。所公开的方法不限于本文所呈现的操作和逻辑流程。可选择的实施例是可预期的,其中各种操作的顺序被改变以及其中被描述为较大操作的一部分的子操作被独立地执行。
[0205]
此外,虽然在功能性模块的背景下描述了本发明,但应当理解的是,除非另有相反说明,所述的功能和/或特征中的一个或多个可以被集成在单个物理装置和/或软件模块中,或者一个或多个功能和/或特征可以在单独的物理装置或软件模块中被实现。还可以理解的是,有关每个模块的实际实现的详细讨论对于理解本发明是不必要的。更确切地说,考虑到在本文中公开的装置中各种功能模块的属性、功能和内部关系的情况下,在工程师的常规技术内将会了解该模块的实际实现。因此,本领域技术人员运用普通技术就能够在无需过度试验的情况下实现在权利要求书中所阐明的本发明。还可以理解的是,所公开的特定概念仅仅是说明性的,并不意在限制本发明的范围,本发明的范围由所附权利要求书及其等同方案的全部范围来决定。
[0206]
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0207]
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。
[0208]
计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置)、便携式计算机盘盒(磁装置)、随机存取存储器(ram)、只读存储器(rom)、可擦除可编辑只读存储器(eprom或闪速存储器)、光纤装置以及便携式光盘只读存储器(cdrom)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
[0209]
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(pga),现场
可编程门阵列(fpga)等。
[0210]
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0211]
尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。
[0212]
以上是对本发明的较佳实施进行了具体说明,但本发明并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本技术权利要求所限定的范围内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献