一种发送心跳包维持长连接的方法技术

技术编号:9908088 阅读:166 留言:0更新日期:2014-04-11 10:12
一种发送心跳包维持长连接的方法,包括:打开keepAlive开关,设置keepAlive参数,客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keep-alivepacket,根据网络的不同情况,会出现正常情况、网络异常或服务端异常、服务端曾经中断后重启三种处理流程。本发明专利技术通过调整TCP的keepAlive参数来实现,用TCP协议的keepAlive选项是TCP协议本身的功能,属于传输层,服务器收到客户端发过来的keepAlive探测包时在传输层就可以回复客户端,并不会再向上层提交,所以效率高很多。

【技术实现步骤摘要】
一种发送心跳包维持长连接的方法
本专利技术涉及通信领域,具体涉及一种发送心跳包维持长连接的方法。
技术介绍
现有的心跳包技术全部是由应用层发送数据到服务器,服务器收到心跳包数据后回复客户端,客户端收到服务器的回复确认连接正常,没有收到服务器正常回复判断为连接异常中断。这种技术的主要缺点是浪费很多服务器资源,因为数据需要从网卡缓存空间复制到操作系统内核空间,再要从操作系统内核空间复制到用户空间,服务器回复的数据也需要从用户空间复制到操作系统内核空间,再从内核空间复制到网卡缓存空间。如图1所示。如果单台服务器存在大量的(几十万上百万)长连接,同时每个长连接的心跳包间隔时间很短(小于2分钟),这时服务器会非常频繁的在内核与用户空间之间切换,性能浪费严重。有鉴于此,本专利技术人针对现有技术的缺陷深入研究,遂有本案产生。
技术实现思路
本专利技术所要解决的技术问题在于提供一种高效率的发送心跳包维持长连接的方法,通过调整TCP的keepAlive参数来实现,用TCP协议的keepAlive选项是TCP协议本身的功能,属于传输层,服务器收到客户端发过来的keepAlive探测包时在传输层就可以回复客户端,并不会再向上层提交,所以效率高很多。本专利技术是这样实现的:一种发送心跳包维持长连接的方法,包括如下步骤:步骤一:打开keepAlive开关,设置keepAlive参数,具体包括:客户端:步骤A1:建立TCPSocket客户端;步骤A2:打开SO_KEEPALIVE选项;步骤A3:设置TCP_KEEPIDLE为心跳包间隔周期;步骤A4:设置TCP_KEEPINTVL为s秒;步骤A5:设置TCP_KEEPCNT为n次;步骤A6:开始阻塞式读写;服务端:步骤B1:建立TCPSocket服务端;步骤B2:选用异步非阻塞读写;步骤B3:处理正常业务逻辑,不处理心跳包代码;步骤二:客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keep-alivepacket,该keep-alivepacket就是ACK和当前TCP序列号减一的组合,此时根据网络的不同情况,会出现正常情况、网络异常或服务端异常、服务端曾经中断后重启三种处理流程:如果是正常情况,转入步骤C1:步骤C1:客户端向服务端发起keepAlive探测包;步骤C2:服务端收到keepAlive探测包;步骤C3:服务端发出ACK回复包;步骤C4:客户端收到ACK回复包;步骤C5:客户端保活计时器重新开始计时,进入下一次循环;如果是网络异常,或服务端异常,转入步骤D1:步骤D1:客户端向服务端发起keepAlive探测包;步骤D2:经过TCP_KEEPINTVL设定的时间后客户端未收到回复,再次发出keepAlive探测包,重复TCP_KEEPCNT设定的次数;步骤D3:客户端一直未收到ACK回复包,引起SOCKET_ERROR;步骤D4:内核空间向用户空间提交SOCKET_ERROR;步骤D5:用户空间应用程序检测到SOCKET_ERROR,recv函数返回SOCKET_ERROR,WSAGetLastError()得到的结果为WSAECONNRESET(10054),重新建立新SOCKET与服务端连接;如果是服务端曾经中断后重启,转入步骤E1:步骤E1:客户端向服务端发起keepAlive探测包;步骤E2:服务端收到keepAlive探测包;步骤E3:服务端发出RST标志复位回复包;步骤E4:客户端收到RST标志复位回复包;步骤E5:客户端发起SocketException:远程主机强迫关闭了一个现有的连接错语,关闭当前socket;步骤E6:客户端内核空间向用户空间的用户程序提交SocketException;步骤E7:用户空间应用程序检测到SocketException,重新建立新的SOCKET与服务端连接。进一步地,所述步骤A4中的s为5;所述步骤A5中的n为2。本专利技术的优点在于:通过服务端TCP协议本身特性直接在传输层处理完心跳包,不提交到应用层,大大减少了处理心跳包的时间,提高了服务器的性能。附图说明下面参照附图结合实施例对本专利技术作进一步的描述。图1是现在技术的方法示意图。图2是本专利技术的方法示意图。图3是本专利技术中网络正常情况的流程示意图。图4是本专利技术中网络异常,或服务端异常的流程示意图。图5是本专利技术中服务端曾经中断后重启的流程示意图。具体实施方式如图2所示,本专利技术提出的用TCP协议的keepAlive选项是TCP协议本身功能,属于传输层,服务器收到客户端发过来的keepAlive探测包时在传输层就可以回复客户端,并不会再向上层提交,所以效率高很多。本专利技术一种发送心跳包维持长连接的方法,包括如下步骤:步骤一:打开keepAlive开关,设置keepAlive参数,具体包括:客户端:步骤A1:建立TCPSocket客户端;步骤A2:打开SO_KEEPALIVE选项;步骤A3:设置TCP_KEEPIDLE为心跳包间隔周期;步骤A4:设置TCP_KEEPINTVL为5秒;步骤A5:设置TCP_KEEPCNT为2次;步骤A6:开始阻塞式读写;服务端:步骤B1:建立TCPSocket服务端;步骤B2:选用异步非阻塞读写;步骤B3:处理正常业务逻辑,不处理心跳包代码;步骤二:客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keep-alivepacket,该keep-alivepacket就是ACK和当前TCP序列号减一的组合,此时根据网络的不同情况,会出现正常情况、网络异常或服务端异常、服务端曾经中断后重启三种处理流程:如果是正常情况,如图3所示,转入步骤C1:步骤C1:客户端向服务端发起keepAlive探测包;步骤C2:服务端收到keepAlive探测包;步骤C3:服务端发出ACK回复包;步骤C4:客户端收到ACK回复包;步骤C5:客户端保活计时器重新开始计时,进入下一次循环。从以上流程中可以看出,正常情况下keepAlive探测包经过的所有路由器和NAT及其它网络设备都相当于心跳包的作用,刷新了这些网络设备的路由记录表,同时整个通信过程都在系统的内核空间内完成,服务端的处理效率大大提高。如果是网络异常,或服务端异常,如图4所示,转入步骤D1:步骤D1:客户端向服务端发起keepAlive探测包;步骤D2:经过TCP_KEEPINTVL设定的时间后客户端未收到回复,再次发出keepAlive探测包,重复TCP_KEEPCNT设定的次数;步骤D3:客户端一直未收到ACK回复包,引起SOCKET_ERROR;步骤D4:内核空间向用户空间提交SOCKET_ERROR;步骤D5:用户空间应用程序检测到SOCKET_ERROR,recv函数返回SOCKET_ERROR,WSAGetLastError()得到的结果为WSAECONNRESET(10054),重新建立新SOCKET与服务端连接。从以上流程中可以看出,异常情况下keepAlive探测包起到异常中断发现功能,服务端的用户空间的应用程序只有在网络本文档来自技高网...
一种发送心跳包维持长连接的方法

【技术保护点】
一种发送心跳包维持长连接的方法,其特征在于:包括如下步骤:步骤一:打开keepAlive开关,设置keepAlive参数,具体包括:客户端:步骤A1:建立TCP?Socket客户端;步骤A2:打开SO_KEEPALIVE选项;步骤A3:设置TCP_KEEPIDLE?为心跳包间隔周期;步骤A4:设置TCP_KEEPINTVL为s秒;步骤A5:设置TCP_KEEPCNT为n次;步骤A6:开始阻塞式读写;?服务端:步骤B1:建立TCP?Socket服务端;步骤B2:选用异步非阻塞读写;步骤B3:处理正常业务逻辑,不处理心跳包代码;步骤二:客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keep?alive?packet?,该?keep?alive?packet?就是?ACK?和当前TCP?序列号减一的组合,此时根据网络的不同情况,会出现正常情况、网络异常或服务端异常、服务端曾经中断后重启三种处理流程:如果是正常情况,转入步骤C1:步骤C1:客户端向服务端发起keepAlive?探测包;步骤C2:服务端收到keepAlive?探测包;步骤C3:服务端发出ACK回复包;步骤C4:客户端收到ACK回复包;步骤C5:客户端保活计时器重新开始计时,进入下一次循环;如果是网络异常,或服务端异常,转入步骤D1:步骤D1:客户端向服务端发起keepAlive?探测包;步骤D2:经过TCP_KEEPINTVL设定的时间后客户端未收到回复,再次发出keepAlive?探测包,重复TCP_KEEPCNT设定的次数;步骤D3:客户端一直未收到ACK回复包,引起?SOCKET_ERROR;步骤D4:内核空间向用户空间提交?SOCKET_ERROR;步骤D5:用户空间应用程序检测到?SOCKET_ERROR,?recv?函数返回?SOCKET_ERROR,WSAGetLastError()得到的结果为WSAECONNRESET(10054)?,重新建立新SOCKET与服务端连接;如果是服务端曾经中断后重启,转入步骤E1:步骤E1:客户端向服务端发起keepAlive?探测包;步骤E2:服务端收到keepAlive?探测包;步骤E3:服务端发出RST标志复位回复包;步骤E4:客户端收到RST标志复位回复包?;步骤E5:客户端发起SocketException:远程主机强迫关闭了一个现有的连接错语,关闭当前socket;步骤E6:客户端内核空间向用户空间的用户程序提交SocketException;步骤E7:用户空间应用程序检测到SocketException?,重新建立新的SOCKET与服务端连接。...

【技术特征摘要】
1.一种发送心跳包维持长连接的方法,其特征在于:包括如下步骤:步骤一:打开keepAlive开关,设置keepAlive参数,具体包括:客户端:步骤A1:建立TCPSocket客户端;步骤A2:打开SO_KEEPALIVE选项;步骤A3:设置TCP_KEEPIDLE为心跳包间隔周期;步骤A4:设置TCP_KEEPINTVL为s秒;步骤A5:设置TCP_KEEPCNT为n次;步骤A6:开始阻塞式读写;服务端:步骤B1:建立TCPSocket服务端;步骤B2:选用异步非阻塞读写;步骤B3:处理正常业务逻辑,不处理心跳包代码;步骤二:客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keepAlive探测包,该keepAlive探测包就是ACK和当前TCP序列号减一的组合,此时根据网络的不同情况,会出现正常情况、网络异常或服务端异常、服务端曾经中断后重启三种处理流程:如果是正常情况,转入步骤C1:步骤C1:客户端向服务端发起keepAlive探测包;步骤C2:服务端收到keepAlive探测包;步骤C3:服务端发出ACK回复包;步骤C4:客户端收到ACK回复包;步骤C5:客户端保活计时器重新开始计时,进入下一次循环;如果是网络异常,或服务端异常,转入步骤D1:步骤D1:...

【专利技术属性】
技术研发人员:严伯盛林飞达黄礼锋
申请(专利权)人:厦门悦讯信息科技有限公司
类型:发明
国别省市:

相关技术
    暂无相关专利
网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1