一种 TCP 连接的建立方法、 装置及网络设备 【技术领域】
本发明涉及数据通信技术领域,尤其涉及一种传输控制协议 TCP 连接的建立方 法、装置及网络设备。背景技术
传输控制协议 (Transmission Control Protocol,TCP) 协议规定的 TCP 连接建立过 程的三次握手 (Three-way Handshake) 过程,如图 1 所示,包括 :
首先,请求端 ( 客户端 ) 发送一个包含同步 (Synchronize,SYN) 标志的 TCP 报 文,同步报文会指明客户端使用的端口以及 TCP 连接的初始序号 ;
第二步,服务器在收到客户端的 SYN 报文后,将响应一个同步确认 (SYNACK) 的报文,表示客户端的请求被接受,同时 TCP 序号被加 1。
第三步,客户端收到服务端返回的 SYNACK 报文后,也返回一个确认报文 (ACK) 给服务器端,同样 TCP 序列号被加 1,到此一个 TCP 连接完成。 在 TCP 连接的三次握手中,假设一个客户端向服务器发送了 SYN 报文后突然死 机或掉线,那么服务器在发出 SYNACK 应答报文后是无法收到客户端返回的 ACK 报文 的 ( 第三次握手无法完成 ),这种情况下服务器端一般会重试 ( 再次发送 SYNACK 给客 户端 ) 并等待一段时间后丢弃这个未完成的连接 ( 半连接 ),如果有一个恶意的攻击者大 量模拟客户端的这种情况,服务器端为了维护一个非常大的半连接列表消耗非常多的资 源 ---- 数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的 CPU 时间和内 存,如果服务器的 TCP/IP 栈不够强大,最后的结果往往是堆栈溢出崩溃 --- 即使服务器 端的系统足够强大,服务器端也将忙于处理攻击者伪造的 TCP 连接请求而无暇理睬客户 的正常请求,此时从正常客户的角度看来,服务器失去响应,这种情况被称为服务器端 受到了同步洪水 (SYN Flood) 攻击。
现有技术中通常采用 SYN 代理来避免上述 SYN Flood 攻击,如图 2 所示, SYN 代理安装在保护服务器的防火墙上。 SYN 代理收到客户端的 SYN 报文后,自己构造一个 SYNACK 报文回复给客户端,创建并维护 TCP 连接记录,当客户端返回 ACK 报文,也就 意味着客户端的连接请求不是 SYN FLOOD 攻击, SYN 代理把该 ACK 改造成 SYN 报文 发给服务器,代替客户端与服务器之间建立 TCP 连接,并缓存后续来自客户端的 ACK 报 文所携带的用户数据。
SYN 代理收到服务器的 SYN ACK 报文后,把缓存的客户端用户数据封装到用来 确认服务器 SYNACK 报文的 ACK 报文中,发给服务器。
为了进一步避免在遭受 SYN Flood 攻击时,采用 SYN 代理的防火墙不会因为 需要缓存大量的 SYN 报文而被迅速耗尽,现有技术还提出了轻量 SYN 代理的方案,轻 量 SYN 代理并不缓存客户端的 SYN 报文,而仅缓存客户端 SYN 报文的 TCP 选项,如 窗口扩展 (Window-Scale),选择性应答允许 (Sack-Permit),最大报文段长度 (Maximum Segment Size, MSS) 选项等,与客户机三次握手建立连接后,把客户机完成三次握手的
ACK 报文添加上缓存的 TCP 选项,改造成 SYN 报文,发给服务器。
在轻量 SYN 代理把响应给客户端的 SYNACK 报文的窗口 (WINDOW) 域 ( 该 WINDOW 选项域表示该报文的发送方的接收缓存区的大小 ) 的值置为 1,也就是通知客 户端,轻量 SYN 的接收缓冲区只能容纳一个字节,这就保证了在防火墙与客户端三次握 手完成建立连接 TCP 后,到与服务器建立 TCP 连接之前的这段时间,客户端最多只会发 来数据总量只有 1 个字节的报文。 这样,轻量 SYN 代理可以只需要缓存一个字节而不是 整条报文,进一步节省了宝贵的防火墙系统内存。
在服务器端作为虚拟专用网 (Virtual Private Network,VPN) 网关的情况下,在客 户端与轻量 SYN 之间完成三次握手后,会接着发送携带 VPN 连接请求的 ACK 报文,由 于之前收到轻量 SYN 代理返回的 SYN ACK 报文中的 WINDOW 域的大小为 1 个字节,因 此 VPN 连接请求必须分片,因此携带 VPN 连接请求的 ACK 报文并不是不完整的 VPN 连 接请求,总体大小只有 1 个字节,轻量 SYN 在与服务器之间三次握手过程中响应服务器 发送的 SYN ACK 报文时,基于该 SYNACK 报文改造生成 ACK 报文,并且在生成的 ACK 报文中附带上缓存的客户端之前发送的 1 个字节的数据内容 ( 即 VPN 连接请求的片段 ) 发送给服务器。 在某些安全增强型 VPN 网关的服务器接收缓冲区空间足够大的情况下, 这种 VPN 网关要求请求建立 VPN 连接的首报文必须是信息完整的,必须是满足协议规定 的格式的完整的 VPN 连接请求,那么,对于有这种要求的 VPN 网关来说,上述轻量 SYN 代理发送给它的附带有客户端发送的 1 个字节的 VPN 连接请求片段的 ACK 报文,由于该 首报文不是完整的 VPN 连接请求,将不被认为是合法的报文,导致合法客户端无法建立 VPN 连接。 发明内容
本发明实施例提供了一种 TCP 连接的建立方法、装置即网络设备,用以解决现 有服务器作为 VPN 网关的情况下,在轻量 SYN 代理与服务器三次握手过程中,服务器将 轻量 SYN 代理的发送的携带有客户端 VPN 请求报文片段的 ACK 报文作为非法报文导致 客户端无法建立 VPN 连接的问题。
本发明实施例提供的一种传输控制协议 TCP 连接的建立方法,包括 :
在完成与客户端的三次握手过程且向作为虚拟专用网 VPN 网关的服务器发送同 步 SYN 报文后,接收服务器返回的同步确认 SYNACK 报文 ;
在判断缓存有客户端发送的 VPN 连接请求报文的片段时,向客户端返回 ACK 报文,所述 ACK 报文中的窗口 WINDOW 域值等于所述服务器返回的 SYNACK 报文中 WINDOW 域值 ;
接收客户端返回的携带有所述 VPN 连接请求的剩余片段的 TCP 报文 ;
根据缓存的 VPN 连接请求的片段和客户端返回的该 VPN 连接请求的剩余片段, 生成携带完整 VPN 连接请求的 ACK 报文返回至所述服务器。
本发明实施例提供的一种传输控制协议 TCP 连接的建立装置,包括 :
接收单元,用于在完成与客户端的三次握手过程且向作为虚拟专用网 VPN 网关 的服务器发送同步 SYN 报文后,接收服务器返回的同步确认 SYNACK 报文 ;以及接收客 户端返回的携带有 VPN 连接请求的剩余片段的 TCP 报文 ;判断单元,用于在接收单元接收服务器返回的 SYNACK 报文之后,判断是否缓 存有客户端发送的 VPN 连接请求报文的片段 ;
报文生成单元,用于在判断单元判断结果为是时,生成返回给客户端的 ACK 报文,所述 ACK 报文中的窗口 WINDOW 域值等于所述服务器返回的 SYNACK 报文中 WINDOW 域值 ;以及根据缓存的 VPN 连接请求的片段和客户端返回的该 VPN 连接请求 的剩余片段,生成携带完整 VPN 连接请求的 ACK 报文 ;
发送单元,用于在判断单元判断结果为是时,将报文生成单元生成的 ACK 报文 返回给客户端 ;以及将携带完整 VPN 连接请求的 ACK 报文返回至所述服务器。
本发明实施例提供一种网络设备,该网络设备包括本发明实施例提供的 TCP 连 接的建立装置。
本发明实施例的有益效果包括 :
本发明实施例提供的上述 TCP 连接的建立方法及装置,轻量 SYN 代理在完成与 客户端之间的三次握手过程以及接收到作为 VPN 网关的服务器发送的 SYNACK 报文之 后,在本地缓存有 VPN 连接请求片段的情况下,将服务器发送的 SYNACK 报文改造成返 回给客户端的 ACK 报文,由于该 ACK 报文的 WINDOW 域值等于服务器接收缓冲空间的 大小,远大于缓存 VPN 连接请求所需容量大小,使得客户端能够根据服务器接收缓冲空 间的大小,将 VPN 连接请求的剩余片段通过 TCP 报文发送回轻量 SYN 代理,轻量 SYN 代理将缓存的 VPN 连接请求的片段以及客户端通过 TCP 报文发送的 VPN 连接请求的剩 余部分合并成完整的 VPN 连接请求,这样可以保证发给服务器的 VPN 连接请求的首报文 携带有完整的 VPN 连接请求的所有信息,避免现有技术在轻量 SYN 代理与服务器三次握 手过程中,服务器将轻量 SYN 代理的发送的携带有客户端 VPN 请求报文片段的 ACK 报 文作为非法报文导致客户端无法建立 VPN 连接的问题。 附图说明
图 1 为现有技术中 TCP 协议中客户端和服务器之间的三次握手过程流程图 ; 图 2 为现有技术中有 SYN 代理参与的客户端和服务器的三次握手过程的流程 图 3 为本发明实施例提供的 TCP 连接的建立方法的流程图 ; 图 4 为本发明实施例提供的 TCP 连接的建立装置的结构示意图。图;
具体实施方式
下面结合附图,对本发明实施例提供的一种 TCP 连接的建立方法、装置和网络 设备的具体实施方式进行详细地说明。
本发明实施例提供的 TCP 连接的建立方法,对现有技术中轻量 SYN 代理与客户 端和服务器之间的交互流程进行了改进,具体流程图如图 3 所示,包括 :
S301、客户端向轻量 SYN 代理发送 SYN 报文 ;
S302、轻量 SYN 代理向客户端返回 SYNACK 报文 ;
在本步骤 S302 中,为了节约防火墙的有限的缓存,轻量 SYN 代理将发送给 SYNACK 报文中设定 WINDOW 域的值为一个很小的值例如为 1 个字节。S303、客户端向轻量 SYN 代理返回 SYNACK 报文对应的 ACK 报文。
上述步骤 S301 ~ S303 的实施方法与现有技术相同,轻量 SYN 代理和客户端之 间完成了三次握手过程。
在步骤 S303 后,客户端如果需要向作为 VPN 网关的服务器发起 VPN 请求,则 执行下述步骤 S304 ;
S304、客户端根据轻量 SYN 代理返回的 SYNACK 报文中的 WINDOW 域值的大 小,对 VPN 连接请求进行分片,向轻量 SYN 代理发送 ACK 报文,该报文总长度等于步 骤 S302 中 SYNACK 报文的 WINDOW 域值的大小。
S305、轻量 SYN 代理在完成与客户端的三次握手过程之后,向作为 VPN 网关的 服务器发送 SYN 报文 ;
S306、服务器接收到轻量 SYN 代理发送的 SYN 报文后,向其返回 SYNACK 报 文;
需要说明的是,上述步骤 S304 与上述步骤 S305 以及 S306 之间相互独立,并没 有严格的时间顺序,步骤 S304 有可能在步骤 S306 之前执行,也有可能在 S306 之后执 行。 S307、轻量 SYN 代理判断是否本地缓存有 VPN 连接请求的片段 ;若缓存有,执 行步骤 S308,若没有缓存 VPN 连接请求的片段,执行步骤 S311 ;
如果步骤 S304 在步骤 S306 之前执行,那么轻量 SYN 代理在本步骤中将缓存 VPN 连接请求片段,反之则不会缓存 VPN 连接请求的片段。
S308、轻量 SYN 代理将服务器发送的 SYNACK 报文改造成 ACK 报文,该 ACK 报文的 WINDOW 域值等于服务器发送的 SYNACK 报文中 WINDOW 域值 ;
S309、客户端向轻量 SYN 代理发送 TCP 报文,该 TCP 报文中携带有 VPN 连接 请求的剩余片段 ;
在上述步骤 S308 中,轻量 SYN 代理发送的 ACK 报文中的 WINDOW 域值等于 服务器发送的 SYNACK 报文的 WINDOW 域值,由于服务器 WINDOW 域值意味着服务器 的接收缓冲区的大小,一般都会远大于 VPN 连接请求 ( 包含完整的 VPN 连接请求的相关 信息 ) 的大小,也就是说服务器的接收缓冲区的大小足够容纳完整的 VPN 连接请求的大 小,不至于对客户端发送的 VPN 连接请求造成限制 ;
因此,在本步骤 S309 中,客户端根据轻量 SYN 代理在步骤 S308 中发送的 ACK 报文中的 WINDOW 域值的大小,接着将之前因接收方接收缓冲限制而延迟待发的 VPN 连接请求的剩余片段发送至轻量 SYN 代理。
对于客户端来说,轻量 SYN 代理是透明的,它根据接收的报文中的 WINDOW 域值的大小决定是否将 VPN 连接请求分片发送。
S310、轻量 SYN 代理根据缓存的 VPN 连接请求的片段和客户端返回的该 VPN 连接请求的剩余片段,生成携带完整 VPN 连接请求的 ACK 报文返回至服务器 ;
在本步骤 S310 中,轻量 SYN 代理将客户端返回的 TCP 报文中插入缓存的 VPN 连接请求的片段,将缓存的 VPN 连接请求的片段和 VPN 连接请求的剩余片段合并为完整 的 VPN 连接请求 ;
然后轻量 SYN 代理重新计算该 TCP 报文的 IP 和校验和,将其改造成返回给服务
器的 ACK 报文。
S311、轻量 SYN 代理直接将服务器发送的 SYNACK 报文改造成 ACK 报文返回 给服务器。
本步骤 S311 中,轻量 SYN 代理发送给服务器的 ACK 报文的过程与现有技术中 SYN 与服务器之间三次握手过程中发送的 ACK 报文的过程相同,在此不再详述。
经过上述过程,轻量 SYN 代理在完成与作为 VPN 网关的服务器之间的三次握手 过程中,将完整的 VPN 连接请求发送至服务器,避免了现有技术中在轻量 SYN 代理与服 务器三次握手过程中,服务器将轻量 SYN 代理的发送的携带有客户端 VPN 请求报文片段 的 ACK 报文作为非法报文导致客户端无法建立 VPN 连接的问题。
基于同一发明构思,本发明实施例还提供了一种 TCP 连接的建立装置及网络设 备,由于该装置及设备解决问题的原理与前述一种 TCP 连接的建立方法相似,因此该装 置和网络设备的实施可以参见方法的实施,重复之处不再赘还。
本发明实施例提供的上述 TCP 连接的建立装置及网络设备,如图 4 所示,包 括:
接收单元 401,用于在完成与客户端的三次握手过程且向作为 VPN 网关的服务 器发送同步 SYN 报文后,接收服务器返回的同步确认 SYNACK 报文 ;以及接收客户端返 回的携带有 VPN 连接请求的剩余片段的 TCP 报文 ; 判断单元 402,用于在接收单元接收服务器返回的 SYNACK 报文之后,判断是 否缓存有客户端发送的 VPN 连接请求报文的片段 ;
报文生成单元 403,用于在判断单元 402 的判断结果为是时,生成返回给客户端 的 ACK 报文,所述 ACK 报文中的窗口 WINDOW 域值等于所述服务器返回的 SYNACK 报文中 WINDOW 域值 ;以及根据缓存的 VPN 连接请求的片段和客户端返回的该 VPN 连 接请求的剩余片段,生成携带完整 VPN 连接请求的 ACK 报文 ;
发送单元 404,用于在判断单元 402 的判断结果为是时,将报文生成单元生成 的 ACK 报文返回给客户端 ;以及将携带完整 VPN 连接请求的 ACK 报文返回至所述服务 器。
进一步地,上述报文生成单元 403,具体用于通过改造服务器返回的 SYNACK 报文,生成返回给客户端的 ACK 报文,所述生成的 ACK 报文中的 WINDOW 域值等于所 述 SYNACK 报文报头中的 WINDOW 域值。
进一步地,上述报文生成单元 403,具体用于将客户端返回的 TCP 报文中插入缓 存的 VPN 连接请求的片段,将所述缓存的 VPN 连接请求的片段和所述 VPN 连接请求的 剩余片段合并为完整的 VPN 连接请求 ;重新计算所述 TCP 报文的 IP 和校验和,改造成 返回给服务器的 ACK 报文。
进一步地,所述报文生成单元 403,还用于在判断单元 402 判断未缓存有客户端 发送的 VPN 连接请求报文的片段之后,将服务器返回的 SYNACK 报文改造成发送给服务 器的 ACK 报文 ;
所述发送单元 404,还用于在判断单元 402 判断未缓存有客户端发送的 VPN 连接 请求报文的片段之后,将所述报文生成单元改造后的 ACK 报文发送至服务器。
本发明实施例还提供了一种网络设备,该网络设备包含本发明实施例提供的上
述 TCP 连接的建立装置。
较佳地,上述 TCP 连接的建立装置设置于该网络设备的防火墙中。
本发明实施例提供的上述 TCP 连接的建立方法及装置,轻量 SYN 代理在完成与 客户端之间的三次握手过程以及接收到作为 VPN 网关的服务器发送的 SYNACK 报文之 后,在本地缓存有 VPN 连接请求片段的情况下,将服务器发送的 SYNACK 报文改造成返 回给客户端的 ACK 报文,由于该 ACK 报文的 WINDOW 域值等于服务器接收缓冲空间的 大小,远大于缓存 VPN 连接请求所需容量大小,使得客户端能够根据服务器接收缓冲空 间的大小,将 VPN 连接请求的剩余片段通过 TCP 报文发送回轻量 SYN 代理,轻量 SYN 代理将缓存的 VPN 连接请求的片段以及客户端通过 TCP 报文发送的 VPN 连接请求的剩 余部分合并成完整的 VPN 连接请求,这样可以保证发给服务器的 VPN 连接请求的首报文 携带有完整的 VPN 连接请求的所有信息,避免现有技术在轻量 SYN 代理与服务器三次握 手过程中,服务器将轻量 SYN 代理的发送的携带有客户端 VPN 请求报文片段的 ACK 报 文作为非法报文导致客户端无法建立 VPN 连接的问题。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的 精神和范围。 这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的 范围之内,则本发明也意图包含这些改动和变型在内。