一种在故障切换时保持tcp连接的方法

文档序号:8002968阅读:183来源:国知局
一种在故障切换时保持tcp连接的方法
【专利摘要】本发明涉及一种在故障切换时保持TCP连接的方法,在主调度服务器与备调度服务器上同时执行以下步骤:接收并分析IP包,对于来自客户端的不存在连接记录的IP包做预处理,预处理包括:若是TCP数据包,从一组真实服务器中选出一台服务器,与选定服务器的地址和响应端口补建TCP连接,生成并保存连接记录,若不是TCP数据包,从一组真实服务器中选出一台服务器,生成并保存连接记录;然后将来自客户端IP包的目标地址和目标端口改写为选出的真实服务器的地址和端口,对于属于补建TCP连接的IP包,还要将源地址和源端口改为补建连接的本地地址和本地端口,同时改写TCP头部的序号和确认序号,再将改写后的IP包发送给所述选出的真实服务器。
【专利说明】一种在故障切换时保持TCP连接的方法

【技术领域】
[0001]本发明涉及通信【技术领域】,特别涉及在故障切换时保持TCP连接的方法。

【背景技术】
[0002]故障切换(failover)指在发生故障时提供一种保护机制,当一台服务器失效时,另一台服务器会立刻接替工作,故障切换通过冗余来实现高可用性。
[0003]Linux Virtual Server (简称LVS)是基于Linux服务器集群解决方案,如图1所不,以 VS/NAT (Virtual Server via NAT)模式为例,客户端 100 通过 Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度服务器(假设为主调度服务器102),调度服务器从一组真实服务器中选出一台服务器,例如真实服务器105,将报文的目标地址Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器,同时调度服务器器在连接Hash表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务器,当来自真实服务器的响应报文经过调度服务器时,调度服务器将报文的源地址和源端口改为Virtual IPAddress和相应的端口,再把报文发给客户端。
[0004]以LVS架设的主备调度服务器实现的高可用性为例,当主调度服务器102故障时,备调度服务器103通过心跳检测到主调度服务器故障,然后自动接管主调度服务器的工作,用户只感觉到一个虚拟服务器。
[0005]然后现有技术中的上述故障切换方法存在以下缺点:
[0006]在故障切换时,当与某一已建立连接属于同一 TCP连接的报文被备调度服务器均衡到不同的真实服务器时,该真实服务器接收到报文后,并不知道数据报文段中提到的连接,TCP处理的原则是接收方以复位作为应答,客户端将收到RST报文,造成连接被异常终止。因此对已经建立连接的TCP连接,在故障切换时,容易导致客户端TCP连接异常终止。


【发明内容】

[0007]本发明的目的在于克服现有技术中的故障切换方法容易导致客户端TCP连接异常终止的缺陷,从而提供一种在故障切换时保持TCP连接的方法。
[0008]为了实现上述目的,本发明提供了一种在故障切换时保持TCP连接的方法,在主调度服务器与备调度服务器上同时执行以下步骤:
[0009]接收并分析IP包,对于来自客户端的不存在连接记录的IP包做预处理,所述预处理包括:若是TCP数据包,从一组真实服务器中选出一台服务器,与选定服务器的地址和响应端口补建TCP连接,生成并保存连接记录,若不是TCP数据包,从一组真实服务器中选出一台服务器,生成并保存连接记录;然后将来自客户端IP包的目标地址和目标端口改写为选出的真实服务器的地址和端口,对于属于补建TCP连接的IP包,还要将源地址和源端口改为补建连接的本地地址和本地端口,同时改写TCP头部的序号和确认序号,再将改写后的IP包发送给所述选出的真实服务器。
[0010]上述技术方案中,还包括:对于来自真实服务器的IP包,若存在连接记录,将所述IP包的源地址和源端口改为虚拟IP地址和相应的端口,对于属于补建TCP连接的IP包,还要将目标地址和目标端口改写为客户端IP和客户端端口,同时改写TCP头部的序号和确认序号,再将改写后的IP包发送给客户端;若不存在连接记录,丢弃所述IP包。
[0011]上述技术方案中,该方法具体包括:
[0012]步骤I)、主调度服务器或备调度服务器接收并分析IP包,判断IP包的发送者;
[0013]步骤2)、若所述IP包来自客户端,执行步骤3),若所述IP包来自真实服务器,执行步骤9);
[0014]步骤3)、检查连接记录表,判断所述IP包是否存在连接记录,若存在,执行步骤8),否则执行步骤4);其中,所述连接记录表中的每一条记录至少包括:客户端IP、客户端端口、补建连接本地IP、补建连接本地端口、真实服务器IP、真实服务器端口、序号差、确认序号差;
[0015]步骤4)、分析所述IP包的IP头部和传输层头部,判断IP包类型;
[0016]步骤5)、若所述IP包为TCP数据包,执行步骤6),否则,执行步骤7);
[0017]步骤6)、从一组真实服务器中选出一台服务器,然后将主调度服务器或备调度服务器作为客户端与本步骤中所选出服务器的地址和相应端口补充建立TCP连接,生成一条新的连接记录,并将新生成的连接记录保存到连接记录表中,接着执行步骤8);
[0018]步骤7)、从一组真实服务器中选出一台服务器,然后生成一条新的连接记录,并将新生成的连接记录保存到连接记录表中,接着执行步骤8);
[0019]步骤8)、将所述IP包的目标地址和目标端口改写为所述连接记录中所包含的选出的真实服务器的地址和端口 ;若所述IP包属于补建TCP连接的IP包,则还需要将源地址和源端口改为补建TCP连接的本地地址和本地端口,同时改写TCP头部的序号和确认序号;最后将上述改写后的IP包发送给所述选出的真实服务器,执行步骤12);
[0020]步骤9)、检查连接记录表,判断来自真实服务器的IP包是否存在连接记录,若存在,执行步骤10),否则,执行步骤11);
[0021]步骤10)、将所述IP包的源地址和源端口改为虚拟IP地址和相应的端口,并进一步判断所述IP包是否属于补建TCP连接的IP包,若属于,将目标地址和目标端口改写为客户端IP和客户端端口,同时改写TCP头部的序号和确认序号,然后把改写后的IP包发给客户端,再执行步骤12),否则,直接把改写后的IP包发给客户端,然后执行步骤12);
[0022]步骤11)、丢弃所述IP包;
[0023]步骤12)、流程结束。
[0024]上述技术方案中,在所述的步骤I)中,判断IP包的发送者包括:若IP目标地址为虚拟IP地址,则所述IP包来自客户端,若源地址为真实服务器,则所述IP包来自真实服务器。
[0025]上述技术方案中,在所述的步骤3)中,判断所述IP包是否存在连接记录包括:当所述来自客户端的IP包的源IP、源端口与连接记录表中客户端IP、客户端端口相等时,表示所述IP包对应在连接记录表中存在记录。
[0026]上述技术方案中,在所述的步骤6)或步骤7)中,从一组真实服务器中选出一台服务器的方法包括以下任意一种:轮循算法、加权轮循算法、目的地址哈希算法、源地址哈希算法、最小连接算法。
[0027]上述技术方案中,在所述的步骤6)中,生成一条新的连接记录包括:将所述IP包的源IP和源端口作为连接记录中的客户端IP和客户端端口,将本步骤中补建连接的本地IP和本地端口作为所述连接记录中的补建连接本地IP和补建连接本地端口,将本步骤中所选择的真实服务器的地址和端口作为所述连接记录中的真实服务器IP和真实服务器端口,将所述IP包的TCP头部的SEQ字段减去补建连接建立过程中三次握手最后一个确认包的SEQ作为所述连接记录中的序号差,将所述IP包的TCP头部的ACK字段减去补建连接建立过程中三次握手最后一个确认包作为所述连接记录中的ACK确认序号差。
[0028]上述技术方案中,在所述的步骤7)中,生成一条新的连接记录包括:将所述IP包的源IP和源端口作为所述连接记录中的客户端IP和客户端端口,将所述连接记录中的补建连接本地IP和补建连接本地端口设置为空,将本步骤中所选择的真实服务器的地址和端口作为所述连接记录中的真实服务器IP和真实服务器端口,将所述连接记录中的序号差设置为零,将所述连接记录中的确认序号差设置为零。
[0029]上述技术方案中,在所述的步骤8)中,改写TCP头部的序号包括:将TCP头部的序号改为原TCP头部序号减连接记录中的序号差;改写TCP头部的确认序号包括:将TCP头部的确认序号改为原TCP头部确认序号减连接记录中的确认序号差。
[0030]上述技术方案中,在所述的步骤10)中,改写TCP头部的序号包括:将TCP头部的序号改为原TCP头部序号加上连接记录中的确认序号差;改写TCP头部的确认序号包括:将TCP头部的确认序号改为原TCP头部确认序号加上连接记录中的序号差。
[0031]上述技术方案中,在所述的步骤9)中,判断来自真实服务器的IP包是否存在连接记录包括:当所述IP包的源IP、源端口、目的IP、目的端口与连接记录表中真实服务器IP、真实服务器端口、客户端IP、客户端端口相等时,表示所述IP包在连接记录表中存在记录;当所述IP包的源IP、源端口、目的IP、目的端口与连接记录表中真实服务器IP、真实服务器端口、补建连接本地IP、补建连接本地端口相等时,表示所述IP包在连接记录表中存在记录,并且该连接为补建TCP连接。
[0032]本发明的优点在于:
[0033]本发明的方法在故障切换时可以保持已经建立连接成功的TCP连接,避免客户端TCP连接异常终止,并且在整个故障切换过程中,对客户端是透明的。

【专利附图】

【附图说明】
[0034]图1是Linux服务器集群的示意图;
[0035]图2是本发明的在故障切换时保持TCP连接的方法的流程图;
[0036]图3是连接记录表的示意图。

【具体实施方式】
[0037]现结合附图对本发明作进一步的描述。
[0038]在一个实施例中,仍以图1中所示的Linux服务器集群为例,对本发明的在故障切换时保持TCP连接的方法进行描述。
[0039]从【背景技术】部分的描述可以知道:当主调度服务器102失效后,备调度服务器103通过HeartBeat心跳监测到主调度服务器102失效,然后接管主调度服务器102的任务,当主调度服务器102恢复后再重新接管备调度服务器103的任务。本发明的方法需要在主调度服务器102和备调度服务器103上同时实施,从而在备调度服务器103接管主调度服务器102任务以及主调度服务器102恢复后接管备调度服务器103任务时,保持已经建立的TCP连接。
[0040]参考图2,下面对本发明的方法做详细说明。
[0041]步骤2001)、主(或备)调度服务器利用netfilter接收IP包,分析IP包的IP头部参数,根据分析结果判断IP包的发送者:若IP目标地址为Virtual IP Address,则所述IP包来自客户端,若源地址为真实服务器,则所述IP包来自真实服务器;
[0042]步骤2002)、根据IP包的来源,执行不同的操作:若IP包来自客户端,转步骤2003),若IP包来自真实服务器,转步骤2009);
[0043]步骤2003)、检查连接记录表,判断该IP包是否存在连接记录,若存在转步骤2008),否则转步骤2004);
[0044]在本步骤中,所述连接记录表如图3所述,每条记录包括且不限于:客户端IP、客户端端口、补建连接本地IP、补建连接本地端口、真实服务器IP、真实服务器端口、序号差、确认序号差。
[0045]本步骤中,当所述来自客户端的IP包的源IP、源端口与连接记录表中客户端IP、客户端端口相等时,表示所述IP包对应在连接记录表中存在记录。
[0046]步骤2004)、分析所述IP包的IP头部和传输层头部,判断IP包类型:若传输层为TCP且TCP载荷不为空,则为TCP数据包;
[0047]步骤2005)、根据IP包的类型执行不同的操作:若为TCP数据包,转步骤2006),否则,转步骤2007);
[0048]步骤2006)、主(或备)调度服务器从一组真实服务器中选出一台服务器,然后主(或备)调度服务器作为客户端与选定服务器的地址和相应端口补充建立TCP连接,生成一条新的连接记录,并将新生成的连接记录保存到连接记录表中,接着执行步骤2008)。
[0049]在本步骤中,所述主(或备)调度服务器从一组真实服务器中选出一台服务器的选择算法可以有多种,包括但不限于轮循算法、加权轮循算法、目的地址哈希算法、源地址哈希算法、最小连接算法。
[0050]在本步骤中,连接记录包括但不仅限于:客户端IP、客户端端口、补建连接本地IP、补建连接本地端口、真实服务器IP、真实服务器端口、序号差、确认序号。具体的说,其中的客户端IP和客户端端口为之前所述IP包的源IP和源端口,补建连接本地IP和补建连接本地端口为本步骤中补建连接的本地IP和本地端口,真实服务器IP和真实服务器端口为选择的真实服务器的地址和端口,序号差为所述IP包的TCP头部的SEQ字段减去补建连接建立过程中三次握手最后一个确认包的SEQ,确认序号差为所述IP包的TCP头部的ACK字段减去补建连接建立过程中三次握手最后一个确认包的ACK。
[0051]步骤2007)、主(或备)调度服务器从一组真实服务器中选出一台服务器,然后生成一条新的连接记录,并将新生成的连接记录保存到连接记录表中。
[0052]在本步骤中,所述主(或备)调度服务器从一组真实服务器中选出一台服务器的选择算法可以有多种,包括但不限于轮循算法、加权轮循算法、目的地址哈希算法、源地址哈希算法、最小连接算法等。
[0053]所述新生成的连接记录中的参数值如下:客户端IP和客户端端口为所述IP包的源IP和源端口,补建连接本地IP和补建连接本地端口为空,真实服务器IP和真实服务器端口为选择的真实服务器的地址和端口,序号差为零,确认序号差为零。
[0054]步骤2008)、将所述IP包的目标地址和目标端口改写为所述连接记录中所包含的选出的真实服务器的地址和端口 ;若所述IP包属于补建TCP连接的IP包,则还需要将源地址和源端口改为补建TCP连接的本地地址和本地端口,同时改写TCP头部的序号和确认序号,最后将上述改写后的IP包发送给所述选出的真实服务器,转步骤2012);
[0055]本步骤中,改写TCP头部的序号包括:将TCP头部的序号改为原TCP头部序号减连接记录中的序号差;改写TCP头部的确认序号包括:将TCP头部的确认序号改为原TCP头部确认序号减连接记录中的确认序号差。
[0056]步骤2009)、检查连接记录表,判断来自真实服务器的IP包是否存在连接记录,若存在,执行步骤2010 ),否则,执行步骤2011);
[0057]本步骤中,当所述IP包的源IP、源端口、目的IP、目的端口与连接记录表中真实服务器IP、真实服务器端口、客户端IP、客户端端口相等时,表示所述IP包在连接记录表中存在记录;当所述IP包的源IP、源端口、目的IP、目的端口与连接记录表中真实服务器IP、真实服务器端口、补建连接本地IP、补建连接本地端口相等时,表示所述IP包在连接记录表中存在记录,并且该连接为补建TCP连接。
[0058]步骤2010)、将所述IP包的源地址和源端口改为Virtual IP Address(虚拟IP地址)和相应的端口,并进一步判断所述IP包是否属于补建TCP连接的IP包,若属于,将目标地址和目标端口改写为客户端IP和客户端端口,同时改写TCP头部的序号和确认序号,然后把改写后的IP包发给客户端,再执行步骤2012),否则,直接把改写后的IP包发给客户端,然后执彳了步骤2012);
[0059]本步骤中,改写TCP头部的序号包括:将TCP头部的序号改为原TCP头部序号加上连接记录中的确认序号差;将TCP头部的确认序号改为原TCP头部确认序号加上连接记录中的序号差。
[0060]步骤2011)、丢弃所述IP包;
[0061]步骤2012)、流程结束。
[0062]上述描述以Linux服务器集群为例,对本发明的方法做了说明。在其他实施例中,本发明的方法也适用于其他类型的服务器集群。
[0063]最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
【权利要求】
1.一种在故障切换时保持TCP连接的方法,在主调度服务器与备调度服务器上同时执行以下步骤: 接收并分析IP包,对于来自客户端的不存在连接记录的IP包做预处理,所述预处理包括:若是TCP数据包,从一组真实服务器中选出一台服务器,与选定服务器的地址和响应端口补建TCP连接,生成并保存连接记录,若不是TCP数据包,从一组真实服务器中选出一台服务器,生成并保存连接记录;然后将来自客户端IP包的目标地址和目标端口改写为选出的真实服务器的地址和端口,对于属于补建TCP连接的IP包,还要将源地址和源端口改为补建连接的本地地址和本地端口,同时改写TCP头部的序号和确认序号,再将改写后的IP包发送给所述选出的真实服务器。
2.根据权利要求1所述的在故障切换时保持TCP连接的方法,其特征在于,还包括:对于来自真实服务器的IP包,若存在连接记录,将所述IP包的源地址和源端口改为虚拟IP地址和相应的端口,对于属于补建TCP连接的IP包,还要将目标地址和目标端口改写为客户端IP和客户端端口,同时改写TCP头部的序号和确认序号,再将改写后的IP包发送给客户端;若不存在连接记录,丢弃所述IP包。
3.根据权利要求2所述的在故障切换时保持TCP连接的方法,其特征在于,该方法具体包括: 步骤I)、主调度服务器或备调度服务器接收并分析IP包,判断IP包的发送者; 步骤2)、若所述IP包来自客户端,执行步骤3),若所述IP包来自真实服务器,执行步骤9); 步骤3)、检查连接记录表,判断所述IP包是否存在连接记录,若存在,执行步骤8),否则执行步骤4);其中,所述连接记录表中的每一条记录至少包括:客户端IP、客户端端口、补建连接本地IP、补建连接本地端口、真实服务器IP、真实服务器端口、序号差、确认序号差; 步骤4)、分析所述IP包的IP头部和传输层头部,判断IP包类型; 步骤5)、若所述IP包为TCP数据包,执行步骤6),否则,执行步骤7); 步骤6)、从一组真实服务器中选出一台服务器,然后将主调度服务器或备调度服务器作为客户端与本步骤中所选出服务器的地址和相应端口补充建立TCP连接,生成一条新的连接记录,并将新生成的连接记录保存到连接记录表中,接着执行步骤8); 步骤7)、从一组真实服务器中选出一台服务器,然后生成一条新的连接记录,并将新生成的连接记录保存到连接记录表中,接着执行步骤8); 步骤8)、将所述IP包的目标地址和目标端口改写为所述连接记录中所包含的选出的真实服务器的地址和端口 ;若所述IP包属于补建TCP连接的IP包,则还需要将源地址和源端口改为补建TCP连接的本地地址和本地端口,同时改写TCP头部的序号和确认序号;最后将上述改写后的IP包发送给所述选出的真实服务器,执行步骤12); 步骤9)、检查连接记录表,判断来自真实服务器的IP包是否存在连接记录,若存在,执行步骤10),否则,执行步骤11); 步骤10)、将所述IP包的源地址和源端口改为虚拟IP地址和相应的端口,并进一步判断所述IP包是否属于补建TCP连接的IP包,若属于,将目标地址和目标端口改写为客户端IP和客户端端口,同时改写TCP头部的序号和确认序号,然后把改写后的IP包发给客户端,再执行步骤12),否则,直接把改写后的IP包发给客户端,然后执行步骤12); 步骤11)、丢弃所述IP包; 步骤12)、流程结束。
4.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤I)中,判断IP包的发送者包括:若IP目标地址为虚拟IP地址,则所述IP包来自客户端,若源地址为真实服务器,则所述IP包来自真实服务器。
5.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤3)中,判断所述IP包是否存在连接记录包括:当所述来自客户端的IP包的源IP、源端口与连接记录表中客户端IP、客户端端口相等时,表示所述IP包对应在连接记录表中存在记录。
6.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤6)或步骤7)中,从一组真实服务器中选出一台服务器的方法包括以下任意一种:轮循算法、加权轮循算法、目的地址哈希算法、源地址哈希算法、最小连接算法。
7.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤6)中,生成一条新的连接记录包括:将所述IP包的源IP和源端口作为连接记录中的客户端IP和客户端端口,将本步骤中补建连接的本地IP和本地端口作为所述连接记录中的补建连接本地IP和补建连接本地端口,将本步骤中所选择的真实服务器的地址和端口作为所述连接记录中的真实服务器IP和真实服务器端口,将所述IP包的TCP头部的SEQ字段减去补建连接建立过程中三次握手最后一个确认包的SEQ作为所述连接记录中的序号差,将所述IP包的TCP头部的ACK字段减去补建连接建立过程中三次握手最后一个确认包作为所述连接记录中的ACK确认序号差。
8.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤7)中,生成一条新的连接记录包括:将所述IP包的源IP和源端口作为所述连接记录中的客户端IP和客户端端口,将所述连接记录中的补建连接本地IP和补建连接本地端口设置为空,将本步骤中所选择的真实服务器的地址和端口作为所述连接记录中的真实服务器IP和真实服务器端口,将所述连接记录中的序号差设置为零,将所述连接记录中的确认序号差设置为零。
9.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤8)中,改写TCP头部的序号包括:将TCP头部的序号改为原TCP头部序号减连接记录中的序号差;改写TCP头部的确认序号包括:将TCP头部的确认序号改为原TCP头部确认序号减连接记录中的确认序号差。
10.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤10)中,改写TCP头部的序号包括:将TCP头部的序号改为原TCP头部序号加上连接记录中的确认序号差;改写TCP头部的确认序号包括:将TCP头部的确认序号改为原TCP头部确认序号加上连接记录中的序号差。
11.根据权利要求3所述的在故障切换时保持TCP连接的方法,其特征在于,在所述的步骤9)中,判断来自真实服务器的IP包是否存在连接记录包括:当所述IP包的源IP、源端口、目的IP、目的端口与连接记录表中真实服务器IP、真实服务器端口、客户端IP、客户端端口相等时,表示所述IP包在连接记录表中存在记录;当所述IP包的源IP、源端口、目的IP、目的端口与连接记录表中真实服务器IP、真实服务器端口、补建连接本地IP、补建连接本地端口相等时,表示所述IP包在连接记录表中存在记录,并且该连接为补建TCP连接。
【文档编号】H04L12/24GK104348637SQ201310321034
【公开日】2015年2月11日 申请日期:2013年7月26日 优先权日:2013年7月26日
【发明者】刘磊, 郑艳伟, 彭飞 申请人:中国科学院声学研究所, 北京中科海力技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1