一种spdy协议代理方法及代理系统的制作方法

文档序号:7817133阅读:264来源:国知局
一种spdy协议代理方法及代理系统的制作方法
【专利摘要】本发明提供了一种SPDY代理方法及代理系统;所述方法包括:从客户端接收SPDY请求,如果为SYN_STREAM类型的控制帧,则解析生成HTTP请求头;如果为数据帧,则解析生成HTTP请求体;将生成的HTTP请求头和请求体发给HTTP服务器;当从所述HTTP服务器收到与SPDY请求相应的HTTP回应时,解析HTTP回应头,生成SYN_REPLY类型的控制帧;解析HTTP回应体,生成SPDY数据帧;将所生成的SYN_REPLY类型的控制帧和SPDY数据帧发回给客户端。本发明能够在不改变HTTP服务器任何配置的情况下,为HTTP服务器增加支持SPDY协议的功能,并且不会降低对正常业务的处理能力。
【专利说明】一种SPDY协议代理方法及代理系统

【技术领域】
[0001]本发明涉及网络领域,尤其涉及一种SPDY协议代理方法及代理系统。

【背景技术】
[0002]SPDY是谷歌开发的一种新的网络协议,SPDY并不是一种被设计用于替代HTTP (超文本传送)的协议,而是对HTTP协议的增强。SPDY增加了一个帧层用于包装HTTP协议。这个帧层为HTTP的请求响应流进行了优化,重新组织了 HTTP协议的结构,并增加了一些机制,实现流复用、请求优先级、HTTP头压缩;能够提升网络速度,最小化网络延迟,优化用户的网络使用体验。
[0003]随着支持SPDY协议的客户端越来越普及,HTTP服务器迫切需要支持SPDY协议来提高页面的加载速度、改善用户体验。
[0004]目前要给HTTP服务器添加SPDY协议的支持,需要在服务器上安装相应的插件或者模块,比如Apache服务器需要安装mod_spdy插件,来支持SPDY协议;Nginx则需要在编译时加入SPDY模块,并重新打包。
[0005]当前的技术方案有以下缺陷:
[0006]一、需要在服务器上直接进行升级和配置的更改,步骤繁琐,专业性要求高。在升级的过程中会丢失部分功能,影响业务的正常运行。
[0007]二、可用的SPDY插件和模块只在一部分HTTP服务器软件的高版本上进行升级,老版本的HTTP服务器软件和非主流的HTTP服务器软件将无法通过升级插件的方式获得SPDY的支持。
[0008]三、在HTTP服务器上安装了 SPDY插件后,所有SPDY的解析、压缩等等操作会在服务器上进行,占用了服务器的计算资源,影响了服务器正常业务的处理速度。


【发明内容】

[0009]本发明要解决的技术问题是如何在不改变HTTP服务器任何配置的情况下,为HTTP服务器增加支持SPDY协议的功能,并且不会降低HTTP服务器对正常业务的处理能力。
[0010]为了解决上述问题,本发明提供了一种SPDY代理方法,包括:
[0011]从客户端接收SPDY请求,如果该SPDY请求为SYN_STREAM类型的控制帧,则解析该SYN_STREAM类型的控制帧,生成HTTP请求头;如果该SPDY请求为数据帧,则解析该数据帧,生成HTTP请求体;将生成的HTTP请求头和请求体发给HTTP服务器;
[0012]当从所述HTTP服务器收到与SPDY请求相应的HTTP回应时,解析HTTP回应头,生成SYN_REPLY类型的控制帧;解析HTTP回应体,生成SPDY数据帧;将所生成的SYN_REPLY类型的控制帧和SPDY数据帧发回给客户端。
[0013]可选地,所述从客户端接收SPDY请求的步骤前还包括:
[0014]与所述客户端建立安全传输层协议TLS连接时,在协议协商NPN字符串中加入SPDY版本号;
[0015]当所述客户端的回应中携带SPDY版本号时,进行所述从客户端接收SPDY请求的步骤。
[0016]可选地,所述解析SYN_STREAM类型的控制帧,生成HTTP请求头的步骤后还包括:
[0017]解析SYN_STREAM类型的控制帧的3个优先级标记位,得到3个二进制数值组成的序列,将所生成的HTTP请求头和所述控制帧对应放入所述序列对应的优先级队列中;
[0018]所述将生成的HTTP请求头发给HTTP服务器的步骤中,按照从高优先级到低优先级的顺序从优先级队列中取出HTTP请求头和对应的控制帧发送给所述HTTP服务器。
[0019]可选地,所述解析SYN_STREAM类型的控制帧,生成HTTP请求头的步骤包括:
[0020]对于SYN_STREAM类型的控制帧,用zlib解压该控制帧的SPDY头域块,提取头域名字为“:method”、“:path”、“:vers1n”的头域的值,拼接组成HTTP请求头的第一行;把提取的其它SPDY头域块中的头域,写成[头域名]:[头域值]的格式,作为HTTP头域,每行写一个头域,添加Connect1n:keep_alive头域。
[0021]可选地,生成HTTP请求头的步骤后,将生成的HTTP请求头发给HTTP服务器的步骤前还包括:
[0022]将从所述SYN_STREAM类型的控制帧中解析出的流ID和所生成的HTTP请求头相对应;
[0023]检查SPDY到HTTP的服务器的连接池是否有空闲的TCP连接,如果没有且连接池中的连接数未超过预设阈值,则新建一条TCP连接加入所述连接池并标记为空闲后取出;如果有则取出一条空闲的TCP连接;
[0024]将生成的HTTP请求头发给HTTP服务器的步骤包括:
[0025]将所生成的HTTP请求头和对应的控制帧通过所取出的TCP连接发给HTTP服务器,将该HTTP请求头对应的流ID与该条TCP连接的编号对应保存;将该条TCP连接标记为非空闲;
[0026]将生成的HTTP请求体发给HTTP服务器的步骤包括:
[0027]根据从SPDY数据帧中解析出的流ID找到对应的TCP连接的编号;用该编号代表的TCP连接发送所生成的HTTP请求体给HTTP服务器。
[0028]可选地,所述解析HTTP回应头,生成SYN_REPLY类型的控制帧的步骤包括:
[0029]根据当前的TCP连接的编号得到对应的流ID ;
[0030]将HTTP回应头中的第一行状态码作为“:status”头域JEHTTP回应头中每行HTTP头域的“:”去掉,“:”前后分别为头域的名字和头域的值;头域的名字前加入用4个字节表示的头域名字长度,在头域的值前加入用4个字节表示的头域的值长度;在最终的头域块前加上4个字节表示的头域块的数量,组成SYN_REPLY类型的控制帧SPDY头域块;
[0031]用z Iib把生成的SPDY头域块进行压缩,然后拼接上8个字节的SPDY控制帧头和4个字节的所得到的流ID ;所述SPDY控制帧头中,前4个字节为0x80、0x03、0x00、0x02 ;压缩后的SPDY头域块长度加4作为帧长度写入第6到8个字节,如果所述HTTP回应头后不包含回应体,那么第5个字节写入0x01表示回应结束。
[0032]可选地,所述解析HTTP回应体,生成SPDY数据帧的步骤包括:
[0033]解析HTTP回应体,如果是chunk编码,把chunk头去掉;在所述HTTP回应体前面加上8个字节的数据帧头,前4个字节写入流ID,第6到8个字节写入HTTP回应体的长度;如果是本HTTP回应中的最后一块HTTP回应体,则把第5个字节写成0x01。
[0034]可选地,所述方法还包括:
[0035]当所接收的SPDY请求为PING类型的控制帧时,直接把原始帧回应给客户端;
[0036]当所接收的SPDY请求为RST_STREAM类型的控制帧时,根据解析得到的流ID清除对应的记录,并关闭对应的TCP连接。
[0037]本发明还提供了一种SPDY代理系统,包括:
[0038]第一生成模块,用于从客户端接收SPDY请求,如果该SPDY请求为SYN_STREAM类型的控制帧,则解析该SYN_STREAM类型的控制帧,生成HTTP请求头;如果该SPDY请求为数据帧,则解析该数据帧,生成HTTP请求体;将生成的HTTP请求头和请求体发给HTTP服务器;
[0039]第二生成模块,用于当从所述HTTP服务器收到与SPDY请求相应的HTTP回应时,解析HTTP回应头,生成SYN_REPLY类型的控制帧;解析HTTP回应体,生成SPDY数据帧;将所生成的SYN_REPLY类型的控制帧和SPDY数据帧发回给客户端。
[0040]可选地,所述第一生成模块还用于在与所述客户端建立安全传输层协议TLS连接时,在协议协商NPN字符串中加入SPDY版本号;当所述客户端的回应中携带SPDY版本号时,进行所述从客户端接收SPDY请求的操作。
[0041]可选地,所述第一生成模块还用于解析SYN_STREAM类型的控制帧的3个优先级标记位,得到3个二进制数值组成的序列,将所生成的HTTP请求头和和所述控制帧对应放入所述序列对应的优先级队列中;将生成的HTTP请求头发给HTTP服务器时,按照从高优先级到低优先级的顺序从优先级队列中取出HTTP请求头对应的控制帧发送给所述HTTP服务器。
[0042]可选地,所述第一生成模块解析SYN_STREAM类型的控制帧,生成HTTP请求头是指:
[0043]所述第一生成模块对于SYN_STREAM类型的控制帧,用zlib解压该控制帧的SPDY头域块,提取头域名字为“:method”、“:path”、“:vers1n”的头域的值,拼接组成HTTP请求头的第一行;把提取的其它SPDY头域块中的头域,写成[头域名]:[头域值]的格式,作为HTTP头域,每行写一个头域,添加Connect1n:keep_alive头域。
[0044]可选地,所述第一生成模块还用于在将生成的HTTP请求头发给HTTP服务器前,将从所述SYN_STREAM类型的控制帧中解析出的流ID和所生成的HTTP请求头相对应;检查SPDY到HTTP的服务器的连接池是否有空闲的TCP连接,如果没有且连接池中的连接数未超过预设阈值,则新建一条TCP连接加入所述连接池并标记为空闲后取出;如果有则取出一条空闲的TCP连接;
[0045]所述第一生成模块将生成的HTTP请求头发给HTTP服务器是指:
[0046]所述第一生成模块将所生成的HTTP请求头和对应的控制帧通过所取出的TCP连接发给HTTP服务器,将该HTTP请求头对应的流ID与该条TCP连接的编号对应保存;将该条TCP连接标记为非空闲;
[0047]所述第一生成模块将生成的HTTP请求体发给HTTP服务器是指:
[0048]所述第一生成模块根据从SPDY数据帧中解析出的流ID找到对应的TCP连接的编号;用该编号代表的TCP连接发送所生成的HTTP请求体给HTTP服务器。
[0049]可选地,所述第二生成模块解析HTTP回应头,生成SYN_REPLY类型的控制帧是指:
[0050]所述第二生成模块根据当前的TCP连接的编号得到对应的流ID ;将HTTP回应头中的第一行状态码作为”:status”头域JEHTTP回应头中每行HTTP头域的“:”去掉,“:”前后分别为头域的名字和头域的值;头域的名字前加入用4个字节表示的头域名字长度,在头域的值前加入用4个字节表示的头域的值长度;在最终的头域块前加上4个字节表示的头域块的数量,组成SYN_REPLY类型的控制帧SPDY头域块;用zlib把生成的SPDY头域块进行压缩,然后拼接上8个字节的SPDY控制帧头和4个字节的所得到的流ID ;所述SPDY控制帧头中,前4个字节为0x80、0x03、0x00,0x02 ;压缩后的SPDY头域块长度加4作为帧长度写入第6到8个字节,如果所述HTTP回应头后不包含回应体,那么第5个字节写入0x01表示回应结束。
[0051]可选地,所述第二生成模块解析HTTP回应体,生成SPDY数据帧是指:
[0052]所述第二生成模块解析HTTP回应体,如果是chunk编码,把chunk头去掉;在所述HTTP回应体前面加上8个字节的数据帧头,前4个字节写入流ID,第6到8个字节写入HTTP回应体的长度;如果是本HTTP回应中的最后一块HTTP回应体,则把第5个字节写成0x01 ο
[0053]可选地,所述第一生成模块还用于当所接收的SPDY请求为PING类型的控制帧时,直接把原始帧回应给客户端;当所接收的SPDY请求为RST_STREAM类型的控制帧时,根据解析得到的流ID清除对应的记录,并关闭对应的TCP连接。
[0054]本发明能使HTTP服务器获得SPDY协议的多路复用功能、请求优先级处理功能、头压缩功能,不需要对HTTP服务器做任何改变,而且支持所有的HTTP服务器版本。同时避免SPDY转换HTTP协议中连接数暴增的问题,不会给服务器增加CPU负担,所有处理在代理服务器上进行,对服务器透明。

【专利附图】

【附图说明】
[0055]图1是使用环境示意图;
[0056]图2是实施例一中SPDY转换HTTP主要流程;
[0057]图3a是请求方向的流程示意图;
[0058]图3b是图3a中SPDY请求为数据帧时的流程示意图;
[0059]图4是SPDY解析流程示意图;
[0060]图5是接收HTTP回应流程示意图;
[0061]图6是解析HTTP回应转换为SPDY回应流程示意图。

【具体实施方式】
[0062]下面将结合附图及实施例对本发明的技术方案进行更详细的说明。
[0063]需要说明的是,如果不冲突,本发明实施例以及实施例中的各个特征可以相互结合,均在本发明的保护范围之内。另外,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0064]首先对本文中出现的概念定义如下:
[0065]流ID(Stream-1D):SH)Y中唯一标记一条流的编号,31位的整数。
[0066]TCP连接的编号:唯一标记了一条TCP连接,通常用socket号。
[0067]SPDYsess1n表:记录了一个客户端的SPDY中流的信息,每个客户端的对应一个SPDYsess1n表,表中的每一个记录,包含SPDY的流ID(Stream-1D)和TCP连接号。
[0068]控制帧(control frame) =SPDY帧的一种,主要存放头信息,流控信息(流ID),标记位第一位为I。
[0069]数据帧(data frame) =SPDY帧的一种,存放体数据;其中也包括流ID,该流ID和相应的SYN_STREAM类型的控制帧的流ID相同。
[0070]优先级队列:根据SPDY的SYN_STREAM类型的控制帧中的3个优先级标记位设立8个优先级队列,分别对应优先级O到7,代表优先级从高到低。队列每一项包含了流ID、原始帧和解析后生成的HTTP请求。
[0071]SPDY到HTTP的服务器连接池:预先和服务器建立的连接,每个SPDY解析的HTTP请求发出,服务器回应后,连接不断开,而是放入连接池,等待下一个SPDY转换的HTTP请求。
[0072]SPDY头域块:表示解压后的SPDY头域,格式是,前4个字节表示头域个数,后面跟着对应个数的头域,每个头域包含了 4部分,分别是4个字节的头域名字长度、头域名字、4个字节的头域值长度、头域值。
[0073]实施例一、一种SPDY代理方法,包括:
[0074]从客户端接收SPDY请求,如果该SPDY请求为SYN_STREAM类型的控制帧,则解析该SYN_STREAM类型的控制帧,生成HTTP请求头;如果该SPDY请求为数据帧,则解析该数据帧,生成HTTP请求体;将生成的HTTP请求头和请求体发给HTTP服务器;
[0075]当从所述HTTP服务器收到与SPDY请求相应的HTTP回应时,解析HTTP回应头,生成SYN_REPLY类型的控制帧;解析HTTP回应体,生成SPDY数据帧;将所生成的SYN_REPLY类型的控制帧和SPDY数据帧发回给客户端。
[0076]本实施例提出了一种SPDY代理的模式,能够使任意HTTP服务器都能都方便的支持SPDY协议,同时不降低HTTP服务器对正常业务的处理能力。
[0077]本实施例的一种实施方式中,所述从客户端接收SPDY请求的步骤前还可以包括:
[0078]与所述客户端建立TLS (安全传输层协议)连接时,在NPN (Next ProtocolNegotiat1n,协议协商)字符串中加入SPDY版本号;
[0079]当所述客户端的回应中携带SPDY版本号时,进行所述从客户端接收SPDY请求的步骤。
[0080]本实施方式在NPN协商字符串中加入SPDY版本号(比如“spdy3”),来使得客户端用SPDY协议发送请求。通过检查客户端回应的NPN协商字符串中有无“spdy3”判断客户端是否以SPDY协议通信。
[0081 ] 本实施例的一种实施方式中,所述解析SYN_STREAM类型的控制帧,生成HTTP请求头的步骤具体可以包括:
[0082]对于SYN_STREAM类型的控制帧,用zlib解压该控制帧的SPDY头域块,提取头域名字为“:method”、“:path”、“:vers1n”的头域的值,拼接组成HTTP请求头的第一行;把提取的其它SPDY头域块中的头域,写成[头域名]:[头域值]的格式,作为HTTP头域,每行写一个头域,添加Connect1n:keep_alive头域。
[0083]本实施例的一种实施方式中,所述解析SYN_STREAM类型的控制帧,生成HTTP请求头的步骤后还可以包括:
[0084]解析SYN_STREAM类型的控制帧的3个优先级标记位,得到3个二进制数值组成的序列,将所生成的HTTP请求头和所述控制帧对应放入所述序列对应的优先级队列中;
[0085]所述将生成的HTTP请求头发给HTTP服务器的步骤中,按照从高优先级到低优先级的顺序从优先级队列中取出HTTP请求头及对应的控制帧发送给所述HTTP服务器。
[0086]本实施方式中,采用8个优先级队列和SPDY的3个优先级标记位的值相对应,实现高优先级请求优先处理。3个优先级标记位的值各取“O”或“1”,所组成的二进制序列共有8种(000、001、010、011、100、101、110、111),与8个优先级队列正好——对应。
[0087]本实施例的一种实施方式中,生成HTTP请求头的步骤后,将生成的HTTP请求头发给HTTP服务器的步骤前还可以包括:
[0088]将从所述SYN_STREAM类型的控制帧中解析出的流ID和所生成的HTTP请求头相对应;
[0089]检查SPDY到HTTP的服务器的连接池是否有空闲的TCP连接,如果没有且连接池中的连接数未超过预设阈值,则新建一条TCP连接加入所述连接池并标记为空闲后取出;如果有则取出一条空闲的TCP连接;
[0090]将生成的HTTP请求头发给HTTP服务器的步骤具体可以包括:
[0091]将所生成的HTTP请求头和对应的控制帧通过所取出的TCP连接发给HTTP服务器,将该HTTP请求头对应的流ID与该条TCP连接的编号对应保存;将该条TCP连接标记为非空闲;
[0092]将生成的HTTP请求体发给HTTP服务器的步骤具体可以包括:
[0093]根据从SPDY数据帧中解析出的流ID找到对应的TCP连接的编号;用该编号代表的TCP连接发送所生成的HTTP请求体给HTTP服务器。
[0094]其中,所述流ID和TCP连接的编号可以但不限于对应保存在SPDYsess1n表中;根据流ID可以在SPDYsess1n表中找到对应的TCP连接的编号。
[0095]考虑到SPDY协议中支持大量请求同时过来,本实施方式中用专门给SPDY协议开辟的连接池存储SPDY对应的HTTP连接,通过把SPDY流和HTTP请求做关联的方式实现SPDY流复用服务器端的连接,防止出现TCP连接数暴增的现象。
[0096]本实施例的一种实施方式中,所述解析HTTP回应头,生成SYN_REPLY类型的控制帧的步骤具体可以包括:
[0097]根据当前的TCP连接的编号得到对应的流ID;可以但不限于通过查询SPDYsess1n 表得到;
[0098]将HTTP回应头中的第一行状态码作为“:status”头域JEHTTP回应头中每行HTTP头域的“:”去掉(“:”前后分别为头域的名字和头域的值),头域的名字前加入用4个字节表示的头域名字长度,在头域的值前加入用4个字节表示的头域的值长度;在最终的头域块前加上4个字节表示的头域块的数量,组成SYN_REPLY类型的控制帧SPDY头域块;
[0099]用z Iib把生成的SPDY头域块进行压缩,然后拼接上8个字节的SPDY控制帧头和4个字节的所得到的流ID ;所述SPDY控制帧头中,前4个字节为0x80、0x03、0x00、0x02 ;压缩后的SPDY头域块长度加4作为帧长度写入第6到8个字节,如果所述HTTP回应头后不包含回应体,那么第5个字节写入0x01表示回应结束。
[0100]本实施例的一种实施方式中,所述解析HTTP回应体,生成SPDY数据帧的步骤具体可以包括:
[0101]解析HTTP回应体,如果是chunk编码,把chunk头去掉;在所述HTTP回应体前面加上8个字节的数据帧头,前4个字节写入流ID,第6到8个字节写入HTTP回应体的长度;如果是本HTTP回应中的最后一块HTTP回应体,则把第5个字节写成0x01。
[0102]本实施方式中,根据长度达到content-length或者遇到了最后一个HTTP chunk编码尾标记来确定是最后一块HTTP回应体。
[0103]本实施例的一种实施方式中,所述方法还可以包括:
[0104]当所接收的SPDY请求为PING类型的控制帧时,直接把原始帧回应给客户端;
[0105]当所接收的SPDY请求为RST_STREAM类型的控制帧时,根据解析得到的流ID清除对应的记录(如果保存在SPDYsess1n表中,则从SPDYsess1n表中清除),并关闭对应的TCP连接。
[0106]本实施例的代理方法可以但不限于部署在HTTP服务器前端的SPDY代理服务器中,如图1所示,采用SPDY协议的客户端和SPDY代理服务器之间通过SPDY协议交互,SPDY代理服务器将客户端的请求转换为HTTP请求发送给HTTP服务器,将收到的HTTP回应转换为SPDY回应后反馈给客户端。当然,在需要时,所述代理方法也可以部署在其它现存设备中。
[0107]下面用一个具体的例子来说明本实施例,该例子中采用SPDY代理服务器实现本实施例的代理方法。
[0108]首先,代理服务器与客户端建立TLS(安全套接层ssl)连接的时候,改写服务端TLS连接的NPN协商字符串,在其中加入SPDY版本号,如果客户端回应中有SPDY版本号,那么进入如图2所示的流程,包括步骤201到203。
[0109]201、收到SPDY的控制帧和数据帧,解析SPDY控制帧和数据帧,重组HTTP格式的请求,发送给HTTP服务器。
[0110]202、接收HTTP服务器的回应。
[0111]203、解析HTTP回应头和回应体,重组SPDY格式回应,发给客户端。
[0112]客户端请求方向流程如图3a和图3b所示,包括步骤301到317。
[0113]301、接收客户端的SPDY数据,放入缓存。
[0114]302、检测缓存中第一个帧是否完整,如果完整则进行304,不完整则进行303。
[0115]303、检查优先级队列中是否有要处理的请求,如果有则进行310 ;没有则回到301。
[0116]304、解析帧,根据帧的第一位判断帧类型;帧的第一位如果是是1,判断是控制帧(control frame),进入步骤305,开始控制巾贞(control frame)处理流程分支;巾贞的第一位如果是O,进入图3b所示的数据巾贞(data frame)处理流程分支。
[0117]305、根据Type字段判断控制帧类型,如果是RST_STREAM则进入308,开始SPDY解析的分支;如果是RST_STREAM则进入306 ;如果是PING则进入307。
[0118]306、根据解析的流ID查询SPDYsess1n表,把表中查出的该流ID对应的编号所代表的TCP连接断开,同时在SPDYsess1n表中删除该流ID所在表项,SPDY请求处理结束。
[0119]307、立即把这个帧完整回应给客户端,SPDY请求处理结束。
[0120]308、解析出流ID、优先级、SPDY头域,生成HTTP请求头。
[0121]309、根据优先级标识位解析出的优先级,把HTTP请求头和包含流ID的原始的控制帧作为一对,放入相应的优先级队列。接下来进入SPDY建流的过程。
[0122]310、从高到低查找优先级队列,直到找到一个要处理的HTTP请求,进行311。
[0123]311、首先检查SPDY到HTTP的服务器连接池是否有空闲的TCP连接,若有空闲的TCP连接就进行314 ;若连接池没有空闲的TCP连接,进行312 ;
[0124]312、检查连接数有没有超过提前设定的阈值,如果没超过,进行313 ;如果超过则SPDY请求处理结束。
[0125]313、新建一条TCP连接加入连接池并标记为空闲,进行314。
[0126]314、取出一条空闲的TCP连接,取出步骤310中从优先级队列中找到的HTTP请求,将该HTTP请求对应的流ID(Stream-1D)和所取出的TCP连接的编号相对应保存进SroYsess1n表中,并将HTTP请求及对应的控制帧用这条TCP连接发送出去,将这条连接标记为非空闲。SPDY请求处理结束。
[0127]数据帧处理流程分支如图3b所示,包括步骤315到317。
[0128]315、解析Length字段,根据Length字段,把数据帧中内容提取出来,构成HTTP请求体。
[0129]316、解析流ID,在SPDYsess1n表中查找对应的TCP连接的编号。
[0130]317、把HTTP请求体用查找到的TCP连接的编号所代表的TCP连接发送出去,STOY请求处理结束。
[0131]上述步骤301是不断在执行的步骤;每当一个SPDY请求处理结束就继续进行下一个SPDY请求的处理,即返回步骤302。
[0132]SYN_STREAM类型的SPDY控制帧解析流程如图4所示,包括步骤401到404。
[0133]401、根据协议偏移量,解析出流ID。
[0134]402、用 zlib 解压头域块,提取名字为“:method”、“:path”、“ -vers1n” 的头域,连接组成HTTP请求头的第一行。
[0135]403、把提取的其它头域,写成[头域名]:[头域值]的格式,作为HTTP头域。每行写一个头域。
[0136]404、添加 Connect1n:keep-alive 头域。
[0137]接收服务器HTTP回应的流程如图5所示,包括步骤501到507。
[0138]501、接收服务器发送的HTTP回应头。
[0139]502、根据当前的TCP连接的编号查询SPDYsess1n表得到流ID,解析生成SPDYSYN_REPLY类型的控制帧(具体过程见后文对图6的描述),发给客户端。
[0140]503、接收服务器发送的HTTP回应体,如果是chunk编码则进行504,如果不是chunk编码则进行505。
[0141]504、把chunk头去掉,生成SPDY数据帧发送给客户端。
[0142]505、直接生成SPDY数据帧发送给客户端。
[0143]步骤504和505中,生成SPDY数据帧的过程包括:在收到的回应体前面加上8个字节的数据帧头,前4个字节写入流ID,第6到8个字节写入HTTP回应体的长度。如果是最后一块HTTP回应体,那么把第5个字节写成0x01。
[0144]506、判断回应体是否结束,如果没有则继续步骤503 ;如果结束了则进行507。
[0145]507、在SroYsess1n表中删除对应的流ID和TCP连接号的记录,把这条TCP连接标记为空闲。
[0146]解析HTTP回应的过程如图6所示,包括步骤601到604。
[0147]601、根据当前的TCP连接的编号查询SPDYsess1n表得到流ID。
[0148]602、把HTTP回应头第一行作为SPDY的名子为“:status”的头域。
[0149]603、解析每行HTTP头域,把“:”去掉(“:”前后分别为头域的名字和头域的值),头域的名字前加入用四个字节表示的头域名字长度,在头域的值前加入用4个字节表示的头域的值长度。忽略Connect1n和Transfer-Encoding头。在最终的头域块前加上4个字节表示的头域块的数量,组成SPDY头域块。
[0150]604、用zlib把SPDY头域块进行压缩,然后拼接上8个字节的控制帧头和4个字节和流ID。控制帧头中,前4个字节为0x80、0x03、0x00、0x02表示控制帧,压缩后的SPDY头域块长度加4作为帧长度写入第6到8个字节,如果这个回应不含体,那么第5个字节写AOxOl表示回应结束。
[0151]实施例二、一种SPDY代理系统,包括:
[0152]第一生成模块,用于从客户端接收SPDY请求,如果该SPDY请求为SYN_STREAM类型的控制帧,则解析该SYN_STREAM类型的控制帧,生成HTTP请求头;如果该SPDY请求为数据帧,则解析该数据帧,生成HTTP请求体;将生成的HTTP请求头和请求体发给HTTP服务器;
[0153]第二生成模块,用于当从所述HTTP服务器收到与SPDY请求相应的HTTP回应时,解析HTTP回应头,生成SYN_REPLY类型的控制帧;解析HTTP回应体,生成SPDY数据帧;将所生成的SYN_REPLY类型的控制帧和SPDY数据帧发回给客户端。
[0154]本实施例的一种实施方式中,所述第一生成模块还用于在与所述客户端建立安全传输层协议TLS连接时,在协议协商NPN字符串中加入SPDY版本号;当所述客户端的回应中携带SPDY版本号时,进行所述从客户端接收SPDY请求的操作。
[0155]本实施例的一种实施方式中,所述第一生成模块还用于解析SYN_STREAM类型的控制帧的3个优先级标记位,得到3个二进制数值组成的序列,将所生成的HTTP请求头和所述控制帧对应放入所述序列对应的优先级队列中;将生成的HTTP请求头发给HTTP服务器时,按照从高优先级到低优先级的顺序从优先级队列中取出HTTP请求头和对应的控制帧发送给所述HTTP服务器。
[0156]本实施方式的一种备选方案中,所述第一生成模块解析SYN_STREAM类型的控制帧,生成HTTP请求头是指:
[0157]所述第一生成模块对于SYN_STREAM类型的控制帧,用zlib解压该控制帧的SPDY头域块,提取名字为“:method”、“:path”、“:vers1n”的头域,拼接组成HTTP请求头的第一行;把提取的其它SPDY头域块中的头域,写成[头域名]:[头域值]的格式,作为HTTP头域,每行写一个头域,添加Connect1n:keep_alive头域。
[0158]本实施方式的一种备选方案中,所述第一生成模块还用于在将生成的HTTP请求头发给HTTP服务器前,将从所述SYN_STREAM类型的控制帧中解析出的流ID和所生成的HTTP请求头相对应;检查SPDY到HTTP的服务器的连接池是否有空闲的TCP连接,如果没有且连接池中的连接数未超过预设阈值,则新建一条TCP连接加入所述连接池并标记为空闲后取出;如果有则取出一条空闲的TCP连接;
[0159]所述第一生成模块将生成的HTTP请求头发给HTTP服务器是指:
[0160]所述第一生成模块将所生成的HTTP请求头和对应的控制帧通过所取出的TCP连接发给HTTP服务器,将该HTTP请求头对应的流ID与该条TCP连接的编号对应保存;将该条TCP连接标记为非空闲;
[0161 ] 所述第一生成模块将生成的HTTP请求体发给HTTP服务器是指:
[0162]所述第一生成模块根据从SPDY数据帧中解析出的流ID找到对应的TCP连接的编号;用该编号代表的TCP连接发送所生成的HTTP请求体给HTTP服务器。
[0163]本备选方案中,所述第二生成模块解析HTTP回应头,生成SYN_REPLY类型的控制中贞是指:
[0164]所述第二生成模块根据当前的TCP连接的编号得到对应的流ID ;将HTTP回应头中的第一行状态码作为“:status”头域;把HTTP回应头中每行HTTP头域的“:”去掉,“:”前后分别为头域的名字和头域的值,头域的名字前加入用4个字节表示的头域名字长度,在头域的值前加入用4个字节表示的头域的值长度;在最终的头域块前加上4个字节表示的头域块的数量,组成SYN_REPLY类型的控制帧SPDY头域块;用zlib把生成的SPDY头域块进行压缩,然后拼接上8个字节的SPDY控制帧头和4个字节的所得到的流ID ;所述SPDY控制帧头中,前4个字节为0x80、0x03、0x00,0x02 ;压缩后的SPDY头域块长度加4作为帧长度写入第6到8个字节,如果所述HTTP回应头后不包含回应体,那么第5个字节写入0x01表示回应结束。
[0165]本备选方案中,所述第二生成模块解析HTTP回应体,生成SPDY数据帧是指:
[0166]所述第二生成模块解析HTTP回应体,如果是chunk编码,把chunk头去掉;在所述HTTP回应体前面加上8个字节的数据帧头,前4个字节写入流ID,第6到8个字节写入HTTP回应体的长度;如果是本HTTP回应中的最后一块HTTP回应体,则把第5个字节写成OxOl0
[0167]本备选方案中,所述第一生成模块还用于当所接收的SPDY请求为PING类型的控制帧时,直接把原始帧回应给客户端;当所接收的SPDY请求为RST_STREAM类型的控制帧时,根据解析得到的流ID清除对应的记录,并关闭对应的TCP连接。
[0168]本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本发明不限制于任何特定形式的硬件和软件的结合。
[0169]当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明的权利要求的保护范围。
【权利要求】
1.一种SPDY代理方法,包括: 从客户端接收SPDY请求,如果该SPDY请求为SYN_STREAM类型的控制帧,则解析该SYN_STREAM类型的控制帧,生成HTTP请求头;如果该SPDY请求为数据帧,则解析该数据帧,生成HTTP请求体;将生成的HTTP请求头和请求体发给HTTP服务器; 当从所述HTTP服务器收到与SPDY请求相应的HTTP回应时,解析HTTP回应头,生成SYN_REPLY类型的控制帧;解析HTTP回应体,生成SPDY数据帧;将所生成的SYN_REPLY类型的控制帧和SPDY数据帧发回给客户端。
2.如权利要求1所述的方法,其特征在于,所述从客户端接收SPDY请求的步骤前还包括: 与所述客户端建立安全传输层协议TLS连接时,在协议协商NPN字符串中加入SPDY版本号; 当所述客户端的回应中携带SPDY版本号时,进行所述从客户端接收SPDY请求的步骤。
3.如权利要求1所述的方法,其特征在于,所述解析SYN_STREAM类型的控制帧,生成HTTP请求头的步骤后还包括: 解析SYN_STREAM类型的控制帧的3个优先级标记位,得到3个二进制数值组成的序列,将所生成的HTTP请求头和所述控制帧对应放入所述序列对应的优先级队列中; 所述将生成的HTTP请求头发给HTTP服务器的步骤中,按照从高优先级到低优先级的顺序从优先级队列中取出HTTP请求头和对应的控制帧发送给所述HTTP服务器。
4.如权利要求1到3中任一项所述的方法,其特征在于,所述解析SYN_STREAM类型的控制帧,生成HTTP请求头的步骤包括: 对于SYN_STREAM类型的控制帧,用zlib解压该控制帧的SPDY头域块,提取头域名字为“:method”、“:path”、“:vers1n”的头域的值,拼接组成HTTP请求头的第一行;把提取的其它SPDY头域块中的头域,写成[头域名]:[头域值]的格式,作为HTTP头域,每行写一个头域,添加 Connect1n:keep_alive 头域。
5.如权利要求4所述的方法,其特征在于,生成HTTP请求头的步骤后,将生成的HTTP请求头发给HTTP服务器的步骤前还包括: 将从所述SYN_STREAM类型的控制帧中解析出的流ID和所生成的HTTP请求头相对应; 检查SPDY到HTTP的服务器的连接池是否有空闲的TCP连接,如果没有且连接池中的连接数未超过预设阈值,则新建一条TCP连接加入所述连接池并标记为空闲后取出;如果有则取出一条空闲的TCP连接; 将生成的HTTP请求头发给HTTP服务器的步骤包括: 将所生成的HTTP请求头和对应的控制帧通过所取出的TCP连接发给HTTP服务器,将该HTTP请求头对应的流ID与该条TCP连接的编号对应保存;将该条TCP连接标记为非空闲; 将生成的HTTP请求体发给HTTP服务器的步骤包括: 根据从SPDY数据帧中解析出的流ID找到对应的TCP连接的编号;用该编号代表的TCP连接发送所生成的HTTP请求体给HTTP服务器。
6.如权利要求5所述的方法,其特征在于,所述解析HTTP回应头,生成SYN_REPLY类型的控制帧的步骤包括: 根据当前的TCP连接的编号得到对应的流ID ; 将HTTP回应头中的第一行状态码作为“:status”头域;把HTTP回应头中每行HTTP头域的“:”去掉,“:”前后分别为头域的名字和头域的值;头域的名字前加入用4个字节表示的头域名字长度,在头域的值前加入用4个字节表示的头域的值长度;在最终的头域块前加上4个字节表示的头域块的数量,组成SYN_REPLY类型的控制帧SPDY头域块; 用zlib把生成的SPDY头域块进行压缩,然后拼接上8个字节的SPDY控制帧头和4个字节的所得到的流ID控制帧头中,前4个字节为0X80、0X03、0X00、0X02 ;压缩后的SPDY头域块长度加4作为帧长度写入第6到8个字节,如果所述HTTP回应头后不包含回应体,那么第5个字节写入OxOl表示回应结束。
7.如权利要求5所述的方法,其特征在于,所述解析HTTP回应体,生成SPDY数据帧的步骤包括: 解析HTTP回应体,如果是chunk编码,把chunk头去掉;在所述HTTP回应体前面加上8个字节的数据帧头,前4个字节写入流ID,第6到8个字节写入HTTP回应体的长度;如果是本HTTP回应中的最后一块HTTP回应体,则把第5个字节写成0x01。
8.如权利要求5所述的方法,其特征在于,所述方法还包括: 当所接收的SPDY请求为PING类型的控制帧时,直接把原始帧回应给客户端; 当所接收的SPDY请求为RST_STREAM类型的控制帧时,根据解析得到的流ID清除对应的记录,并关闭对应的TCP连接。
9.一种SPDY代理系统,其特征在于,包括: 第一生成模块,用于从客户端接收SPDY请求,如果该SPDY请求为SYN_STREAM类型的控制帧,则解析该SYN_STREAM类型的控制帧,生成HTTP请求头;如果该SPDY请求为数据帧,则解析该数据帧,生成HTTP请求体;将生成的HTTP请求头和请求体发给HTTP服务器; 第二生成模块,用于当从所述HTTP服务器收到与SPDY请求相应的HTTP回应时,解析HTTP回应头,生成SYN_REPLY类型的控制帧;解析HTTP回应体,生成SPDY数据帧;将所生成的SYN_REPLY类型的控制帧和SPDY数据帧发回给客户端。
10.如权利要求9所述的系统,其特征在于: 所述第一生成模块还用于在与所述客户端建立安全传输层协议TLS连接时,在协议协商NPN字符串中加入SPDY版本号;当所述客户端的回应中携带SPDY版本号时,进行所述从客户端接收SPDY请求的操作。
11.如权利要求9所述的系统,其特征在于: 所述第一生成模块还用于解析SYN_STREAM类型的控制帧的3个优先级标记位,得到3个二进制数值组成的序列,将所生成的HTTP请求头和和所述控制帧对应放入所述序列对应的优先级队列中;将生成的HTTP请求头发给HTTP服务器时,按照从高优先级到低优先级的顺序从优先级队列中取出HTTP请求头对应的控制帧发送给所述HTTP服务器。
12.如权利要求9到11中任一项所述的系统,其特征在于,所述第一生成模块解析SYN_STREAM类型的控制帧,生成HTTP请求头是指: 所述第一生成模块对于SYN_STREAM类型的控制帧,用zlib解压该控制帧的SPDY头域块,提取头域名字为“:method”、“:path”、“:vers1n”的头域的值,拼接组成HTTP请求头的第一行;把提取的其它SPDY头域块中的头域,写成[头域名]:[头域值]的格式,作为HTTP头域,每行写一个头域,添加Connect1n:keep-alive头域。
13.如权利要求12所述的系统,其特征在于: 所述第一生成模块还用于在将生成的HTTP请求头发给HTTP服务器前,将从所述SYN_STREAM类型的控制帧中解析出的流ID和所生成的HTTP请求头相对应;检查SPDY到HTTP的服务器的连接池是否有空闲的TCP连接,如果没有且连接池中的连接数未超过预设阈值,则新建一条TCP连接加入所述连接池并标记为空闲后取出;如果有则取出一条空闲的TCP连接; 所述第一生成模块将生成的HTTP请求头发给HTTP服务器是指: 所述第一生成模块将所生成的HTTP请求头和对应的控制帧通过所取出的TCP连接发给HTTP服务器,将该HTTP请求头对应的流ID与该条TCP连接的编号对应保存;将该条TCP连接标记为非空闲; 所述第一生成模块将生成的HTTP请求体发给HTTP服务器是指: 所述第一生成模块根据从SPDY数据帧中解析出的流ID找到对应的TCP连接的编号;用该编号代表的TCP连接发送所生成的HTTP请求体给HTTP服务器。
14.如权利要求13所述的系统,其特征在于,所述第二生成模块解析HTTP回应头,生成SYN_REPLY类型的控制帧是指: 所述第二生成模块根据当前的TCP连接的编号得到对应的流ID ;将HTTP回应头中的第一行状态码作为”:status”头域;把HTTP回应头中每行HTTP头域的“:”去掉,“:”前后分别为头域的名字和头域的值;头域的名字前加入用4个字节表示的头域名字长度,在头域的值前加入用4个字节表示的头域的值长度;在最终的头域块前加上4个字节表示的头域块的数量,组成SYN_REPLY类型的控制帧SPDY头域块;用zlib把生成的SPDY头域块进行压缩,然后拼接上8个字节的SPDY控制帧头和4个字节的所得到的流ID ;所述SPDY控制帧头中,前4个字节为0X80、0X03、0X00、0X02 ;压缩后的SPDY头域块长度加4作为帧长度写入第6到8个字节,如果所述HTTP回应头后不包含回应体,那么第5个字节写入OxOl表示回应结束。
15.如权利要求13所述的方法,其特征在于,所述第二生成模块解析HTTP回应体,生成SPDY数据帧是指: 所述第二生成模块解析HTTP回应体,如果是chunk编码,把chunk头去掉;在所述HTTP回应体前面加上8个字节的数据帧头,前4个字节写入流ID,第6到8个字节写入HTTP回应体的长度;如果是本HTTP回应中的最后一块HTTP回应体,则把第5个字节写成0x01。
16.如权利要求13所述的系统,其特征在于: 所述第一生成模块还用于当所接收的SPDY请求为PING类型的控制帧时,直接把原始帧回应给客户端;当所接收的SPDY请求为RST_STREAM类型的控制帧时,根据解析得到的流ID清除对应的记录,并关闭对应的TCP连接。
【文档编号】H04L29/06GK104253821SQ201410554733
【公开日】2014年12月31日 申请日期:2014年10月17日 优先权日:2014年10月17日
【发明者】周建斌 申请人:北京太一星晨信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1