游戏服务器心跳包的作用
服务端为什么需要心跳(保活)机制
TCP-Keepalive-HOWTO
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
Socket心跳包机制

心跳包的作用

1 查一下tcp的断线是否真的可靠

一个tcp链接很长时间没有数据传送,路由器已经释放tcp链接, 客户端那边close了, 但服务器那边也不会有反应
为了避免这种现象,可能需要改协议
比如:客户端每隔一段时间发送心跳数据包,如果长时间没有心跳,服务器关闭socket

之前的测试都是,手动强制关闭客户端进程,然后查看服务器的情况,结果往往是,服务器收到了客户端关闭的事件。
其实,我一直忽略了一个问题,我没有拔掉网线来测试

上面的手动关闭客户端进程,事实上并不能测试出想要的结果,因为进程是在应用层的
所以,这种测试方法不能保证网络驱动层也不发送数据报文给服务器。
经过测试发现,当应用层强制结束进程时,对于TCP连接,驱动层会发送reset数据包!
而服务器收到这个数据包就可以正常关闭了!

那么,如果拔掉网线呢,服务器收不到这个数据包,就会导致死连接存在!

所以,心跳包是必要的,或者应用TCP协议本身的Keep-alive来设置

之所以产生前面的误解,也是由于以前看书的时候,凭空想象,以为TCP连接如同一条绳子,一方断开了,另外一方必然会知道的。
殊不知,TCP连接,这个“面向连接”的连接并不存在
它只是抽象出来的概念,对于物理层,对于网线、光纤而言,不存在连接不连接的概念,因为,对它们而言,无非就是一些电流脉冲而已。

TCP的连接,不过是通过ACK、SEQ这些机制来模拟实现的。

这么看来socket本身的断开通知不是很靠谱,心跳包会更合理一些
那么心跳包的一个意义就是可以更可靠的检测连接是否畅通

如果没有特意的设置某些选项或者实现应用层心跳包,TCP空闲的时候是不会发送任何数据包。
也就是说,当一个TCP的socket,客户端与服务端谁也不发送数据,会一直保持着连接。
这其中如果有一方异常掉线(例如死机、路由被破坏、防火墙切断连接等)
另一端如果没有发送数据,永远也不可能知道。这对于一些服务型的程序来说,是灾难性的后果,将会导致服务端socket资源耗尽。

所以为了保证连接的有效性、及时有效地检测到一方的非正常断开,保证连接的资源被有效的利用,
我们就会需要一种保活的机制,通常改机制两种处理方式:
1、利用TCP协议层实现的Keepalive;
2、自己在应用层实现心跳包。

两种方式的对比如下:
1、TCP协议自带的保活功能, 使用起来简单, 减少了应用层代码的复杂度. 更节省流量, 因为一般来说应用层的数据传输到协议层时都会被加上额外的包头包尾. 由TCP协议提供的检活, 其发的ACK包比应用层的心跳包耗费更少的流量。
2、应用层心跳包相对与Keepalive更灵活,因为协议层的心跳只能提供最纯粹的检活功能, 但是应用层自己可以随意控制,甚至加入一些额外逻辑。
3、应用层心跳包相对与Keepalive更灵活,应用层心跳包不依赖于协议,如若有一天不用TCP要改为UDP了,只需做少量改动甚至不用改动即可实现转换。

网络上有说:存活(keepalive)并不是TCP规范的一部分。在Host Requirements RFC罗列有不使用它的三个理由:
(1)在短暂的故障期间,它们可能引起一个良好连接(good connection)被释放(dropped)
(2)它们消费了不必要的宽带
(3)在以数据包计费的互联网上它们(额外)花费金钱。

实际上,自己实现心跳包也会面临同样的问题,而第一点,在我测试过程中,只要设置参数合理短时间内并不会引起连接主动断开。

2页游之前会 用心跳包检测加速作弊

比如如果某玩家应用加速器作弊,那么他发送的心跳包时间时间间隔就会异常,这样就可以揪出作弊
但是作弊器已经越来越高端了,检测心跳包已经几乎没用,所以这个作用几乎没有了

3 心跳包可以检测游戏延迟

游戏服务器心跳包的作用相关推荐

  1. 网页游戏服务器架设包,如何开架设网页游戏服务器

    如何开架设网页游戏服务器 内容精选 换一换 目标服务器已安装操作系统,并且处于联网状态.目标服务器已安装鲲鹏编译插件. ECS的网卡绑定虚拟IP地址后,该虚拟IP地址无法ping通.以下排查思路根据原 ...

  2. 游戏思考13:关于MMORPG游戏服务器的种类及作用(以后会同步更新github,持续更新系列,目前有20个服务器说明,22/10/20)

    文章目录 1)平台服 六.guild_server工会服务器 七.friend_server好友服务器 八.team_server队伍服务器 九.activity_server活动服务器 十.trad ...

  3. android心跳包作用,Android开发Im总结-5:心跳包

    心跳包的作用: TCP长连接本质上不需要心跳包来维持, 大家可以试一试, 让两台电脑连上同一个wifi, 然后让其中一台做服务器, 另一台用一个普通的没有设置KeepAlive的Socket连上服务器 ...

  4. 心跳包间隔多少时间合适_多路SOCKET、心跳包、注册包的作用

    很多人在使用数传电台.模块等产品时,产品手册上面会有多路SOCKET连接.网络心跳包.注册包.串口心跳包等字样,那么这些功能有什么作用呢? 1.多路SOCKET连接 每一路socket都能够单独与不同 ...

  5. socket心跳机制图片_socket心跳包机制

    心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包 心跳包的作用 网络中的接收和发送数据都是使用SOCKET进行实现.但 ...

  6. Socket连接心跳包的机制总结

    文章目录 Socket连接心跳包的机制总结 心跳包的由来 心跳包的作用 心跳包由服务端还是客户端发送? Socket连接心跳包的机制总结 心跳包的由来 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定 ...

  7. 从零构建通讯器--7.1过往总结和心跳包代码实战

    1.目录 一:前面学习的总结 核心架构浓缩总结实现的功能: (1)服务器按照包头包体格式正确的接收客户端发送过来的数据包: (2)根据手动的包的不同来执行不同的业务处理逻辑: (3)把业务处理产生的结 ...

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

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

  9. 当我设计游戏服务器时,我在想些什么?(1)

    机缘巧合的机会,我有幸能够从头开始设计一个游戏的服务器.中间遇到很多欢声笑语和悲伤泪水,这里分享一下. 我之前所在项目组的游戏服务器架构如下图: 这款游戏是一款MMO的端游,GateWay网关的任务是 ...

最新文章

  1. 让Visual Studio 也支持JS代码折叠 [ Visual Studio | #region | #endregion ]
  2. leetcode算法题--推多米诺
  3. SQLServer无法打开用户默认数据库,登录失败,错误4064的解决办法
  4. asp.net导出GridView数据到Excel
  5. java中的strictfp的作用
  6. 各版本lettuce spring集成流程(连接池、哨兵配置)
  7. HttpRuntime.Cache的使用经验
  8. Flash 杂志《summer tree》 第七期发布
  9. 自己动手编写一个VS插件(三)——创建工具栏之一
  10. 关于get和post的区别
  11. 软件测试入门基础自卸
  12. SQL2005数据库可疑的解决方法
  13. 零基础程序员如何自学编程
  14. rmats2sashimiplot:可视化rmats的可变剪切结果
  15. ‘click‘ handler took 3858s如何解决
  16. 计算一个数二进制中1的个数超全解法(C语言)
  17. 微信小程序自定义picker多列选择器
  18. Java微信公众号高级 微信墙,JAVA折腾微信公众平台(Token验证)
  19. 请你谈谈IP地址和MAC地址关系,为何需要两个地址?
  20. 使用Windows驱动的虚拟打印机,打印Excel表格无表格线问题解决(1)

热门文章

  1. 6.8亿!拼多多活跃买家数直逼阿里,购买力成短板
  2. MongoDB Capped Collections
  3. PAT日志 1053
  4. 启动django报错:TypeError: __init__() got an unexpected keyword argument ‘providing_args‘
  5. 关于setTimeout用法问题
  6. Oracle函数之LISTAGG
  7. c语言分治法实验报告,分治法实验报告范文word版
  8. #if 0 #else #endif
  9. 前端需要了解的计算机网络知识, 这一篇就够了!(图文并茂,万字长文!)
  10. java里utils写什么_工具篇-Java中一些utils