CN105099952B - 一种资源分配方法及装置 - Google Patents
一种资源分配方法及装置 Download PDFInfo
- Publication number
- CN105099952B CN105099952B CN201410223308.2A CN201410223308A CN105099952B CN 105099952 B CN105099952 B CN 105099952B CN 201410223308 A CN201410223308 A CN 201410223308A CN 105099952 B CN105099952 B CN 105099952B
- Authority
- CN
- China
- Prior art keywords
- value
- data packet
- syn
- tcp connection
- serial number
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明实施例提供了一种资源分配方法及装置,当接收到客户端发送的SYN包时,为SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;回复SYN+ACK包;当接收到ACK包时,基于该包中ACK字段的值,确定对应SYN+ACK包中SEQ字段的值;对该值进行第一运算的逆运算,将得到的第一查询值作为序号查询已分配序号;将查询到的序号表征的TCP连接标识为完成三次握手;为完成三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。本发明解决了现有技术中发生TCP半连接洪水攻击时,被攻击服务器无法提供正常服务的问题,本发明涉及网络通信技术领域。
Description
技术领域
本发明涉及网络通信技术领域,尤其涉及一种资源分配方法及装置。
背景技术
传输控制/网际协议(TCP/IP,Transfer ControlnProtocol/Internet Protocol)参考模型是一个抽象分层模型,模型中所有的TCP/IP系列网络协议都被归类到4个抽象的"层"中。每一层建立在低一层提供的服务上,为高一层提供服务。如图1所示,TCP协议位于TCP/IP参考模型的传输层。
使用TCP进行数据通信的通信双方在进行业务数据传输前需要建立TCP连接,具体地,建立TCP连接的过程包含3次报文的交互,如图2所示,包括下述步骤:
步骤1、客户端向服务器端发出同步(SYN,synchronous)报文;
步骤2、服务器端向客户端回应SYN+ACK报文;
步骤3、客户端向服务器端回应确认(ACK,Acknowledgment Number)报文;
上述三次报文交互即为TCP连接的三次握手,握手成功后,客户端和服务器端双方即可开始业务数据传输。如果只发生了上述步骤1和步骤2,而上述步骤3并没有发生,那么可以称客户端和服务器端完成了半连接,此时服务器会为该半连接分配相应的连接资源(例如:重传定时器,IP地址和端口号,确认序列号和序列号等),而当上述三个步骤均发生时,可以称客户端和服务器端完成了全连接,此时服务器会为该全连接分配相应的连接资源(例如:发送缓冲区,接收缓冲区,发送缓冲区指针和接收缓冲区指针等)。
发生在半连接阶段的TCP洪水(flood)攻击可以称为半连接洪水攻击。由于在半连接阶段,服务器会为客户端分配半连接对应的连接资源,恶意客户端(攻击者)可以不停地向服务器端发送SYN数据包,而在接收到服务器端回应的SYN+ACK数据包之后,不回应ACK包,这样,服务器端为每个半连接分配对应的连接资源,消耗大量的半连接资源,当服务器端的半连接资源耗尽时,正常用户的SYN请求无法被服务器端处理,导致正常用户不能与服务器端建立TCP连接,进而不能为正常用户服务,导致拒绝服务攻击的发生。如图3所示,虚线表征大量恶意SYN报文,实线表示正常用户的SYN报文,大量恶意的SYN报文301接入服务器端,服务器端向恶意客户端回应对应的SYN+ACK报文302,并为这些恶意的SYN报文301分配大量的半连接资源,导致后续正常用户的SYN报文303不能被处理。
现有技术中,很多服务***为保证服务器免受TCP洪水攻击,在服务器和客户端之间使用防火墙。具体地,使用防火墙作为TCP代理,使防火墙与客户端建立TCP连接,并在防火墙与客户端完成TCP连接的建立之后,防火墙再与服务器建立TCP连接,并转发后续的业务数据。如图4所示,以文件传输协议(FTP,File Transfer Protocol)服务器为例,在FTP服务器401与客户端402之间部署防火墙403,当客户端402需要与FTP服务器401建立TCP连接时,由防火墙403作为FTP服务器401的TCP代理,与客户端402建立TCP连接,并在防火墙403与客户端402之间完成TCP全连接之后,防火墙403再与FTP服务器401建立TCP连接。如果防火墙403与客户端402之间只完成了半连接,那么防火墙403就不与FTP服务器401建立TCP连接,从而保护了FTP服务器401免受TCP半连接攻击。如图4所示,防火墙403在接收到客户端发送的SYN报文1之后,向客户端回复SYN+ACK报文,并在接收到回复该SYN+ACK报文的ACK报文1之后,将SYN报文1转发给FTP服务器401,接收FTP服务器401发送的SYN+ACK报文,并将ACK报文1转发给FTP服务器401,而对于接收的SYN报文2,回复了SYN+ACK报文之后,并没有接收到客户端回复的针对该SYN+ACK报文的ACK报文2,因此,不将SYN报文2转发给FTP服务器401。
但是,现有技术中的上述解决方案具有如下缺点:尽管使用防火墙403作为FTP服务器401的代理,防火墙403在与客户端402建立了TCP半连接之后,也会为客户端402分配半连接资源,相当于将半连接攻击从FTP服务器401转移到防火墙403,尽管防火墙403所在设备通常比服务器具有更丰富的资源,使得防火墙403抗TCP半连接攻击能力比FTP服务器401强,只要攻击者发送的SYN数据包足够多,还是会被TCP半连接攻击攻陷,导致正常客户无法连接FTP服务器401。
发明内容
本发明实施例提供了一种资源分配方法及装置,用以解决现有技术中当发生TCP半连接洪水攻击时,被攻击服务器无法提供正常服务的问题。
第一方面、提供一种资源分配方法,包括:
当接收到客户端发送的SYN数据包时,为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;
对分配的所述序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,并向所述客户端回复所述SYN+ACK数据包;
当接收到ACK数据包时,基于所述ACK数据包中ACK字段的值,确定所述ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;并
对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;
将查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手;
为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。
结合第一方面,在第一种可能的实现方式中,在为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源之前,还包括:当接收到第一个业务数据包时,基于所述业务数据包中ACK字段的值,确定所述业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值;并对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询;为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源,具体包括:当确定查询到的所述第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为所述第二查询值对应的序号表征的TCP连接分配传输业务数据所需的资源。
结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,当接收到客户端发送的SYN数据包时,还包括:对所述SYN数据包中SEQ字段的值进行预设运算;为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号,具体包括:为所述预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征所述SYN数据包所属TCP连接;对分配的所述序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,具体包括:对存储所述标识值的表项的序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值;将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询,具体包括:将经过第一运算的逆运算得到的第一查询值作为表项的序号对所述连接请求表进行查询;将查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手,具体包括:将查询到的所述第一查询值对应的所述连接请求表表项的序号表征的TCP连接标识为完成三次握手;将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询,具体包括:将经过第一运算的逆运算得到的第二查询值作为表项的序号对所述连接请求表进行查询;为所述第二查询值对应的所述连接请求表的表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源,还需要满足以下条件:根据所述第一个业务数据包中SEQ字段的值确定所述第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值;并对确定的SYN数据包中SEQ字段的值进行所述预设运算,得到的结果与该表项存储的标识值一致。
结合第一方面的第一种可能的实现方式,或者结合第一方面的第二种可能的实现方式,在第三种可能的实现方式中,采用如下方式确定接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;当所述全连接表中不存在与所述接收到的业务数据包对应的所述指定指标值对应的表项时,确定所述接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,其中,所述全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,所述指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
结合第一方面,或者结合第一方面的第一种可能的实现方式,或者结合第一方面的第二种可能的实现方式,在第四中可能的实现方式中,还包括:针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空;或者当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值;或者针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时;或者针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
第二方面、提供一种资源分配装置,包括:
接收模块,用于接收客户端发送的数据包;
第一分配模块,用于当所述接收模块接收到客户端发送的SYN数据包时,为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;
运算模块,用于对所述第一分配模块分配的所述序号进行第一运算;
发送模块,用于将所述运算模块得到的运算结果作为SYN+ACK数据包中SEQ字段的值,并向所述客户端回复所述SYN+ACK数据包;
确定模块,用于当所述接收模块接收到ACK数据包时,基于所述ACK数据包中ACK字段的值,确定所述ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;
查询模块,用于对所述确定模块确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;
标识模块,用于将所述查询模块查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手;
第二分配模块,为所述标识模块标识的完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。
结合第二方面,在第一种可能的实现方式中,所述确定模块,还用于在所述第二分配模块在为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源之前,当所述接收模块接收到第一个业务数据包时,基于所述业务数据包中ACK字段的值,确定所述业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值;所述查询模块,还用于对所述确定模块确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询;所述第二分配模块,具体用于当确定所述查询模块查询到的所述第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为所述第二查询值对应的序号表征的TCP连接分配传输业务数据所需的资源。
结合第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述运算模块,还用于当所述接收模块接收到客户端发送的SYN数据包时,对所述SYN数据包中SEQ字段的值进行预设运算;所述第一分配模块,具体用于为所述运算模块通过预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征所述SYN数据包所属TCP连接;所述运算模块,具体用于对所述第一分配模块分配的存储所述标识值的表项的序号进行第一运算;所述查询模块,具体用于将经过第一运算的逆运算得到的第一查询值作为表项的序号对所述连接请求表进行查询;以及将经过第一运算的逆运算得到的第二查询值作为表项的序号对所述连接请求表进行查询;所述标识模块,具体用于将所述查询模块查询到的所述第一查询值对应的所述连接请求表表项的序号表征的TCP连接标识为完成三次握手;所述第二分配模块,具体用于为所述第二查询值对应的所述连接请求表的表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源,还需要满足以下条件:根据所述第一个业务数据包中SEQ字段的值确定所述第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值;并对确定的SYN数据包中SEQ字段的值进行所述预设运算,得到的结果与该表项存储的标识值一致。
结合第二方面的第一种可能的实现方式,或者结合第二方面的第二种可能的实现方式,在第三种可能的实现方式中,所述确定模块,还用于采用如下方式确定所述接收模块接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;当所述全连接表中不存在与所述接收到的业务数据包对应的所述指定指标值对应的表项时,确定所述接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,其中,所述全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,所述指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
结合第二方面,或者结合第二方面的第一种可能的实现方式,或者结合第二方面的第二种可能的实现方式,在第四中可能的实现方式中,还包括:清空模块;
所述清空模块,用于针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空;或者当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值;或者针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时;或者针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
第三方面、提供一种资源分配装置,包括:
接收器,用于接收客户端发送的数据包;
处理器,用于当所述接收器接收到客户端发送的SYN数据包时,为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;对所述序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值;以及当所述接收器接收到ACK数据包时,基于所述ACK数据包中ACK字段的值,确定所述ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;将查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手;为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源;
发送器,用于向客户端回复针对所述接收器接收的SYN数据包的SYN+ACK数据包。
结合第三方面,在第一种可能的实现方式中,所述处理器,还用于在为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源之前,当所述接收器接收到第一个业务数据包时,基于所述业务数据包中ACK字段的值,确定所述业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值;对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询;当确定查询到的所述第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为所述第二查询值对应的序号表征的TCP连接分配传输业务数据所需的资源。
结合第三方面的第一种可能的实现方式,在第二种可能的实现方式中,所述处理器,还用于当所述接收器接收到客户端发送的SYN数据包时,对所述SYN数据包中SEQ字段的值进行预设运算;所述处理器,具体用于为预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征所述SYN数据包所属TCP连接;对存储所述标识值的表项的序号进行第一运算;将经过第一运算的逆运算得到的第一查询值作为表项的序号对所述连接请求表进行查询;将查询到的所述第一查询值对应的所述连接请求表表项的序号表征的TCP连接标识为完成三次握手;以及将经过第一运算的逆运算得到的第二查询值作为表项的序号对所述连接请求表进行查询;为所述第二查询值对应的所述连接请求表的表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源,还需要满足以下条件:根据所述第一个业务数据包中SEQ字段的值确定所述第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值;并对确定的SYN数据包中SEQ字段的值进行所述预设运算,得到的结果与该表项存储的标识值一致。
结合第三方面的第一种可能的实现方式,或者结合第三方面的第二种可能的实现方式,在第三种可能的实现方式中,所述处理器,还用于采用如下方式确定所述接收器接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;当所述全连接表中不存在与所述接收到的业务数据包对应的所述指定指标值对应的表项时,确定所述接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,其中,所述全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,所述指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
结合第三方面,或者结合第三方面的第一种可能的实现方式,或者结合第三方面的第二种可能的实现方式,在第四中可能的实现方式中,所述处理器,还用于针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空;或者当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值;或者针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时;或者针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
本发明实施例的有益效果包括:
本发明实施例提供的一种资源分配方法及装置,当接收到客户端发送的SYN数据包时,为SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;对分配的序号进行第一运算,将得到的结果作为SYN+ACK数据包中序列号(SEQ,SequenceNumber)字段的值,并向客户端回复所述SYN+ACK数据包;当接收到ACK数据包时,基于ACK数据包中ACK字段的值,确定ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;并对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;将查询到的第一查询值对应的序号所表征的TCP连接标识为完成三次握手;为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。本发明实施例提供的资源分配方法,在完成TCP全连接之后,才为完成全连接的TCP连接分配后续业务数据传输所需的资源,当发生半连接阶段的TCP洪水攻击时,由于并没有在半连接阶段为TCP连接分配半连接对应的资源,每个TCP连接仅分配了用于表征该TCP连接的一个序号,缓解了TCP洪水攻击对网络服务器的影响,保证了网络服务器在受到TCP半连接洪水攻击时,不会因为在半连接阶段为每个TCP连接分配半连接资源而耗尽资源,能够保证为正常TCP连接的用户提供正常的服务。
附图说明
图1为本发明背景技术提供的TCP/IP参考模型是一个抽象分层模型示意图;
图2为本发明背景技术提供的TCP连接的过程包含3次报文的交互示意图;
图3为本发明背景技术提供的TCP半连接洪水攻击报文交互示意图;
图4为本发明背景技术提供的TCP洪水攻击解决方法示意图;
图5为本发明实施例提供的一种资源分配方法流程图;
图6为本发明实施例1提供的一种资源分配方法流程图;
图7为本发明实施例1提供的TCP全连接洪水攻击报文交互示意图;
图8为本发明实施例2提供的TCP全连接洪水攻击报文交互示意图;
图9a-图9b为本发明实施例提供的TCP状态跳转流程图;
图10为本发明例1提供的一种资源分配方法流程图;
图11为本发明实施例3提供的一种资源分配方法流程图;
图12为本发明例2提供的一种资源分配方法流程图;
图13为本发明提供的一种资源分配装置之一的结构示意图;
图14为本发明提供的一种资源分配装置之二的结构示意图。
具体实施方式
本发明实施例提供了一种资源分配方法及装置,以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
本发明实施例提供一种资源分配方法,如图5所示,包括:
S501、当接收到客户端发送的SYN数据包时,为该SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号。
S502、对分配的序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,并向客户端回复SYN+ACK数据包。
S503、当接收到ACK数据包时,基于该ACK数据包中ACK字段的值,确定该ACK数据包所回复的SYN+ACK数据包中SEQ字段的值。
S504、对S503中确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询。
S505、将S504中查询到的第一查询值对应的序号所表征的TCP连接标识为完成三次握手。
S506、为S505中完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。
本发明实施例提供的资源分配方法,在执行完S502即完成TCP半连接时,并不为该TCP连接分配半连接资源,使得使用半连接洪水攻击对服务器进行攻击的攻击者,无法通过不停地与服务器建立TCP半连接,使服务器端不停地为各TCP半连接分配半连接资源来耗尽服务器资源,保证了服务器能够为正常用户提供服务。
下面结合附图,用具体实施例对本发明提供的方法及相关设备进行详细描述。
实施例1:
本发明实施例1中,提供了一种资源分配方法,本发明实施例1提供的资源分配方法,解决现有技术中当发生TCP半连接洪水攻击以及TCP全连接洪水攻击时,被攻击服务器无法提供正常服务的问题。如图6所示,具体包括如下步骤:
S601、当接收到客户端发送的SYN数据包时,为该SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号。
本步骤中,由于不会为本次TCP连接分配半连接资源,因此,不会记录本次TCP连接对应的客户端的IP地址和端口号,当后续接收到该客户端针对SYN+ACK数据包回复的ACK数据包,以及客户端发送的第一个业务数据包时,不能通过客户端的IP地址和端口号表征本次TCP连接,那么,可以使用序号对本次TCP连接进行标识。
进一步地,本发明实施例中,由于通信双方完成了TCP三次握手即建立了TCP连接,可以称TCP三次握手的SYN数据包、SYN+ACK数据包以及ACK数据包属于一个TCP连接。
S602、对分配的序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,并向客户端回复SYN+ACK数据包。
本步骤中,可以对分配的序号进行第一运算(例如:哈希运算、代数运算等),将处理之后的值作为SYN+ACK数据包中序列号SEQ字段的值。
进一步地,由于SYN+ACK数据包中SEQ字段的值和与该SYN+ACK数据包对应的ACK数据包中的ACK字段的值具有一定的数值关系,那么,可以通过对存储S601中分配的序号进行第一运算,将得到的值作为SYN+ACK数据包中SEQ字段的值,当接收到ACK数据包时,通过ACK数据包中ACK字段的值得到SYN+ACK数据包中SEQ字段的值,并通过第一运算的逆运算得到该ACK数据包所属TCP连接对应的序号。
S603、当接收到ACK数据包时,基于该ACK数据包中ACK字段的值,确定该ACK数据包所回复的SYN+ACK数据包中SEQ字段的值。
进一步地,TCP协议是有连接的可靠协议,每个数据包都具有SEQ字段,才能按顺序接收每个数据包,对于TCP连接中的非首个数据包,每个数据包中还具有ACK字段,ACK号用于表征已经接收到对端发送的数据包,并期待下次接收到的对端应发送的数据包的字节序列号。
本步骤中,ACK数据包中ACK字段的值与该ACK数据包所属TCP连接中,SYN+ACK数据包中SEQ字段的值之间具有一定的数值关系,通常情况下,ACK数据包中ACK字段的值等于SYN+ACK数据包中SEQ字段的值加一。由于SYN+ACK数据包中SEQ字段的值是根据所分配序号确定的,而ACK数据包中ACK字段的值等于SYN+ACK数据包中SEQ字段的值加一,那么可以通过ACK数据包中ACK字段的值确定出该ACK数据包所回复的SYN+ACK数据包中SEQ字段的值。
S604、对S603中确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询。
进一步地,本实施例中,通过对分配的序号进行第一运算,确定SYN+ACK数据包中的SEQ字段的值,那么,可以根据接收到的ACK数据包的ACK字段的值确定该ACK数据包所回复的SYN+ACK数据包中的SEQ字段的值,并通过对该确定的SEQ字段的值进行第一运算的逆运算,确定该ACK数据包所属TCP连接对应的序号。
较佳地,可以将分配的序号减一,将得到的差作为SYN+ACK数据包中的SEQ字段的值,那么,当接收到ACK数据包时,可以将ACK数据包中ACK字段的值确定为该ACK数据包所属TCP连接对应的序号。也就是说,第一运算为减一运算,第一运算的逆运算即为加一运算。
S605、将S604中查询到的第一查询值对应的序号所表征的TCP连接标识为完成三次握手。
进一步地,在本实施例中,当执行完步骤S602,客户端和服务器端完成TCP半连接,在半连接阶段每个TCP连接仅分配了一个序号,与现有技术中完成TCP半连接之后分配半连接资源相比,缓解了TCP半连接洪水攻击,当执行完本步骤,完成三次握手的TCP连接完成了TCP全连接。而TCP洪水攻击不仅可以发生在半连接阶段,也可以发生在全连接阶段。因为服务器端在与客户端完成TCP连接之后,会为客户端分配本次全连接相应的连接资源,那么,攻击者可以不停地向服务器发送SYN数据包,并在接收到服务器回复的SYN+ACK数据包之后向服务器发送ACK数据包,而在此之后并不向服务器发送业务数据包,这样,服务器为每个全连接分配对应的全连接资源,消耗大量的全连接资源,当服务器端的全连接资源耗尽时,正常用户的SYN请求虽然可以被服务器端接收,但是与该SYN对应的ACK报文在接收时,服务器并没有全连接资源可以为正常用户分配,只能丢弃,这样也会导致正常用户不能与服务器端建立TCP连接,进而不能为正常用户服务,导致拒绝服务攻击的发生。如图7所示,虚线表征大量恶意SYN报文,以及与该恶意SYN报文对应的ACK报文,实线表征正常用户的SYN报文,以及与该恶意SYN报文对应的ACK报文,大量恶意的SYN报文701接入被攻击***,被攻击者向攻击者回应对应的SYN+ACK702报文,与大量恶意的SYN报文701对应的ACK报文703接入被攻击***,服务器端为这些恶意的SYN报文701及ACK报文703分配大量的全连接资源,导致后续正常用户的SYN报文704不能被处理。
进一步地,具体实施时,可以为用于标识TCP连接的序号分配三次握手标识,用于表征该序号标识的TCP连接是否完成三次握手。本步骤中,可以将第一查询值对应序号对应的三次握手标识置为完成三次握手。
进一步地,进行到本步骤,如果仅为了防止TCP半连接洪水攻击,可以不执行后续步骤,直接为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。如果需要进一步防止TCP全连接洪水攻击,可以继续执行后续步骤。
S606、当接收到第一个业务数据包时,基于该业务数据包中ACK字段的值,确定该业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值。
本步骤中,为了防止全连接洪水攻击,在确定TCP连接完成三次握手之后,并不直接为该TCP连接后续的业务数据传输分配资源,而是等待接收该TCP连接对应的第一个业务数据包。
本步骤中,接收到的第一个业务数据包中ACK字段的值与该业务数据包所属TCP连接中,SYN+ACK数据包中SEQ字段的值之间具有一定的数值关系,通常情况下,第一个业务数据包中ACK字段的值等于SYN+ACK数据包中SEQ字段的值加一。由于SYN+ACK数据包中SEQ字段的值是根据分配的序号确定的,而第一个业务数据包中ACK字段的值等于SYN+ACK数据包中SEQ字段的值加一,那么可以通过第一个业务数据包中ACK字段的值确定出SYN+ACK数据包中SEQ字段的值。
进一步地,可以采用如下方式确定接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:
步骤一:当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;
步骤二:当全连接表中不存在与接收到的业务数据包对应的指定指标值对应的表项时,确定接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,
其中,全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
进一步地,由于本实施例中,不会在TCP连接完成三次握手之后就为TCP连接对应的后续业务数据传输分配全连接资源,对于非第一个业务数据包,则已经分配了业务数据传输所需的资源,该资源包括TCP连接对应客户端的IP地址、端口号等,那么,对于非第一个业务数据包可以根据全连接表记录的IP地址和端口号等进行标识,而当接收到的业务数据包的IP地址和端口号在全连接表中不存在已经记录的与之匹配的IP地址和端口号时,可以认为该业务数据包为尚未进行资源分配的某TCP连接对应的第一个业务数据包,还需要进行后续步骤的判定来确定是否需要为该TCP连接后续的业务数据传输分配资源。
进一步地,指定指标值还可以包括:协议号,即五元组中表征传输层所采用的协议(TCP协议或者UDP协议)的协议号。
全连接表还可以包括为客户端分配的其他资源,例如:序列号、确认号、RTT定时器、重传超时定时器、发送窗口大小、接收窗口大小、紧急指针中的一个或多个指标值。
S607、对S606中确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询。
进一步地,由于本实施例中通过对分配的序号进行第一运算,确定SYN+ACK数据包中的SEQ字段的值,第一个业务数据包中ACK字段的值和与该第一个业务数据包对应的SYN+ACK数据包中SEQ字段的值具有一定的数值关系,那么,可以根据接收到的第一个业务数据包的ACK字段的值确定该ACK数据包所对应TCP三次握手中的SYN+ACK数据包中的SEQ字段的值,并通过对该确定的SEQ字段的值进行第一运算的逆运算,确定该第一个业务数据包对应TCP连接对应的序号。
S608、当确定查询到的第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为该序号表征的TCP连接分配传输业务数据所需的资源。
本步骤中,可以对为第二查询值对应的序号分配的三次握手标识进行检查,当该三次握手标识置为完成三次握手时,为该序号表征的TCP连接分配传输业务数据所需的资源。
S609、针对分配了传输业务数据所需资源的TCP连接,解除标识该TCP连接的序号对该TCP连接的标识。
本步骤中,针对分配了传输业务数据所需资源的TCP连接,可以不使用为该TCP连接分配的序号对该TCP连接继续进行标识,也就是说,可以收回该分配的序号资源,用于标识后续新建的TCP连接。
实施例2:
本发明实施例2中,提供了一种资源分配方法,本发明实施例1提供的资源分配方法,解决现有技术中当发生TCP半连接洪水攻击以及TCP全连接洪水攻击时,被攻击服务器无法提供正常服务的问题。与实施例1提供的资源分配方法相比,能够进一步保证TCP连接的安全性,防止全连接攻击。如图8所示,具体包括如下步骤:
S801、当接收到客户端发送的SYN数据包时,对该SYN数据包中SEQ字段的值进行预设运算。
S802、为S801中预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征该SYN数据包所属TCP连接。
本步骤中,可以对该SYN数据包中SEQ字段的值进行预设运算,使用存储预设运算得到的标识值的表项序号对本次TCP连接进行标识。
本步骤中,可以对接收到的SYN数据包中SEQ字段的值进行预设运算得到标识值,较佳地,预设运算可以为加一运算,即可以将接收到的SYN数据包中SEQ字段的值加一,并将得到的和作为标识值。预设运算也可以为任意代数运算、哈希运算等。
本实施例中,连接请求表可以为预先建立的、用于存储各标识值的表。连接请求表的表项可以根据实际需要进行设置,较佳地,连接请求表可以包括标识各表项的序号域、用于存储标识值的标识值域、用于标识三次握手是否完成的域等。进一步地,初始化时,可以将连接请求表置为空表,即将标识三次握手是否完成的域全部置为0,将标识值域全部置为无效值,由于TCP协议中SEQ域的值为32位,最大值为0xFFFFFFFF,大于0x100000000的值即为无效的SEQ的值,那么,任何无效的SEQ值都可以作为标识值表项初始化的值,例如:0x1FFFFFFFF。
进一步地,本步骤中,可以通过多种方式确定空闲表项,例如,可以顺次确定连接请求表中的空闲表项,也可以通过预设算法对预设字段的值进行运算(例如:哈希运算)得到表项的序号,当该序号标识的表项空闲时,使用该空闲表项存储标识值。
S803、对存储所述标识值的表项的序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,并向客户端回复SYN+ACK数据包。
本步骤中,可以对存储标识值的表项的序号进行第一运算(例如:哈希运算、代数运算等),将处理之后的值作为SYN+ACK数据包中序列号SEQ字段的值。
进一步地,可以通过对存储S801中得到的标识值的表项的序号进行第一运算,将得到的值作为SYN+ACK数据包中SEQ字段的值,当接收到ACK数据包时,通过ACK数据包中ACK字段的值得到SYN+ACK数据包中SEQ字段的值,并通过第一运算的逆运算得到存储标识值的表项的序号,从而得到对应标识值的存储位置。
S804、当接收到ACK数据包时,基于该ACK数据包中ACK字段的值,确定该ACK数据包所回复的SYN+ACK数据包中SEQ字段的值。
S805、对S804中确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值作为表项的序号对连接请求表进行查询。
进一步地,本实施例中,通过对存储标识值的表项序号进行第一运算,确定SYN+ACK数据包中的SEQ字段的值,那么,可以根据接收到的ACK数据包的ACK字段的值确定该ACK数据包所回复的SYN+ACK数据包中的SEQ字段的值,并通过对该确定的SEQ字段的值进行第一运算的逆运算,确定该ACK数据包所属TCP连接对应标识值的存储表项序号。
较佳地,可以将存储标识值的表项的序号减一,将得到的差作为SYN+ACK数据包中的SEQ字段的值,那么,当接收到ACK数据包时,可以将ACK数据包中ACK字段的值确定为存储标识值的表项的序号。也就是说,第一运算为减一运算,第一运算的逆运算即为加一运算。
S806、将S805中查询到的第一查询值对应的连接请求表表项的序号表征的TCP连接标识为完成三次握手。
进一步地,在本实施例中,当执行完步骤S802,客户端和服务器端完成TCP半连接,在半连接阶段每个TCP连接仅分配了一个标识值,与现有技术中完成TCP半连接之后分配半连接资源相比,缓解了TCP半连接洪水攻击,
进一步地,可以将第一查询值对应的连接请求表的表项中的用于标识三次握手是否完成的域置为1,表征该表项存储的标识值对应的TCP连接已完成三次握手。
进一步地,进行到本步骤,如果仅为了防止TCP半连接洪水攻击,可以不执行后续步骤,直接为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。如果需要进一步防止TCP全连接洪水攻击,可以继续执行后续步骤。
S807、当接收到第一个业务数据包时,基于业务数据包中ACK字段的值,确定业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值。
本步骤中,由于SYN+ACK数据包中SEQ字段的值是根据存储标识值表项的序号确定的,而第一个业务数据包中ACK字段的值等于SYN+ACK数据包中SEQ字段的值加一,那么可以通过第一个业务数据包中ACK字段的值确定出SYN+ACK数据包中SEQ字段的值。
S808、对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值作为表项的序号对连接请求表进行查询。
进一步地,由于本实施例中通过对存储标识值的表项序号进行第一运算,确定SYN+ACK数据包中的SEQ字段的值,第一个业务数据包中ACK字段的值和与该第一个业务数据包对应的SYN+ACK数据包中SEQ字段的值具有一定的数值关系,那么,可以根据接收到的第一个业务数据包的ACK字段的值确定该ACK数据包所对应TCP三次握手中的SYN+ACK数据包中的SEQ字段的值,并通过对该确定的SEQ字段的值进行第一运算的逆运算,确定该第一个业务数据包对应TCP连接对应标识值的存储表项序号。
本步骤中,由于目前为止还未给业务数据包对应的TCP连接分配资源,也就是说没有记录该TCP连接对应的客户端的IP地址端口号等信息,因此,该TCP连接依然通过对应的表项序号所标识,因此,需要根据第一个业务数据包中携带的信息确定对应的表项序号,即标识值的存储位置。
S809、当S808中确定的第二查询值对应的连接请求表的表项满足如下条件时,为该表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源:
该表项序号所表征的TCP连接被标识为完成三次握手;以及
根据第一个业务数据包中SEQ字段的值确定第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值,并对确定的SYN数据包中SEQ字段的值进行预设运算,得到的结果与该表项存储的标识值一致。
本步骤中,当确定出第二查询值之后,不仅需要判断该第二查询值对应表项序号标识的TCP连接完成三次握手,还要对第二查询值对应的连接请求表的表项存储的标识值进行进一步判断,来确定是否为该表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源。对于伪造第一个业务数据包的攻击者,能够被检测出来,并不分配全连接资源,进一步防止了TCP洪水攻击。
具体地,第二查询值对应的连接请求表的表项需要满足如下两个条件:第一个条件:该表项序号所表征的TCP连接被标识为完成三次握手,也就是说,不能够在接收到一个未进行全连接资源分配的业务数据包时,即分配全连接资源,而是需要确认客户端在发送该业务数据包之前,已经与服务器端完成了三次握手;第二个条件:根据第一个业务数据包中SEQ字段的值确定第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值,并对确定的SYN数据包中SEQ字段的值进行预设运算,得到的结果与该表项存储的标识值一致,也就是说,不仅需要确定客户端在发送该业务数据包之前,已经与服务器端完成了三次握手,还需要进一步确定第一个业务数据包为非伪造的业务数据包,由于第一个业务数据包中SEQ字段的值与TPC连接三次握手中SYN数据包中SEQ字段的值之间具有一定的数值关系,通常情况下,第一个业务数据包中SEQ字段的值等于SYN数据包中SEQ字段的值加一,而标识值是根据SYN数据包中SEQ字段的值进行预设运算得到的,这里,可以将该第一个业务数据包中SEQ字段的值减一,并对得到的差(等于SYN数据包中SEQ字段的值)进行预设运算,如果预设运算得到的值与查询到的标识值一致,那么可以确定该业务数据包为该标识值所表征的TCP连接对应的第一个业务数据包,该TCP连接对应的客户端为正常的用户,而不是攻击者,可以为该TCP连接后续的业务数据传输分配全连接资源。
进一步地,当第二查询值对应的连接请求表的表项不满足上述两个条件中的任意一个条件时,则不为该TCP连接后续的业务数据传输分配全连接资源。
那么,本实施例提供的资源分配方法中,通过不分配半连接资源和延迟分配全连接资源,能够保证攻击类型的连接请求不会得到半连接资源和全连接资源,保证正常的访问连接请求被接收,保证正常用户的访问请求得到服务。
S810、将连接请求表中本次TCP连接对应的表项清空。
本步骤中,针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空。
较佳地,针对第二个条件,如果S801中所述的预设运算为加一运算,可以将接收到的业务数据包中SEQ字段的值减一,再进行加一运算,得到的值与存储的标识值一致,也就是说,第一个业务数据包中SEQ字段的值与存储的标识值一致。
进一步地,本步骤中,清空本次TCP连接对应的表项可以为将表征本次TCP连接对应的表项恢复为初始化状态。
进一步地,本步骤中将本次TCP连接对应的连接请求表中的表项清空之后,可以将为本次TCP连接分配的指定指标值存入全连接表。
S811、针对每个存储有标识值的表项,当达到预设删除条件时,将该表项清空。
本实施例中,针对每个TCP连接,在半连接阶段和全连接阶段,并未分配半连接资源和全连接资源,而只分配了该TCP连接对应的标识值,为了进一步保证服务器端不会因为分配过多的标识值而导致资源耗尽,可以为每个表项预设删除条件,当达到预设删除条件时,将该表项清空。
本步骤中,当达到预设删除条件时,可以将连接请求表中,对应表项的所有信息均删除,包括用于存储标识值的标识值域的内容、用于标识三次握手是否完成的域的内容等,即将被清空表项回复到连接请求表初始状态。
进一步地,本步骤在具体实施时可以采用以下三种实施方式中的任一种实施方式:
第一种:当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值。
在第一种实施方式中,可以为连接请求表设置最大表项数量,当连接请求表未满(即连接请求表被使用的表项数量未达到最大表项数量)时,可以按照预设顺序向连接请求表填入标识值,当连接请求表填满(即连接请求表被使用的表项数量达到最大表项数量)之后,可以按照各表项存入标识值的时间顺序,确定最先存入标识值的表项,并将确定的表项清空,这里,清空可以根据实际情况进行操作,例如,填入预设的无效SEQ值。被清空的表项即可用来存入接收到的新的SYN数据包对应的标识值信息。
第二种:针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时。
在第二种实施方式中,可以为连接请求表的每个表项设置定时器,并设置预设时长,并当该表项存入标识值时开始计时,当计时达到预设时长时,可以将该表项清空。
第三种:针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
在第三种实施方式中,可以将连接请求表划分为多个子表,并预设多个子表的使用顺序,按照预设的使用顺序顺次使用各个子表,也就是说,先使用多个子表中的一个子表进行标识值存储,当该子表被填满时,再启用下一个子表进行标识值存储,依此类推,当多个子表均被填满时,按照各子表启用的时间顺序,将第一个被启用的子表清空,并用于存储接收到的新的SYN数据包对应的标识值。
进一步地,本发明实施例提供的资源分配方法,使TCP状态跳转流程图发生了改变。图9a-9b为TCP状态跳转流程图,图9a为现有技术中TCP状态跳转流程图,如图9a所示,完整的TCP连接还包含中间的数据传输和连接撤销的过程。其中包含服务器主动连接和被动连接,在本发明中主要关注被动连接。在被动连接方式中,服务器端接收SYN数据包,向客户端回复SYN+ACK数据包,并为客户端分配半连接资源,此时,服务器端TCP状态由监听(LISTEN)状态901跳转为SYN接收(SYN_RECEIVE)状态902,当接收到该SYN+ACK数据包对应的ACK数据包之后,服务器端为客户端分配全连接资源,此时,服务器端的TCP状态由SYN_RECEIVE状态902跳转为建立(ESTABLISHED)状态903,表征该次TCP连接三次握手完成,服务器端和客户端正式建立了TCP连接。而本发明实施例提供的资源分配方法,在接收到客户端发送的第一个业务数据包,并确定该业务数据包对应的TCP连接已经完成了三次握手,才为客户端分配本次TCP连接所需的资源,也就是说,采用本发明实施例提供的资源分配方法,在TCP状态跳转流程中,在LISTEN状态901接收SYN数据包,回复SYN+ACK数据包,再接收ACK数据包,再接收第一个业务数据包,此时,如图9b中所示,服务器端TCP状态由LISTEN状态901直接跳转为ESTABLISHED状态903,而不会经过SYN_RECEIVE状态902,也就是说,本发明实施例提供的资源分配方法,在被动连接方式中,从LISTEN状态901跳转到ESTABLISHED状态903的条件为:接收SYN数据包,发送SYN+ACK数据包,接收ACK数据包,并接收该TCP连接的第一业务数据包。
下面针对实施例1,通过例1提供一种较佳的实施方式,假设S801中对SYN数据包中SEQ字段的值进行的预设运算为加一运算,对存储标识值的表项的序号进行的第一运算为减一运算,那么第一运算的逆运算为加一运算。这样设置的好处是:由于后续接收到客户端发送的第一个业务数据包中SEQ字段的值为SYN数据包中SEQ字段的值加一,那么,将SYN数据包中SEQ字段的值加一的和确定为标识值,在后续接收到第一个业务数据包时,可以直接使用第一个业务数据包中SEQ的值与标识值进行比对,与其他运算相比,节省了***资源,又由于TCP三次握手中接收到的ACK数据包中ACK字段的值、以及第一个业务数据包中ACK字段的值均为TCP三次握手中SYN+ACK数据包中SEQ字段的值加一,因此,将存储标识值的表项的序号减一,并将得到的差作为SYN+ACK数据包的SEQ字段的值,当后续接收到ACK数据包,或者第一个业务数据包时,可以直接将ACK数据包,或者第一个业务数据包中的ACK字段的值作为存储标识值表项的序号,来确定对应标识值的存储位置,与其他运算相比,节省了***资源。
例1:客户端和Web服务器之间应用本发明实施例提供的资源分配方法建立TCP连接,如图10所示,具体步骤如下:
S1001、Web服务器接收客户端发送的SYN数据包。
S1002、将SYN数据包中SEQ段的值加一得到标识值,并将该标识值存储于Web服务器预先建立的连接请求表的一个空闲表项中。
本步骤中,假设Web服务器未接收到客户端发送的SYN数据包时,连接请求表中已经保存了3个连接请求,分别占用了连接请求表的序号2、4和8的表项,空闲表项由无效SEQ值0x1FFFFFFFF表征,如表1所示:
表1
序号 | ACK | SEQ_ADD_ONE |
1 | 0 | 0x1FFFFFFFF |
2 | 1 | 0x012345678 |
3 | 0 | 0x1FFFFFFFF |
4 | 0 | 0x022334455 |
5 | 0 | 0x1FFFFFFFF |
6 | 0 | 0x1FFFFFFFF |
7 | 0 | 0x1FFFFFFFF |
8 | 0 | 0x022334488 |
在表1中,包括八个表项,每个表项中包括标识各表项的序号、用于存储标识值的标识值域SEQ_ADD_ONE、用于标识三次握手是否完成的域ACK,且当完成了三次握手时,对应表项的ACK域置为1,否则为置为0。
经过步骤S1001,假设接收到的SYN数据包中SEQ字段的值为0x020002000,且确定出的空闲表项为序号为1的表项,那么将0x020002000加1(即0x020002001)存入连接请求表之后,连接请求表如表2所示:
表2
序号 | ACK | SEQ_ADD_ONE |
1 | 0 | 0x020002001 |
2 | 1 | 0x012345678 |
3 | 0 | 0x1FFFFFFFF |
4 | 0 | 0x022334455 |
5 | 0 | 0x1FFFFFFFF |
6 | 0 | 0x1FFFFFFFF |
7 | 0 | 0x1FFFFFFFF |
8 | 0 | 0x022334488 |
S1003、向客户端回复SYN+ACK数据包,其中,SYN+ACK数据包中SEQ字段的值为对连接请求表中,存储S1002中得到的标识值的表项的序号进行减一运算得到的。
本步骤中,存储S1002中得到的标识值的表项的序号为1,那么减一运算后得到的值为0,将0x00000000确定为SYN+ACK数据包中SEQ字段的值,并将0x020002001确定为SYN+ACK数据包中ACK字段的值。
S1004、接收客户端发送的ACK数据包。
S1005、将ACK数据包中ACK字段的值确定为连接请求表的序号访问连接请求表,并将确定的序号标识的表项的ACK域置为1。
本步骤中,假设接收到的ACK数据包中ACK字段的值为0x00000001,那么将连接请求表中序号为1的表项的ACK域置为1,标识序号为1的表项存储的标识值表征的TCP连接完成了三次握手,此时连接请求表如表3所示:
表3
序号 | ACK | SEQ_ADD_ONE |
1 | 1 | 0x020002001 |
2 | 1 | 0x012345678 |
3 | 0 | 0x1FFFFFFFF |
4 | 0 | 0x022334455 |
5 | 0 | 0x1FFFFFFFF |
6 | 0 | 0x1FFFFFFFF |
7 | 0 | 0x1FFFFFFFF |
8 | 0 | 0x022334488 |
S1006、接收客户端发送的第一个业务数据包。
S1007、将该业务数据包中ACK字段的值确定为连接请求表的序号访问连接请求表,并将该业务数据包中SEQ字段的值与确定的序号标识的表项中SEQ_ADD_ONE域的值作比对。
S1008、当S1007中得到的比对的结果为二者一致,且S1007中确定的序号标识的表项中ACK域为1时,为客户端申请资源,并将接收到的业务数据提交到应用层。
本步骤中,假设接收到的第一个业务数据包中ACK域的值为0x00000001,SEQ字段的值为0x020002001,那么该客户端满足分配资源的条件。
S1009、将分配了资源的TCP连接对应的连接请求表中的表项清空。
本步骤中,可以从连接请求表中清空序号1对应的表项(即将序号1对应的ACK域置为0,将序号1对应的SEQ_ADD_ONE域置为0x1FFFFFFFF,清空序号1对应的表项后的连接请求表如表1所示。
S1010、与客户端进行后续业务数据包的交互。
进一步地,在本实施例提供的例1中,如果步骤S1004没有发生,即没有接收到ACK数据包,发生TCP半连接洪水攻击,由于仅为该TCP连接分配34位的数据(包括标识值:SEQ字段长度32位、用于存储标识值的标识值表项序号:1位、用于标识三次握手是否完成的表项:1位),而没有分配定时器,没有记录端口IP地址等信息,那么,此时占用的存储资源是现有技术中分配半连接资源的1/6,即:34/(32位源目的端口号,64位序列号和确认号,64位源目的IP地址,64位定时器),不占用计算资源,这样可以大大缓解TCP半连接洪水攻击对被攻击设备的影响。
如果接收到了ACK数据包,没有发生步骤1006,即没有接收到第一个业务数据包,发生TCP全连接洪水攻击,由于仅为这个连接分配34位的数据,没有分配定时器,没有记录端口IP地址等信息,没有分配数据缓冲区,那么,此时占用的存储资源是现有技术中分配全连接资源的1/256或者更低,即:34/(32位源目的端口号,64位序列号和确认号,64位源目的IP地址,64位定时器)+2048字节的发送接收缓冲区等,不占用计算资源,这样可以大大缓解TCP全连接洪水攻击对被攻击设备的影响。
实施例3:
本发明实施例3中,提供了一种资源分配方法,本发明实施例3提供的资源分配方法,提供了如下应用场景:客户端、防火墙和FTP服务器,由防火墙作为FTP服务器的代理与客户端建立TCP连接,并在确定客户端为正常用户之后与FTP服务器建立TCP连接。如图11所示,具体包括如下步骤:
S1101、防火墙接收客户端发送的SYN数据包。
S1102、防火墙对S1101接收的SYN数据包中SEQ字段的值进行预设运算得到标识值,并将该标识值存储于连接请求表的空闲表项。
S1103、防火墙向客户端回复SYN+ACK数据包,其中,SYN+ACK数据包中SEQ字段的值为对S1101中存储标识值的表项的序号进行第一运算得到的。
S1104、防火墙接收ACK数据包。
S1105、基于S1104中接收的ACK数据包中ACK字段的值,确定该ACK数据包所属TCP连接中SYN+ACK数据包中SEQ字段的值。
S1106、防火墙对S1105中确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值作为表项的序号对连接请求表进行查询。
S1107、防火墙将S1106中查询到的第一查询值对应的连接请求表的表项的序号表征的TCP连接标识为完成三次握手。
S1108、防火墙接收TCP连接对应的第一个业务数据包。
S1109、基于S1108中接收的业务数据包中ACK字段的值,确定业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值。
S1110、防火墙对S1109中确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值作为表项的序号对连接请求表进行查询。
S1111、当第二查询值对应的连接请求表的表项满足如下条件时,防火墙为该表项序号表征的TCP连接申请本次TCP连接中传输业务数据所需的资源,并将第二查询值对应的连接请求表的表项清空:
该表项序号所表征的TCP连接被标识为完成三次握手;以及
根据第一个业务数据包中SEQ字段的值确定第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值,并对确定的SYN数据包中SEQ字段的值进行S1001中的预设运算,得到的结果与该表项存储的标识值一致。
S1112、防火墙向FTP服务器发送SYN数据包发起TCP连接请求。
进一步地,本步骤中,防火墙向FTP服务器发送的SYN数据包中,SEQ字段的值可以与客户端发送给防火墙的SYN数据包中SEQ字段的值相同或不同。
S1113、FTP服务器向防火墙回复SYN+ACK数据包。
S1114、防火墙向FTP服务器回复ACK数据包。
S1115、防火墙将S1108中接收的客户端发送的第一业务数据包转发给FTP服务器。
S1116、防火墙接收后续的客户端发送的业务数据。
S1117、防火墙将接收的后续的客户端发送的业务数据转发给FTP服务器。
下面针对实施例3,通过例2提供一种较佳的实施方式,假设S1101中对SYN数据包中SEQ字段的值进行的预设运算为加一运算,对存储标识值的表项的序号进行的第一运算为减一运算,那么第一运算的逆运算为加一运算。
例2:客户端和FTP服务器之间通过防火墙应用本发明实施例提供的资源分配方法建立TCP连接,如图12所示,具体步骤如下:
S1201、防火墙接收客户端发送的SYN数据包。
S1202、将S1201中接收的SYN数据包中SEQ字段的值加1得到标识值,并将该标识值存储于连接请求表的一个空闲表项。
本步骤中,假设S1201中接收到的SYN数据包中SEQ字段的值为0x10001000,那么标识值为0x10001001,又假设连接请求表中,序号为1、4、8的表项已经被占用,本次确定使用序号为7的空闲表项记录该标识值,空闲表项由无效SEQ值0x1FFFFFFFF表征,如表4所示:
表4
序号 | ACK | SEQ_ADD_ONE |
1 | 1 | 0x010002222 |
2 | 0 | 0x1FFFFFFFF |
3 | 0 | 0x1FFFFFFFF |
4 | 0 | 0x022334455 |
5 | 0 | 0x1FFFFFFFF |
6 | 0 | 0x1FFFFFFFF |
7 | 0 | 0x010001001 |
8 | 0 | 0x022334488 |
S1203、防火墙向TCP连接对应的客户端回复SYN+ACK数据包,其中,SYN+ACK数据包中SEQ字段的值为对连接请求表中,存储S1202中标识值的表项序号进行减一运算得到的。
本步骤中,由于存储S1201中标识值的表项序号为7,那么将7减一,将得到的0x00000006作为SYN+ACK数据包中SEQ字段的值。
S1204、防火墙接收ACK数据包。
S1205、将S1204接收的ACK数据包中ACK字段的值确定为连接请求表的序号,访问连接请求表。
本步骤中,假设客户端回复了ACK数据包,且ACK数据包中ACK字段的值为0x00000007,可以确定连接请求表中序号为7的表项存储的标识值为该ACK数据包所属TCP连接对应的标识值。
S1206、将S1205中确定的序号表征的TCP连接标识为完成三次握手。
本步骤中,将连接请求表中序号为7的表项中,ACK域置为1,表征该表项序号表征的TCP连接完成了三次握手,此时连接请求表如表5所示:
表5
序号 | ACK | SEQ_ADD_ONE |
1 | 1 | 0x010002222 |
2 | 0 | 0x1FFFFFFFF |
3 | 0 | 0x1FFFFFFFF |
4 | 0 | 0x022334455 |
5 | 0 | 0x1FFFFFFFF |
6 | 0 | 0x1FFFFFFFF |
7 | 1 | 0x010001001 |
8 | 0 | 0x022334488 |
S1207、防火墙接收TCP连接对应的第一个业务数据包。
S1208、将S1207中接收的业务数据包中ACK字段的值确定为连接请求表的序号,访问连接请求表。
本步骤中,假设防火墙接收到业务数据包,并确定该数据包为对应TCP连接的第一个业务数据包,该业务数据包中ACK字段的值为0x00000007,SEQ字段的值为0x10001001,长度Len为0x20,将该业务数据包中ACK字段的值确定为连接请求表的序号。
S1209、当S1208中确定的表项满足如下条件时,防火墙为该表项序号所表征的TCP连接申请本次TCP连接中传输业务数据所需的资源,并将该确定的表项清空:
该表项的ACK域值为1;以及
业务数据包中SEQ字段的值与S1208中确定的表项存储的标识值一致。
本步骤中,将第一业务数据包中SEQ字段的值与由第一业务数据包中ACK字段的值确定的序号7对应的表项存储的标识值进行比对,如果第一业务数据包中SEQ字段的值为0x010001001,则为该标识值表征的TCP连接申请本次TCP连接中传输业务数据所需的资源,并且还可以从连接请求表中清空序号7对应的表项(即将序号7对应的ACK置为0,将序号7对应的SEQ_ADD_ONE置为0x1FFFFFFFF);如果第一业务数据包中SEQ字段的值不为0x010001001,则丢弃该第一业务数据包,并且不为该表项序号表征的TCP连接申请本次TCP连接中传输业务数据所需的资源,也不会将该业务数据包转发给FTP服务器。
S1210、防火墙向FTP服务器发送SYN数据包发起TCP连接请求。
本步骤中假设防火墙向FTP服务器发送的SYN数据包中SEQ字段值与防火墙接收的客户端发送的SYN数据包中SEQ字段的值不同,为0x00002100。
S1211、FTP服务器向防火墙回复SYN+ACK数据包。
本步骤中,假设SYN+ACK数据包中各字段的值与客户端发送给防火墙的对应字段的值不同,即SEQ字段的值为0x00008000,ACK字段的值为0x00002101。
S1212、防火墙向FTP服务器回复ACK数据包。
本步骤中,假设该ACK数据包中ACK字段的值与客户端发送给防火墙的ACK数据包的ACK字段的值不同,即为0x00008001。
S1213、防火墙将S1207中接收的客户端发送的第一业务数据包转发给FTP服务器。
本步骤中,假设该第一个业务数据包中各字段的值与客户端发送给防火墙的第一个数据包的各字段的值不同,即ACK字段的值为0x00008001,SEQ字段的值为0x00002101,长度Len为0x20。
S1214、防火墙接收后续的客户端发送的业务数据。
S1215、防火墙将接收的后续的客户端发送的业务数据转发给FTP服务器。
基于同一发明构思,本发明实施例还提供了一种资源分配装置,由于这些装置所解决问题的原理与前述资源分配方法相似,因此该装置的实施可以参见前述方法的实施,重复之处不再赘述。
本发明实施例提供的一种资源分配装置之一,如图13所示,包括如下模块:
接收模块1301,用于接收客户端发送的数据包;
第一分配模块1302,用于当所述接收模块1301接收到客户端发送的SYN数据包时,为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;
运算模块1303,用于对所述第一分配模块1302分配的所述序号进行第一运算;
发送模块1304,用于将所述运算模块1303得到的运算结果作为SYN+ACK数据包中SEQ字段的值,并向所述客户端回复所述SYN+ACK数据包;
确定模块1305,用于当所述接收模块1301接收到ACK数据包时,基于所述ACK数据包中ACK字段的值,确定所述ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;
查询模块1306,用于对所述确定模块1305确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;
标识模块1307,用于将所述查询模块1306查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手;
第二分配模块1308,为所述标识模块1307标识的完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。
进一步地,所述确定模块1305,还用于在所述第二分配模块1308在为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源之前,当所述接收模块接收到第一个业务数据包时,基于所述业务数据包中ACK字段的值,确定所述业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值;
所述查询模块1306,还用于对所述确定模块1305确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询;
所述第二分配模块1308,具体用于当确定所述查询模块1306查询到的所述第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为所述第二查询值对应的序号表征的TCP连接分配传输业务数据所需的资源。
进一步地,所述运算模块1303,还用于当所述接收模块1301接收到客户端发送的SYN数据包时,对所述SYN数据包中SEQ字段的值进行预设运算;
所述第一分配模块1302,具体用于为所述运算模块1303通过预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征所述SYN数据包所属TCP连接;
所述运算模块1303,具体用于对所述第一分配模块1302分配的存储所述标识值的表项的序号进行第一运算;
所述查询模块1306,具体用于将经过第一运算的逆运算得到的第一查询值作为表项的序号对所述连接请求表进行查询;以及将经过第一运算的逆运算得到的第二查询值作为表项的序号对所述连接请求表进行查询;
所述标识模块1307,具体用于将所述查询模块1306查询到的所述第一查询值对应的所述连接请求表表项的序号表征的TCP连接标识为完成三次握手;
所述第二分配模块1308,具体用于为所述第二查询值对应的所述连接请求表的表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源,还需要满足以下条件:根据所述第一个业务数据包中SEQ字段的值确定所述第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值;并对确定的SYN数据包中SEQ字段的值进行所述预设运算,得到的结果与该表项存储的标识值一致。
进一步地,所述确定模块1305,还用于采用如下方式确定所述接收模块1301接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;当所述全连接表中不存在与所述接收到的业务数据包对应的所述指定指标值对应的表项时,确定所述接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,其中,所述全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,所述指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
进一步地,所述装置,还包括:清空模块1309;
所述清空模块1309,用于针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空;或者
当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值;或者
针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时;或者
针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
进一步地,本发明实施例可以提供一种设备,包括上述的资源分配装置之一,例如:Web服务器、FTP服务器、防火墙设备等。
基于同一发明构思,本发明实施例还提供了一种资源分配装置,由于这些装置所解决问题的原理与前述资源分配方法相似,因此该装置的实施可以参见前述方法的实施,重复之处不再赘述。
本发明实施例提供的一种资源分配装置之二,如图14所示,包括:
接收器1401,用于接收客户端发送的数据包;
处理器1402,用于当所述接收器1401接收到客户端发送的SYN数据包时,为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;对所述序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值;以及当所述接收器1401接收到ACK数据包时,基于所述ACK数据包中ACK字段的值,确定所述ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;将查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手;为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源;
发送器1403,用于向客户端回复针对所述接收器1401接收的SYN数据包的SYN+ACK数据包。
进一步地,所述处理器1402,还用于在为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源之前,当所述接收器1401接收到第一个业务数据包时,基于所述业务数据包中ACK字段的值,确定所述业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值;对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询;当确定查询到的所述第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为所述第二查询值对应的序号表征的TCP连接分配传输业务数据所需的资源。
进一步地,所述处理器1402,还用于当所述接收器1401接收到客户端发送的SYN数据包时,对所述SYN数据包中SEQ字段的值进行预设运算;
所述处理器1402,具体用于为预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征所述SYN数据包所属TCP连接;对存储所述标识值的表项的序号进行第一运算;将经过第一运算的逆运算得到的第一查询值作为表项的序号对所述连接请求表进行查询;将查询到的所述第一查询值对应的所述连接请求表表项的序号表征的TCP连接标识为完成三次握手;以及将经过第一运算的逆运算得到的第二查询值作为表项的序号对所述连接请求表进行查询;为所述第二查询值对应的所述连接请求表的表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源,还需要满足以下条件:根据所述第一个业务数据包中SEQ字段的值确定所述第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值;并对确定的SYN数据包中SEQ字段的值进行所述预设运算,得到的结果与该表项存储的标识值一致。
进一步地,所述处理器1402,还用于采用如下方式确定所述接收器1401接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;当所述全连接表中不存在与所述接收到的业务数据包对应的所述指定指标值对应的表项时,确定所述接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,其中,所述全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,所述指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
进一步地,所述处理器1402,还用于针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空;或者
当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值;或者
针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时;或者
针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
进一步地,本发明实施例可以提供一种设备,包括上述的资源分配装置之二,例如:Web服务器、FTP服务器、防火墙设备等。
上述各单元的功能可对应于图5至图6、图8、图10-图12所示流程中的相应处理步骤,在此不再赘述。
本发明实施例提供的一种资源分配方法及装置,当接收到客户端发送的SYN数据包时,为SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;对分配的序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,并向客户端回复所述SYN+ACK数据包;当接收到ACK数据包时,基于ACK数据包中ACK字段的值,确定ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;并对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;将查询到的第一查询值对应的序号所表征的TCP连接标识为完成三次握手;为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。本发明实施例提供的资源分配方法,在完成TCP全连接之后,才为完成全连接的TCP连接分配后续业务数据传输所需的资源,当发生半连接阶段的TCP洪水攻击时,由于并没有在半连接阶段为TCP连接分配半连接对应的资源,每个TCP连接仅分配了用于表征该TCP连接的一个序号,缓解了TCP洪水攻击对网络服务器的影响,保证了网络服务器在受到TCP半连接洪水攻击时,不会因为在半连接阶段为每个TCP连接分配半连接资源而耗尽资源,能够保证为正常TCP连接的用户提供正常的服务。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明实施例可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
1.一种资源分配方法,其特征在于,包括:
当接收到客户端发送的SYN数据包时,为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;
对分配的所述序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,并向所述客户端回复所述SYN+ACK数据包;其中,所述第一运算为代数运算或哈希运算;
当接收到ACK数据包时,基于所述ACK数据包中ACK字段的值,确定所述ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;并
对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;
将查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手;
为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。
2.如权利要求1所述的方法,其特征在于,在为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源之前,还包括:
当接收到第一个业务数据包时,基于所述业务数据包中ACK字段的值,确定所述业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值;并
对确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询;
为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源,具体包括:
当确定查询到的所述第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为所述第二查询值对应的序号表征的TCP连接分配传输业务数据所需的资源。
3.如权利要求2所述的方法,其特征在于,当接收到客户端发送的SYN数据包时,还包括:
对所述SYN数据包中SEQ字段的值进行预设运算;
为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号,具体包括:
为所述预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征所述SYN数据包所属TCP连接;
对分配的所述序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值,具体包括:
对存储所述标识值的表项的序号进行第一运算,将得到的结果作为SYN+ACK数据包中SEQ字段的值;
将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询,具体包括:
将经过第一运算的逆运算得到的第一查询值作为表项的序号对所述连接请求表进行查询;
将查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手,具体包括:
将查询到的所述第一查询值对应的所述连接请求表表项的序号表征的TCP连接标识为完成三次握手;
将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询,具体包括:
将经过第一运算的逆运算得到的第二查询值作为表项的序号对所述连接请求表进行查询;
为所述第二查询值对应的所述连接请求表的表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源,还需要满足以下条件:
根据所述第一个业务数据包中SEQ字段的值确定所述第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值;并
对确定的SYN数据包中SEQ字段的值进行所述预设运算,得到的结果与该表项存储的标识值一致。
4.如权利要求2或3所述的方法,其特征在于,采用如下方式确定接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:
当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;
当所述全连接表中不存在与所述接收到的业务数据包对应的所述指定指标值对应的表项时,确定所述接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,
其中,所述全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,所述指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
5.如权利要求1-3任一项所述的方法,其特征在于,还包括:
针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空;或者
当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值;或者
针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时;或者
针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
6.一种资源分配装置,其特征在于,包括:
接收模块,用于接收客户端发送的数据包;
第一分配模块,用于当所述接收模块接收到客户端发送的SYN数据包时,为所述SYN数据包所属TCP连接分配用于表征该TCP连接的、与已分配序号不重复的序号;
运算模块,用于对所述第一分配模块分配的所述序号进行第一运算;其中,所述第一运算为代数运算或哈希运算;
发送模块,用于将所述运算模块得到的运算结果作为SYN+ACK数据包中SEQ字段的值,并向所述客户端回复所述SYN+ACK数据包;
确定模块,用于当所述接收模块接收到ACK数据包时,基于所述ACK数据包中ACK字段的值,确定所述ACK数据包所回复的SYN+ACK数据包中SEQ字段的值;
查询模块,用于对所述确定模块确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第一查询值在已分配的各序号中进行查询;
标识模块,用于将所述查询模块查询到的所述第一查询值对应的序号所表征的TCP连接标识为完成三次握手;
第二分配模块,为所述标识模块标识的完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源。
7.如权利要求6所述的装置,其特征在于,所述确定模块,还用于在所述第二分配模块在为完成TCP连接三次握手的客户端分配本次TCP连接中传输业务数据所需的资源之前,当所述接收模块接收到第一个业务数据包时,基于所述业务数据包中ACK字段的值,确定所述业务数据包对应TCP连接中SYN+ACK数据包中SEQ字段的值;
所述查询模块,还用于对所述确定模块确定的SEQ字段的值进行第一运算的逆运算,并将经过第一运算的逆运算得到的第二查询值在已分配的各序号中进行查询;
所述第二分配模块,具体用于当确定所述查询模块查询到的所述第二查询值对应的序号所表征的TCP连接被标识为完成三次握手时,为所述第二查询值对应的序号表征的TCP连接分配传输业务数据所需的资源。
8.如权利要求7所述的装置,其特征在于,所述运算模块,还用于当所述接收模块接收到客户端发送的SYN数据包时,对所述SYN数据包中SEQ字段的值进行预设运算;
所述第一分配模块,具体用于为所述运算模块通过预设运算得到的标识值分配连接请求表的空闲表项存储该标识值,并使用所分配空闲表项的序号表征所述SYN数据包所属TCP连接;
所述运算模块,具体用于对所述第一分配模块分配的存储所述标识值的表项的序号进行第一运算;
所述查询模块,具体用于将经过第一运算的逆运算得到的第一查询值作为表项的序号对所述连接请求表进行查询;以及将经过第一运算的逆运算得到的第二查询值作为表项的序号对所述连接请求表进行查询;
所述标识模块,具体用于将所述查询模块查询到的所述第一查询值对应的所述连接请求表表项的序号表征的TCP连接标识为完成三次握手;
所述第二分配模块,具体用于为所述第二查询值对应的所述连接请求表的表项序号表征的TCP连接分配本次TCP连接中传输业务数据所需的资源,还需要满足以下条件:根据所述第一个业务数据包中SEQ字段的值确定所述第一个业务数据包对应的TCP连接中SYN数据包中SEQ字段的值;并对确定的SYN数据包中SEQ字段的值进行所述预设运算,得到的结果与该表项存储的标识值一致。
9.如权利要求7或8所述的装置,其特征在于,所述确定模块,还用于采用如下方式确定所述接收模块接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包:当接收到业务数据包时,根据接收到的业务数据包对应的TCP连接的指定指标值查询全连接表;当所述全连接表中不存在与所述接收到的业务数据包对应的所述指定指标值对应的表项时,确定所述接收到的业务数据包为该业务数据包对应TCP连接的第一个业务数据包,其中,所述全连接表用于为分配了传输业务数据所需资源的TCP连接存储指定指标值,所述指定指标值包括:TCP连接的源IP地址、目的IP地址、源端口号、目的端口号。
10.如权利要求6-8任一项所述的装置,其特征在于,还包括:清空模块;
所述清空模块,用于针对每个存储有标识值的表项,在为该表项序号表征的TCP连接分配了传输业务数据所需的资源之后,将该表项清空;或者
当连接请求表中,存储有标识值的表项数量达到预设最大表项数量,且接收到新的SYN数据包时,将最先存入标识值的表项清空,并使用清空的空闲表项存储所述新的SYN数据包所属TCP连接对应的标识值;或者
针对连接请求表中每个存储有标识值的表项,当该表项对应的定时器计时达到预设时长时,将该表项清空,其中,所述定时器用于当该定时器对应的表项存入标识值时开始计时;或者
针对连接请求表中预先划分的各子表,当所述各子表包含的所有表项均存储有标识值,且接收到新的SYN数据包时,将最先被存满的子表清空,并使用清空的子表中的表项存储所述新的SYN数据包所属TCP连接对应的标识值,其中,所述连接请求表中的各子表用于按照预设顺序顺次使用所述各子表进行标识值存储,并在当前子表被存满时,启用下一个子表进行标识值存储。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410223308.2A CN105099952B (zh) | 2014-05-23 | 2014-05-23 | 一种资源分配方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410223308.2A CN105099952B (zh) | 2014-05-23 | 2014-05-23 | 一种资源分配方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105099952A CN105099952A (zh) | 2015-11-25 |
CN105099952B true CN105099952B (zh) | 2018-12-07 |
Family
ID=54579529
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410223308.2A Active CN105099952B (zh) | 2014-05-23 | 2014-05-23 | 一种资源分配方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105099952B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106060158B (zh) * | 2016-06-30 | 2020-04-07 | 杭州朗和科技有限公司 | 一种判断目标设备的状态的方法和装置 |
CN107995233B (zh) * | 2016-10-26 | 2021-12-17 | 阿里巴巴集团控股有限公司 | 建立连接的方法及相应的设备 |
CN109413058A (zh) * | 2018-10-17 | 2019-03-01 | 山东渔翁信息技术股份有限公司 | 一种服务器与终端设备的信息通信方法、装置及相关设备 |
CN112867163B (zh) * | 2020-12-30 | 2022-09-23 | 京信网络***股份有限公司 | 空口资源调度的方法、装置、计算机设备及存储介质 |
CN114500021A (zh) * | 2022-01-18 | 2022-05-13 | 神州绿盟成都科技有限公司 | 一种攻击检测方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1630248A (zh) * | 2003-12-19 | 2005-06-22 | 北京航空航天大学 | 基于连接请求验证的SYN flooding攻击防御方法 |
CN101282209A (zh) * | 2008-05-13 | 2008-10-08 | 杭州华三通信技术有限公司 | 防范dns请求报文泛洪攻击的方法及设备 |
CN103546486A (zh) * | 2013-11-04 | 2014-01-29 | 北京荣之联科技股份有限公司 | 一种防DDOS攻击的SYN Cookie源认证方法及其装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101299668A (zh) * | 2008-06-30 | 2008-11-05 | 华为技术有限公司 | 一种通信的建立方法、***和装置 |
CN101729513B (zh) * | 2008-10-27 | 2014-02-19 | 华为数字技术(成都)有限公司 | 网络认证方法和装置 |
-
2014
- 2014-05-23 CN CN201410223308.2A patent/CN105099952B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1630248A (zh) * | 2003-12-19 | 2005-06-22 | 北京航空航天大学 | 基于连接请求验证的SYN flooding攻击防御方法 |
CN101282209A (zh) * | 2008-05-13 | 2008-10-08 | 杭州华三通信技术有限公司 | 防范dns请求报文泛洪攻击的方法及设备 |
CN103546486A (zh) * | 2013-11-04 | 2014-01-29 | 北京荣之联科技股份有限公司 | 一种防DDOS攻击的SYN Cookie源认证方法及其装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105099952A (zh) | 2015-11-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105099952B (zh) | 一种资源分配方法及装置 | |
JP6858749B2 (ja) | 負荷平衡システムにおいて接続を確立するデバイス及び方法 | |
US7860975B2 (en) | System and method for secure sticky routing of requests within a server farm | |
CN107948324B (zh) | 请求传输***、方法、装置及存储介质 | |
CN106656849B (zh) | 报文限速方法及装置 | |
EP3352431B1 (en) | Network load balance processing system, method, and apparatus | |
CN105553977B (zh) | 请求消息的处理、发送方法及装置 | |
CN1954576B (zh) | 处理启动请求的方法、装置和*** | |
CN103781055A (zh) | 一种数据下载方法及相关设备 | |
CN109818997A (zh) | 一种负载均衡方法、***及存储介质 | |
CN109600302A (zh) | 一种有序通讯的方法、装置、存储介质及电子设备 | |
EP3794795A1 (en) | Systems and methods for propagating data packets in a network of nodes | |
CN102655509A (zh) | 一种网络攻击识别方法及装置 | |
CN108989438A (zh) | 数据分发网络的实现方法、装置和*** | |
CN109039687A (zh) | 请求的负载均衡方法、装置、***、设备以及存储介质 | |
CN106488055B (zh) | 话单排重方法、数据节点设备及路由节点设备 | |
CN102427452B (zh) | 同步报文发送方法、装置和网络设备 | |
CN106131039A (zh) | Syn洪泛攻击的处理方法及装置 | |
MXPA06001530A (es) | Sugerencias de enrutamiento. | |
CN109413224A (zh) | 报文转发方法和装置 | |
CN107104919A (zh) | 防火墙设备、流控制传输协议sctp报文的处理方法 | |
CN107547690A (zh) | Nat中的端口分配方法、装置、nat设备及存储介质 | |
CN108011801A (zh) | 数据传输的方法、设备、装置及*** | |
CN110535959A (zh) | 一种传输数据的方法、装置和计算机可读存储介质 | |
CN106060155B (zh) | P2p资源共享的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |