页面载入中...

阿奇娱乐网(www.aqiziyuan.cn)提供免费资源分享平台,做最绿色安全的免费辅助、软件、QQ技术、网络技术等精神而建立的网站

为什么心跳包(HeartBeat)是必须的?

发布:十月2018-10-24 13:59分类: 技术学习 这篇文章木有标签 浏览:25字数:1139 去评论(0)

几乎所有网游服务端都有心跳包(HeartBeatPing)设计,在最近开发手游服务端时,也用到了心跳包。思考思考,心跳包是必须吗?为什么需要心跳包?TCP没有提供断线检测方法吗?TCP提供KeepAlive机制可以替代HeartBeat吗?

QQ截图20170716135823.jpg

由于连接丢失时,TCP不会立即通知应用程序。比如说,客户端程序断线了,服务端TCP连接不会检测到断线,而是一直处于连接状态。这就带来了很大麻烦,明明客户端已经断了,服务端还维护着客户端连接,照常执行着该玩家游戏逻辑……

心跳包就是用来及时检测是否断线一种机制,通过每间隔一定时间发送心跳数据,来检测对方是否连接。是属于应用程序协议部分

问题1: TCP为什么不自己提供断线检测?

首先,断线检测需要轮询发送检测报文,会消耗一定网络带宽和暂用一定网络资源。如果把它做成TCP底层默认功能,那些不需要断线检测应用程序将会浪费不必要带宽资源

另外,TCP不提供连接丢失及时通知最重要原因与其主要设计目目标之一有关:出现网络故障时维护通信能力。TCP是美国国防部赞助研究,一种即使发生战争自然灾害这种严重网络损坏情况下,也能维护可靠网络通信网络协议。通常,网络故障只是暂时,有时路由器会在TCP临时连接丢失后默默连上。所以,TCP本身并不提供那么及时断线检测。

问题2: TCPKeepAlive机制可以用来及时检测连接状态吗?

TCP有个KeepAlive关,打开可以用来检测死连接。通常默认是2小时,可以自己设置。但是注意,这是TCP全局设置。假如为了能更及时检测出断连接,把tcp_keepalive_timetcp_keepalive_intvl时间改小,该机器上所有应用程序KeepAlive检测间隔都会变小,显然是不能接受。因为不同应用程序需求是不一样

(在某些平台Socket实现已经支持为每条连接单设置KeepAlive参数)

KeepAlive本质上来说,是用来检测长时间不活跃连接。所以,不适合用来及时检测连接状态。

问题3:心跳包(HeartBeat)为什么是好方式及时检测连接状态?

  1. 具有更大灵活性,可以自己控制检测间隔,检测方式

  2. 心跳包同时适用于TCP和UDP,在切换TCP和UDP时,上层心跳包功能都适用。(其实这种情况很少遇到)

  3. 有些情况下,心跳包可以附带一些其他信息,定时在服务端和客户端之间同步。(比如帧数同步)

结论

需要及时检测TCP连接状态,心跳包(HeartBeat)还是必须


正文到此结束

阿奇资源网

1  除非特别注明,文章均为提供免费资源分享平台 - 阿奇资源网原创,转载时请注明来源

2 <本站资源来自互联网搜集,如有侵权请联系我们删除>

[点击提交]

3  本文标题:【为什么心跳包(HeartBeat)是必须的?】
4  本文衔接:http://www.aqiziyuan.cn/?post=1388  [点击加站长交流群]
 
相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注