# 為什么需要心跳檢測? (待定,還沒想好)
* * * * *
正常的情況客戶端斷開連接會向服務端發送一個fin包,服務端收到fin包后得知客戶端連接斷開,則立刻觸發事件回調。
但是有些極端情況如客戶端掉電、網絡關閉、拔網線、路由故障等,這些情況客戶端無法發送fin包給服務端,服務端便無法知道連接已經斷開。如果客戶端與服務端定時有心跳數據傳輸,則會比較及時的發現連接斷開,觸發事件回調。
另外路由節點防火墻會關閉長時間不通訊的socket連接,導致socket長連接斷開。所以需要客戶端與服務端定時發送心跳數據保持連接不被斷開。
# 心跳檢測的原理是什么?
* * * * *
服務端向客戶端(或者客戶端向服務器)發送心跳檢測,客戶端(服務端)接收到心跳數據后,可以忽略不做任何處理,也可以回應心跳檢測(向服務端(客戶端)發送一段任意數據)。這就分為兩種情況,
1、當服務端不要求客戶端必須回應心跳檢測時,假如客戶端遇到掉電等極端情況,這時服務端向客戶端發送的心跳數據在TCP層面就會發送超時,遇到這種超時情況TCP會重試多次(次數及間隔依賴操作系統的配置),多次無果后會斷開連接。這種極端情況從連接斷開到服務端檢測到可能要持續至少10分鐘才觸發事件回調。
2、當服務端要求必須回應檢測時,如果服務端在規定的時間內沒有收到客戶端的任何數據,則立刻判定客戶端已經斷開,服務端就立即斷開連接觸發事件回調。
## 心跳包發送格式
* * * * *
| 功能 | 幀頭 | 長度 | 網關地址 | 模塊地址 | 數據 |
| --- | --- | --- | --- | --- | --- |
| 心跳包 | 0x55 | 0x02 | 0x00000000 | 0x00000000 | 0x20 |