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

标签: 心跳 heartbeat coderzh | 发表时间:2015-03-12 13:14 | 作者:CoderZh
出处:

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

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

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

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

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

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

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

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

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

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

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

  1. 具有更大的灵活性,可以自己控制检测的间隔,检测的方式等等。
  2. 心跳包同时适用于TCP和UDP,在切换TCP和UDP时,上层的心跳包功能都适用。(其实这种情况很少遇到)
  3. 有些情况下,心跳包可以附带一些其他信息,定时在服务端和客户端之间同步。(比如帧数同步)

结论

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

转自我的独立博客: http://blog.coderzh.com/2015/03/05/WhyHeartBeatNeeded/


本文链接: 为什么心跳包(HeartBeat)是必须的?,转载请注明。

相关 [心跳 heartbeat coderzh] 推荐:

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

- - 博客园_首页
几乎所有的网游服务端都有心跳包(HeartBeat或Ping)的设计,在最近开发手游服务端时,也用到了心跳包. TCP没有提供断线检测的方法吗. TCP提供的KeepAlive机制可以替代HeartBeat吗. 由于连接丢失时,TCP不会立即通知应用程序. 比如说,客户端程序断线了,服务端的TCP连接不会检测到断线,而是一直处于连接状态.

Java HeartBeat 0.4 发布,应用服务器心跳检测

- - 开源中国社区最新新闻
HeartBeat 0.4 发布, 该版本的主要更新如下. 下载链接:  http://git.oschina.net/mkk/HeartBeat/raw/V-0.4/dist/HeartBeat-0.4.zip. 在线测试:  http://andaily.com/hb/. 心跳检测各类应用服务器(如Tomcat,Jetty),WEB服务器(如 Apache,Nginx) 的JAVA WEB应用程序.

HeartBeat 集群组件概述

- - CSDN博客推荐文章
Heartbeat 是一个基于Linux开源的高可用集群系统. 主要包括心跳服务和资源接管两个高可用集群组件. 心跳监测服务可以通过网络链路和串口进行,而且支持冗余链路, 它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务.

drbd+xfs+heartbeat+mysql实现高可用

- - C1G军火库
DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地 文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中. 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.

Linux-HA实战(1)— Heartbeat安装

- - ZJD'S NOTES
接触Heartbeat主要是因为之前项目中使用了TFS,最近想给nameserver做HA,因为TFS官方用的Heartbeat,所以刚好了解下,参考了网络上很多内容,这里简单记录下. 我的机器是两台64位的CentOS,其它Linux机器应该差不多可以参考 官方的说明. 从Heartbeat 2.1.4之后原先的项目被拆分成了三个子项目: cluster-glue、 resource-agents和 heartbeat,导致了配置更加复杂.

linux高可用集群heartbeat实现http的高可用

- - CSDN博客系统运维推荐文章
    linux高可用集群的种类很多,比如常见的heartbeat,corosync,rhcs,keepalived,这些集群软件的出现为我们的业务生产环境提供了高可用的保证,本文将简单介绍一下用heartbeat的v2版本来处理一个简单的http高可用集群的搭建.     在实现http高可用集群之前,首先至少需要2台主机,并且需要做3点基本的准备工作:.

MySQL 主从延迟监控脚本(pt-heartbeat)

- - CSDN博客数据库推荐文章
    对于MySQL数据库主从复制延迟的监控,我们可以借助percona的有力武器pt-heartbeat来实现. pt-heartbeat通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟. 本文主要是通过脚本来定期检查从库与主库复制的延迟度并发送邮件,供大家参考.

[原]基于netty的心跳检测

- - 一切没有被记录的,终将被遗忘
这两天由于要给android系统的设备写一个心跳功能,所以在这里写一个基于netty的心跳检测功能. 1.客户端网络空闲5秒没有进行写操作是,进行发送一次ping心跳给服务端;. 2.客户端如果在下一个发送ping心跳周期来临时,还没有收到服务端pong的心跳应答,则失败心跳计数器加1;. 3.每当客户端收到服务端的pong心跳应答后,失败心跳计数器清零;.

Netty 那些事儿 ——— 心跳机制

- - 神刀安全网
本文是Netty文集中“Netty 那些事儿”系列的文章. 主要结合在开发实战中,我们遇到的一些“奇奇怪怪”的问题,以及如何正确且更好的使用Netty框架,并会对Netty中涉及的重要设计理念进行介绍. 心跳说的是在客户端和服务端在互相建立ESTABLISH状态的时候,如何通过发送一个最简单的包来 保持连接的存活,还有 监控另一边服务的可用性等.

能听到对方心跳的情侣枕头

- LeiYue - 先看看|创意产品,创意设计,创意生活
这款名为pillowtalk的枕头是为那些身处异地的情侣们设计的. 用,睡觉时带上绑带,对方的枕头上就会亮起颜色柔和的显示灯,提示TA你已经上床休息了. 你躺在枕头上时,还可以听到对方的心跳节奏. 先看看|创意产品,创意设计,创意生活 |逛逛我们的创意网店.