心跳包
心跳包就是在客戶端和服務器間定時通知對方本身狀態的一個本身定義的命令字,按照必定的時間間隔發送,相似於心跳,因此叫作心跳包服務器
心跳包的做用網絡
網絡中的接收和發送數據都是使用SOCKET進行實現。可是若是此套接字已經斷開,那發送數據和接收數據的時候就必定會有問題。但是如何判斷這個套接字是否還可使用呢?這個就須要在系統中建立心跳機制。其實TCP中已經爲咱們實現了一個叫作心跳的機制。若是你設置了心跳,那TCP就會在必定的時間(好比你設置的是3秒鐘)內發送你設置的次數的心跳(好比說2次),而且此信息不會影響你本身定義的協議。所謂「心跳」就是定時發送一個自定義的結構體(心跳包或心跳幀),讓對方知道本身「在線」。 以確保連接的有效性。
所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到後回覆一個固定信息若是服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。好比有些通訊軟件長時間不使用,要想知道它的狀態是在線仍是離線就須要心跳包,定時發包收包。發包方:能夠是客戶也能夠是服務端,看哪邊實現方便合理。通常是客戶端。服務器也能夠定時輪詢發心跳下去。心跳包之因此叫心跳包是由於:它像心跳同樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活着。事實上這是爲了保持長鏈接,至於這個包的內容,是沒有什麼特別規定的,不過通常都是很小的包,或者只包含包頭的一個空包。在TCP的機制裏面,自己是存在有心跳包的機制的,也就是TCP的選項。系統默認是設置的是2小時的心跳頻率。可是它檢查不到機器斷電、網線拔出、防火牆這些斷線。並且邏輯層處理斷線可能也不是那麼好處理。通常,若是隻是用於保活仍是能夠的。心跳包通常來講都是在邏輯層發送空的包來實現的。下一個定時器,在必定時間間隔下發送一個空包給客戶端,而後客戶端反饋一個一樣的空包回來,服務器若是在必定時間內收不到客戶端發送過來的反饋包,那就只有認定說掉線了。只須要send或者recv一下,若是結果爲零,則爲掉線。可是,在長鏈接下,有可能很長一段時間都沒有數據往來。理論上說,這個鏈接是一直保持鏈接的,可是實際狀況中,若是中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把必定時間以內沒有數據交互的鏈接給斷掉。在這個時候,就須要咱們的心跳包了,用於維持長鏈接,保活。在獲知了斷線以後,服務器邏輯可能須要作一些事情,好比斷線後的數據清理呀,從新鏈接呀固然,這個天然是要由邏輯層根據需求去作了。總的來講,心跳包主要也就是用於長鏈接的保活和斷線處理。通常的應用下,斷定時間在30-40秒比較不錯。若是實在要求高,那就在6-9秒。服務器端
心跳包機制
跳包之因此叫心跳包是由於:它像心跳同樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活着。事實上這是爲了保持長鏈接,至於這個包的內容,是沒有什麼特別規定的,不過通常都是很小的包,或者只包含包頭的一個空包。
在TCP的機制裏面,自己是存在有心跳包的機制的,也就是TCP的選項:SO_KEEPALIVE。系統默認是設置的2小時的心跳頻率。可是它檢查不到機器斷電、網線拔出、防火牆這些斷線。並且邏輯層處理斷線可能也不是那麼好處理。通常,若是隻是用於保活仍是能夠的。
心跳包通常來講都是在邏輯層發送空的echo包來實現的。下一個定時器,在必定時間間隔下發送一個空包給客戶端,而後客戶端反饋一個一樣的空包回來,服務器若是在必定時間內收不到客戶端發送過來的反饋包,那就只有認定說掉線了。
其實,要斷定掉線,只須要send或者recv一下,若是結果爲零,則爲掉線。可是,在長鏈接下,有可能很長一段時間都沒有數據往來。理論上說,這個鏈接是一直保持鏈接的,可是實際狀況中,若是中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把必定時間以內沒有數據交互的鏈接給斷掉。在這個時候,就須要咱們的心跳包了,用於維持長鏈接,保活。
在獲知了斷線以後,服務器邏輯可能須要作一些事情,好比斷線後的數據清理呀,從新鏈接呀……固然,這個天然是要由邏輯層根據需求去作了。
總的來講,心跳包主要也就是用於長鏈接的保活和斷線處理。通常的應用下,斷定時間在30-40秒比較不錯。若是實在要求高,那就在6-9秒。
心跳檢測步驟:
1客戶端每隔一個時間間隔發生一個探測包給服務器
2客戶端發包時啓動一個超時定時器
3服務器端接收到檢測包,應該回應一個包
4若是客戶機收到服務器的應答包,則說明服務器正常,刪除超時定時器
5若是客戶端的超時定時器超時,依然沒有收到應答包,則說明服務器掛了軟件