心跳檢測以及應用層心跳包機制設計

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

目錄

  • 心跳檢測應用場景
    • 死連接情況
    • 保活
    • 傳遞有效業務數據
  • 心跳包機制設計
    • 通用心跳包設計
    • 有代理的心跳包設計

心跳檢測應用場景

心跳檢測一般有兩個作用:保活和檢測死連接。

死連接情況

服務器與客戶端不在一個網絡中,之間的數據會經過多個路由器和交換機,如果其中某個必經之路的機器出現了故障,并且在一段時間內沒有恢復,則會導致這之間的鏈路不再通暢,此時服務器和客戶端之間沒有數據交換。并且由于TCP連接是狀態機,所以對于這種情況,通信兩方是無法感知與對方的連接是否正常。又如果客戶端因為網絡原因或者崩潰等許多原因斷開了與服務端的連接,然而服務端卻不知道客戶端已經斷開了連接并等待客戶端給他發送數據占用著系統資源,我們稱這樣的情況為“死連接”。
在這個情況中,我們只要在服務端向客戶端發送一個數據包,即可檢測連接是否正常,這類數據包稱為心跳包,這種操作稱為心跳檢測。如果一個連接長時間沒有正常數據來往,有沒有心跳包來往,就可以認為這個連接已經不存在了,此時應該關閉socket來回收連接資源。

保活

一個客戶端在連接服務器之后,如果長時間沒有和服務器有數據來往,可能會被防火墻程序關閉連接,但是有時我們希望這個連接保持下去。因為對于即時通信來說,服務器沒有消息時,確實不會有數據交換,但是連接關閉的話,新消息到來的話就無法接受到了。這種情況,我們只需要向對方發送心跳包即可實現保活。

傳遞有效業務數據

實際應用中,有時需要定時或者不定時地從服務端更新一些數據,可以把這類數據放在心跳包中,定時或者不定時更新。
但是對于連接數較多時,為了減輕網絡帶寬和流量,設計心跳包數據格式時應該盡量減少心跳包大小。

心跳包機制設計

通用心跳包設計

心跳包其實就是一個預先設置好格式的數據包,在程序中啟動一個定時器定時發送即可。
但是如果通信兩端有頻繁的業務數據來往,此時這些數據包本身就可以起到保活的作用,就沒有必要浪費流量發送心跳包了。
最佳的做法就是記錄最近一次收發數據包的時間,在每次收數據和發送數據的時候就更新這個時間。而心跳檢測的計時器在每次檢測時都將這個時間與當前的系統時間做比較,如果時間間隔大于允許的最大間隔,則發送一次心跳包。
簡而言之:在與對端之間沒有數據來往達到一定時間間隔時,才發送一次心跳包。
同時檢測心跳包的一方,應該是在與對端沒有數據來往達到一定時間間隔時才做一次心跳檢測。
一般來說是客戶端主動向服務端發送心跳包,服務端做心跳檢測來決定是否斷開連接。從客戶端的角度來說,客戶端為了讓自己得到服務端的正常服務,有必要主動和服務端保持正常連接。服務端在收到客戶端的心跳包時,應該給客戶端一個心跳應答。

有代理的心跳包設計

在后端服務程序與客戶端之間存在代理服務時,后端服務與代理服務之間是長連接,代理服務與客戶端之間也是長連接。
后端服務器的業務類型是訂閱類型,客戶端一旦訂閱某個類型的主題,就很少或者不再發送數據給服務器了,服務器會將被訂閱的數據下發到代理服務器,然后客戶端從代理服務器獲取數據。
在這里插入圖片描述
現在有一個情況:客戶端和代理服務之間的連接斷開,代理服務和后端服務的連接正常。此時后端服務的下行數據會一直暢通,但此時客戶端與代理服務可能已經斷開好一會兒了。此時后端服務會根據下行數據更新最后一次心跳時間,所以會導致心跳檢測誤判后端程序與客戶端的連接狀態。因為這里我們使用的方法仍然是檢測后端服務更新心跳包時間。
此時只需要更改機制為:只通過后端服務的上行數據來更新時間戳,若超過某段時間后仍然沒有上行數據,則說明客戶端已經斷開了(這段時間內,服務端既沒有收到客戶端的業務數據包,也沒有收到客戶端的心跳數據包)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376799.shtml
英文地址,請注明出處:http://en.pswp.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;保留第一…