心跳检测以及应用层心跳包机制设计

博主联系方式:
QQ:1540984562
微信:wxid_nz49532kbh9u22
QQ交流群:750313950(嵌入式方向)
QQ交流群:856398158(后端方向)

目录

  • 心跳检测应用场景
    • 死连接情况
    • 保活
    • 传递有效业务数据
  • 心跳包机制设计
    • 通用心跳包设计
    • 有代理的心跳包设计

心跳检测应用场景

心跳检测一般有两个作用:保活和检测死连接。

死连接情况

服务器与客户端不在一个网络中,之间的数据会经过多个路由器和交换机,如果其中某个必经之路的机器出现了故障,并且在一段时间内没有恢复,则会导致这之间的链路不再通畅,此时服务器和客户端之间没有数据交换。并且由于TCP连接是状态机,所以对于这种情况,通信两方是无法感知与对方的连接是否正常。又如果客户端因为网络原因或者崩溃等许多原因断开了与服务端的连接,然而服务端却不知道客户端已经断开了连接并等待客户端给他发送数据占用着系统资源,我们称这样的情况为“死连接”。
在这个情况中,我们只要在服务端向客户端发送一个数据包,即可检测连接是否正常,这类数据包称为心跳包,这种操作称为心跳检测。如果一个连接长时间没有正常数据来往,有没有心跳包来往,就可以认为这个连接已经不存在了,此时应该关闭socket来回收连接资源。

保活

一个客户端在连接服务器之后,如果长时间没有和服务器有数据来往,可能会被防火墙程序关闭连接,但是有时我们希望这个连接保持下去。因为对于即时通信来说,服务器没有消息时,确实不会有数据交换,但是连接关闭的话,新消息到来的话就无法接受到了。这种情况,我们只需要向对方发送心跳包即可实现保活。

传递有效业务数据

实际应用中,有时需要定时或者不定时地从服务端更新一些数据,可以把这类数据放在心跳包中,定时或者不定时更新。
但是对于连接数较多时,为了减轻网络带宽和流量,设计心跳包数据格式时应该尽量减少心跳包大小。

心跳包机制设计

通用心跳包设计

心跳包其实就是一个预先设置好格式的数据包,在程序中启动一个定时器定时发送即可。
但是如果通信两端有频繁的业务数据来往,此时这些数据包本身就可以起到保活的作用,就没有必要浪费流量发送心跳包了。
最佳的做法就是记录最近一次收发数据包的时间,在每次收数据和发送数据的时候就更新这个时间。而心跳检测的计时器在每次检测时都将这个时间与当前的系统时间做比较,如果时间间隔大于允许的最大间隔,则发送一次心跳包。
简而言之:在与对端之间没有数据来往达到一定时间间隔时,才发送一次心跳包。
同时检测心跳包的一方,应该是在与对端没有数据来往达到一定时间间隔时才做一次心跳检测。
一般来说是客户端主动向服务端发送心跳包,服务端做心跳检测来决定是否断开连接。从客户端的角度来说,客户端为了让自己得到服务端的正常服务,有必要主动和服务端保持正常连接。服务端在收到客户端的心跳包时,应该给客户端一个心跳应答。

有代理的心跳包设计

在后端服务程序与客户端之间存在代理服务时,后端服务与代理服务之间是长连接,代理服务与客户端之间也是长连接。
后端服务器的业务类型是订阅类型,客户端一旦订阅某个类型的主题,就很少或者不再发送数据给服务器了,服务器会将被订阅的数据下发到代理服务器,然后客户端从代理服务器获取数据。
在这里插入图片描述
现在有一个情况:客户端和代理服务之间的连接断开,代理服务和后端服务的连接正常。此时后端服务的下行数据会一直畅通,但此时客户端与代理服务可能已经断开好一会儿了。此时后端服务会根据下行数据更新最后一次心跳时间,所以会导致心跳检测误判后端程序与客户端的连接状态。因为这里我们使用的方法仍然是检测后端服务更新心跳包时间。
此时只需要更改机制为:只通过后端服务的上行数据来更新时间戳,若超过某段时间后仍然没有上行数据,则说明客户端已经断开了(这段时间内,服务端既没有收到客户端的业务数据包,也没有收到客户端的心跳数据包)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【APUE】孤儿进程与僵死进程

基本概念: 在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后&#xff0c…

一个DBA的工作写照

一个DBA的工作写照, 一个DBA的内心 Know the DBA Mind! DBA也是 IT民工啊, 民工何苦为难民工! 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968227.html

使用mutex和条件变量实现信号量

c提供了互斥量:mutex和条件变量:condition_variable,但是并没有信号量:semaphore。而linux和windows系统库会提供的。下面简单介绍一下信号量的特性,然后给出一个简单的demo,使用mutex condition_variable…

2014-07-28 使用Axure RP进行手机端BBS的原型设计

今天是在吾索实习的第14天。因本公司的微信公众号需要有一个对外的技术交流平台,所以我们小组打算设计一个手机端的BBS以满足其要求。首先,我们需要做的是进行数据库设计与原型设计,然后提交给经理验收,看看是否合理,是…

jquery exif + lazyload实现延迟加载并显示相片exif信息

对一个摄影爱好者来说&#xff0c;从高手的作品中学习是非常有用的。而照片的光圈&#xff0c;快门&#xff0c;感光度等信息是关注的重点。 上代码&#xff1a; 1 <script src"../js/jquery.js" type"text/javascript"></script>2 <script…

undefined reference to `pthread_create‘(linux下Clion使用thread报错)

完整报错&#xff1a; [ Build | AsyncLogger | Debug ] /snap/clion/169/bin/cmake/linux/bin/cmake --build /home/dyy/CLionProjects/AsyncLogger/cmake-build-debug --target AsyncLogger -- -j 6 [ 50%] Linking CXX executable AsyncLogger /usr/bin/ld: CMakeFiles/Asy…

UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)

题意&#xff1a;给一个元素周期表的元素符号&#xff08;114种&#xff09;&#xff0c;再给一个串&#xff0c;问这个串能否有这些元素符号组成&#xff08;全为小写&#xff09;。 解法1&#xff1a;动态规划 定义&#xff1a;dp[i]表示到 i 这个字符为止&#xff0c;能否有…

.NET开发相关使用工具和框架【转载】

开发类 visual_studio 2005-2012系列----------语言开发工具 Visio 2003 / Power Desiger -----------建模工具 Dreamweaver_CS5 --------------网页设计 ExpressionStudio 4 / blend 4 -------------wpf/silverlight设计工具 开发辅助类 SVN 主程序 ---------------文件控制 I…

JAVA数组的定义及用法

数组是有序数据的集合&#xff0c;数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素。 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; 当中类型(type)能够为Java中随意的数据类型&#xff0c;包含简单类型组合类型&#xff0c;数组名…

php操作httpsqs

php初始化httpsqs: include_once("httpsqs_client.php");$httpsqs new httpsqs("127.0.0.1", 1218, "mypass123", "utf-8"); php操作httpsqs:常用命令 操作入队&#xff1a; $result $httpsqs->put(xiongwei2, test1); 获取队列中…

异步日志系统设计demo

目录简单版本1优化版本1优化版本2对于QPS要求很高或者对性能有一定要求的服务器程序&#xff0c;同步写日志会对服务的关键性逻辑的快速执行和及时响应带来一定的性能损失&#xff0c;因为写日志时等待磁盘IO完成工作也需要一定时间。为了减少这种损失&#xff0c;一般采用异步…

js unix时间戳转换

一、unix时间戳转普通时间&#xff1a; var unixtime1358932051; var unixTimestamp new Date(unixtime* 1000); commonTime unixTimestamp.toLocaleString(); alert("普通时间为&#xff1a;"commonTime); 二、普通时间转unix时间戳 var str "2013-01-01 00…

hdu 1025(最长非递减子序列的n*log(n)求法)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1025 经典题。。。最长非递减序列的n*log(n)求法。。。orz... View Code 1 #include<iostream>2 const int N500007;3 using namespace std;4 int city[N];5 int dp[N];//dp[i]保存的是长度为i的最长不降…

消息队列重要机制讲解以及MQ设计思路(kafka、rabbitmq、rocketmq)

目录《Kafka篇》简述kafka的架构设计原理&#xff08;入口点&#xff09;消息队列有哪些作用&#xff08;简单&#xff09;消息队列的优缺点&#xff0c;使用场景&#xff08;基础&#xff09;消息队列如何保证消息可靠传输死信队列是什么&#xff1f;延时队列是什么&#xff1…

js判断手机浏览器

最新浏览器识别合并。 demo&#xff1a;http://v.qq.com -> http://v.qq.com/h5    http://v.qq.com/ -> http://v.qq.com/h5    http://v.qq.com/h5 -> http://v.qq.com/h5 <script type"text/javascript"> (function(W){ …

数据库归档模式

1、在sys身份下登陆oracle&#xff0c;执行命令archive log list; SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence …

转载|网络编程中阻塞式函数的底层逻辑

逛知乎看到的&#xff0c;觉得写的挺透彻的&#xff0c;转载一下&#xff0c;原文链接&#xff1a;Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗&#xff1f; 原文以阻塞式的recv函数作为讲解&#xff0c;但是所有阻塞式的api底层逻辑基本相通。 下面是正文…

把txt文件中的json字符串写到plist文件中

- (void)json2Plist {NSString *filePath [self applicationDocumentsDirectoryFileName:"json"];NSMutableArray *tempArray [[NSMutableArray alloc] initWithContentsOfFile:filePath];//第一次添加数据时,数组为空if (tempArray.count 0) {tempArray [NSMuta…

树的存储结构2 - 数据结构和算法42

树的存储结构 让编程改变世界 Change the world by program 孩子表示法 我们这次换个角度来考虑&#xff0c;由于树中每个结点可能有多棵子树&#xff0c;可以考虑用多重链表来实现。 就像我们虽然有计划生育&#xff0c;但我们还是无法确保每个家庭只养育一个孩子的冲动&a…

海量数据去重

海量数据去重 一个文件中有40亿条数据&#xff0c;每条数据是一个32位的数字串&#xff0c;设计算法对其去重&#xff0c;相同的数字串仅保留一个&#xff0c;内存限制1G. 方法一&#xff1a;排序 对所有数字串进行排序&#xff0c;重复的数据传必然相邻&#xff0c;保留第一…