CN103716323B - 一种发送心跳包维持长连接的方法 - Google Patents

一种发送心跳包维持长连接的方法 Download PDF

Info

Publication number
CN103716323B
CN103716323B CN201310747400.4A CN201310747400A CN103716323B CN 103716323 B CN103716323 B CN 103716323B CN 201310747400 A CN201310747400 A CN 201310747400A CN 103716323 B CN103716323 B CN 103716323B
Authority
CN
China
Prior art keywords
service end
keepalive
client
tcp
socket
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
Application number
CN201310747400.4A
Other languages
English (en)
Other versions
CN103716323A (zh
Inventor
严伯盛
林飞达
黄礼锋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
XIAMEN YUEXUN INFORMATION TECHNOLOGY Co Ltd
Original Assignee
XIAMEN YUEXUN INFORMATION TECHNOLOGY Co Ltd
Filing date
Publication date
Application filed by XIAMEN YUEXUN INFORMATION TECHNOLOGY Co Ltd filed Critical XIAMEN YUEXUN INFORMATION TECHNOLOGY Co Ltd
Priority to CN201310747400.4A priority Critical patent/CN103716323B/zh
Publication of CN103716323A publication Critical patent/CN103716323A/zh
Application granted granted Critical
Publication of CN103716323B publication Critical patent/CN103716323B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

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

Description

一种发送心跳包维持长连接的方法
技术领域
本发明涉及通信领域,具体涉及一种发送心跳包维持长连接的方法。
背景技术
现有的心跳包技术全部是由应用层发送数据到服务器,服务器收到心跳包数据后回复客户端,客户端收到服务器的回复确认连接正常,没有收到服务器正常回复判断为连接异常中断。这种技术的主要缺点是浪费很多服务器资源,因为数据需要从网卡缓存空间复制到操作系统内核空间,再要从操作系统内核空间复制到用户空间,服务器回复的数据也需要从用户空间复制到操作系统内核空间,再从内核空间复制到网卡缓存空间。如图1所示。如果单台服务器存在大量的(几十万上百万)长连接,同时每个长连接的心跳包间隔时间很短(小于2分钟),这时服务器会非常频繁的在内核与用户空间之间切换,性能浪费严重。
有鉴于此,本发明人针对现有技术的缺陷深入研究,遂有本案产生。
发明内容
本发明所要解决的技术问题在于提供一种高效率的发送心跳包维持长连接的方法,通过调整TCP的keepAlive参数来实现,用TCP协议的keepAlive选项是TCP协议本身的功能,属于传输层,服务器收到客户端发过来的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与服务端连接。
进一步地,所述步骤A4中的s为5;所述步骤A5中的n为2。
本发明的优点在于:通过服务端TCP协议本身特性直接在传输层处理完心跳包,不提交到应用层,大大减少了处理心跳包的时间,提高了服务器的性能。
附图说明
下面参照附图结合实施例对本发明作进一步的描述。
图1是现在技术的方法示意图。
图2是本发明的方法示意图。
图3是本发明中网络正常情况的流程示意图。
图4是本发明中网络异常,或服务端异常的流程示意图。
图5是本发明中服务端曾经中断后重启的流程示意图。
具体实施方式
如图2所示,本发明提出的用TCP协议的keepAlive选项是TCP协议本身功能,属于传输层,服务器收到客户端发过来的keepAlive探测包时在传输层就可以回复客户端,并不会再向上层提交,所以效率高很多。
本发明一种发送心跳包维持长连接的方法,包括如下步骤:
步骤一:打开keepAlive开关,设置keepAlive参数,具体包括:
客户端:
步骤A1:建立TCP Socket客户端;
步骤A2:打开SO_KEEPALIVE选项;
步骤A3:设置TCP_KEEPIDLE 为心跳包间隔周期;
步骤A4:设置TCP_KEEPINTVL为5秒;
步骤A5:设置TCP_KEEPCNT为2次;
步骤A6:开始阻塞式读写;
服务端:
步骤B1:建立TCP Socket服务端;
步骤B2:选用异步非阻塞读写;
步骤B3:处理正常业务逻辑,不处理心跳包代码;
步骤二:客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keep-alive packet,该 keep-alive packet 就是 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 探测包起到异常中断发现功能,服务端的用户空间的应用程序只有在网络异常发生后客户端重连时才需要相应的处理,其它情况服务端的应用程序是透明的,减少了大量服务端处理心跳包的资源消耗。
如果是服务端曾经中断后重启,如图5所示,转入步骤E1:
步骤E1:客户端向服务端发起keepAlive 探测包;
步骤E2:服务端收到keepAlive 探测包;
步骤E3:服务端发出RST标志复位回复包;
步骤E4:客户端收到RST标志复位回复包 ;
步骤E5:客户端发起SocketException:远程主机强迫关闭了一个现有的连接错语,关闭当前socket;
步骤E6:客户端内核空间向用户空间的用户程序提交SocketException;
步骤E7:用户空间应用程序检测到SocketException ,重新建立新的SOCKET与服务端连接。
本发明通过服务端TCP协议本身特性直接在传输层处理完心跳包,不提交到应用层,大大减少了处理心跳包的时间,提高了服务器的性能。
以上所述仅为本发明的较佳实施用例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。

Claims (2)

1.一种发送心跳包维持长连接的方法,其特征在于:包括如下步骤:
步骤一:打开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协议栈自动向服务端发起一个keepAlive探测包,该 keepAlive探测包就是 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与服务端连接。
2.如权利要求1所述的一种发送心跳包维持长连接的方法,其特征在于:所述步骤A4中的s为5;所述步骤A5中的n为2。
CN201310747400.4A 2013-12-31 一种发送心跳包维持长连接的方法 Active CN103716323B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310747400.4A CN103716323B (zh) 2013-12-31 一种发送心跳包维持长连接的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310747400.4A CN103716323B (zh) 2013-12-31 一种发送心跳包维持长连接的方法

Publications (2)

Publication Number Publication Date
CN103716323A CN103716323A (zh) 2014-04-09
CN103716323B true CN103716323B (zh) 2016-11-30

Family

ID=

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101013958A (zh) * 2006-12-22 2007-08-08 华为技术有限公司 心跳实现方法及系统、模块
CN101980171A (zh) * 2010-10-08 2011-02-23 广东威创视讯科技股份有限公司 一种软件系统故障自恢复方法及其使用的软件看门狗系统
CN102223257A (zh) * 2011-07-25 2011-10-19 莫雅静 一种心跳间隔调整方法、服务器、客户端及通信系统

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101013958A (zh) * 2006-12-22 2007-08-08 华为技术有限公司 心跳实现方法及系统、模块
CN101980171A (zh) * 2010-10-08 2011-02-23 广东威创视讯科技股份有限公司 一种软件系统故障自恢复方法及其使用的软件看门狗系统
CN102223257A (zh) * 2011-07-25 2011-10-19 莫雅静 一种心跳间隔调整方法、服务器、客户端及通信系统

Similar Documents

Publication Publication Date Title
CN105516080B (zh) Tcp连接的处理方法、装置及系统
US9774704B2 (en) Home gateway, cloud server, and method for communication therebetween
US10313247B2 (en) System, method, and device for network load balance processing
US8700820B2 (en) Method for accessing USB device attached to home gateway, home gateway and terminal
CN103475751B (zh) 一种ip地址切换的方法及装置
CN108712485A (zh) 一种物联网设备的资源订阅方法和装置
CN108551668B (zh) 信息传输方法、装置、设备及存储介质
WO2017004952A1 (zh) 用于检测和阻止恶意点击广告链接的方法和装置
CN103384274A (zh) 基于http协议的公网连接内网计算机的通信方法
CN105119926A (zh) 一种基于Socket连接的多通道双工通讯方法
CN108833149A (zh) 一种快递柜网络可用性监控与自愈的方法及系统
CN105391536A (zh) 一种客户端和服务端进行通信的方法及装置
CN104463670A (zh) 一种基于Websocket的银行前置交易系统的搭建方法
WO2019085923A1 (zh) 数据处理方法、装置及计算机
CN107995326B (zh) 一种容器网络的管理方法及装置
CN105007308A (zh) 一种数据库隔离装置环境下的文件传输方法
CN105808345B (zh) 数据处理方法、加速引擎、控制板和系统
CN102932209A (zh) 服务器机群的状态检测方法和装置
CN104486187B (zh) 一种动态同步的can通讯设备和方法
CN103716323B (zh) 一种发送心跳包维持长连接的方法
CN101951327B (zh) 一种iSCSI网络系统以及检测网络故障的方法
CN103384265B (zh) Gvrp协议的应用层实现方法及系统
CN103051612B (zh) 防火墙及防止网络攻击方法
CN108781215A (zh) 网络服务实现方法、服务控制器及通信系统
CN103428677A (zh) 分组业务数据的发送方法及信令信道发送信息的接收方法

Legal Events

Date Code Title Description
PB01 Publication
SE01 Entry into force of request for substantive examination
GR01 Patent grant
CP03 Change of name, title or address

Address after: 361006 Units 1103 and 1104, Building A3, 339 Chengyi Street, Phase III Software Park, Jimei District, Xiamen City, Fujian Province

Patentee after: Xiamen Yuexin Information Technology Co.,Ltd.

Address before: Room 250, 555 Longhushan Road, Siming District, Xiamen City, Fujian Province, 361000

Patentee before: XIAMEN YUEXUN INFORMATION TECHNOLOGY Co.,Ltd.

PE01 Entry into force of the registration of the contract for pledge of patent right

Denomination of invention: A method of sending heartbeat packets to maintain long connection

Effective date of registration: 20221213

Granted publication date: 20161130

Pledgee: Bank of China Limited Xiamen hi tech Park sub branch

Pledgor: Xiamen Yuexin Information Technology Co.,Ltd.

Registration number: Y2022980027437