Socket连接心跳包的机制总结
文章目錄
- Socket連接心跳包的機制總結
- 心跳包的由來
- 心跳包的作用
- 心跳包由服務端還是客戶端發送?
Socket連接心跳包的機制總結
心跳包的由來
心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活著。事實上這是為了保持長連接,至于這個包的內容,是沒有什么特別規定的,不過一般都是很小的包,或者只包含包頭的一個空包。
在TCP的機制里面,本身是存在有心跳包的機制的,也就是TCP的選項:SO_KEEPALIVE。系統默認是設置的2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火墻這些斷線。而且邏輯層處理斷線可能也不是那么好處理。一般,如果只是用于保活還是可以的。
在長連接下,有可能很長一段時間都沒有數據往來。理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節點出現什么故障是難以知道的。更要命的是,有的節點(防火墻)會自動把一定時間之內沒有數據交互的連接給斷掉。在這個時候,就需要我們的心跳包了,用于維持長連接,保活。
總的來說,心跳包主要也就是用于長連接的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。
心跳包的作用
長連接的保活和斷線處理。
心跳包由服務端還是客戶端發送?
這里就存在這樣的一個疑問?是由服務端還是客戶端發送心跳包?
心跳包讓哪一方來發依賴于是否需要感知對方斷開了通信連接。個人意見,如果是較封閉的系統(需要嚴格權限認證的環境),同時連接數相對較小的環境下可以考慮服務端發送心跳包。
較為開放的系統,或連接數較多的環境(如互聯網應用)應考慮客戶端發心跳包。
客戶端發心跳包舉例:
第一種情況:客戶端判斷連接情況
心跳檢測步驟:
1 客戶端每隔一個時間間隔發生一個探測包給服務器
2 客戶端發包時啟動一個超時定時器
3 服務器端接收到檢測包,應該回應一個包
4 如果客戶機收到服務器的應答包,則說明服務器正常,刪除超時定時器
5 如果客戶端的超時定時器超時,依然沒有收到應答包,則說明服務器掛了
第二種情況:服務端判斷連接情況
1、服務端與客戶端建立連接時啟動一個超時定時器。
2、客戶端每隔一個時間間隔發生一個探測包給服務器
3、如果服務端收到客戶端的數據包或者探測包,則說明客戶端正常,定時器重置。
4、如果服務端的超時定時器超時,依然沒有收到探測包或者數據包,則說明客戶端掛了。
服務端發心跳包舉例也可以照樣字給出,這里就不羅列了。
總結
以上是生活随笔為你收集整理的Socket连接心跳包的机制总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加权最小二乘法的理解
- 下一篇: Qt 关于定时器实用的总结