遊戲伺服器心跳包的作用

2021-09-25 05:14:21 字數 2024 閱讀 4300

遊戲伺服器心跳包的作用

服務端為什麼需要心跳(保活)機制

tcp-keepalive-howto

閒說heartbeat心跳包和tcp協議的keepalive機制

socket心跳包機制

乙個tcp鏈結很長時間沒有資料傳送,路由器已經釋放tcp鏈結, 客戶端那邊close了, 但伺服器那邊也不會有反應

為了避免這種現象,可能需要改協議

比如:客戶端每隔一段時間傳送心跳資料報,如果長時間沒有心跳,伺服器關閉socket

之前的測試都是,手動強制關閉客戶端程序,然後檢視伺服器的情況,結果往往是,伺服器收到了客戶端關閉的事件。

其實,我一直忽略了乙個問題,我沒有拔掉網線來測試

上面的手動關閉客戶端程序,事實上並不能測試出想要的結果,因為程序是在應用層的

所以,這種測試方法不能保證網路驅動層也不傳送資料報文給伺服器。

經過測試發現,當應用層強制結束程序時,對於tcp連線,驅動層會傳送reset資料報!

而伺服器收到這個資料報就可以正常關閉了!

那麼,如果拔掉網線呢,伺服器收不到這個資料報,就會導致死連線存在!

所以,心跳包是必要的,或者應用tcp協議本身的keep-alive來設定

之所以產生前面的誤解,也是由於以前看書的時候,憑空想象,以為tcp連線如同一條繩子,一方斷開了,另外一方必然會知道的。

殊不知,tcp連線,這個「面向連線」的連線並不存在

它只是抽象出來的概念,對於物理層,對於網線、光纖而言,不存在連線不連線的概念,因為,對它們而言,無非就是一些電流脈衝而已。

tcp的連線,不過是通過ack、seq這些機制來模擬實現的。

這麼看來socket本身的斷開通知不是很靠譜,心跳包會更合理一些

那麼心跳包的乙個意義就是可以更可靠的檢測連線是否暢通

如果沒有特意的設定某些選項或者實現應用層心跳包,tcp空閒的時候是不會傳送任何資料報。

也就是說,當乙個tcp的socket,客戶端與服務端誰也不傳送資料,會一直保持著連線。

這其中如果有一方異常掉線(例如宕機、路由被破壞、防火牆切斷連線等)

另一端如果沒有傳送資料,永遠也不可能知道。這對於一些服務型的程式來說,是災難性的後果,將會導致服務端socket資源耗盡。

所以為了保證連線的有效性、及時有效地檢測到一方的非正常斷開,保證連線的資源被有效的利用,

我們就會需要一種保活的機制,通常改機制兩種處理方式:

1、利用tcp協議層實現的keepalive;

2、自己在應用層實現心跳包。

兩種方式的對比如下:

1、tcp協議自帶的保活功能, 使用起來簡單, 減少了應用層**的複雜度. 更節省流量, 因為一般來說應用層的資料傳輸到協議層時都會被加上額外的包頭包尾. 由tcp協議提供的檢活, 其發的ack包比應用層的心跳包耗費更少的流量。

2、應用層心跳包相對與keepalive更靈活,因為協議層的心跳只能提供最純粹的檢活功能, 但是應用層自己可以隨意控制,甚至加入一些額外邏輯。

3、應用層心跳包相對與keepalive更靈活,應用層心跳包不依賴於協議,如若有一天不用tcp要改為udp了,只需做少量改動甚至不用改動即可實現轉換。

網路上有說:存活(keepalive)並不是tcp規範的一部分。在host requirements rfc羅列有不使用它的三個理由:

(1)在短暫的故障期間,它們可能引起乙個良好連線(good connection)被釋放(dropped)

(2)它們消費了不必要的寬頻

(3)在以資料報計費的網際網路上它們(額外)花費金錢。

實際上,自己實現心跳包也會面臨同樣的問題,而第一點,在我測試過程中,只要設定引數合理短時間內並不會引起連線主動斷開。

比如如果某玩家應用加速器作弊,那麼他傳送的心跳包時間時間間隔就會異常,這樣就可以揪出作弊

但是***已經越來越高階了,檢測心跳包已經幾乎沒用,所以這個作用幾乎沒有了

mysql 做遊戲伺服器配置 遊戲伺服器部署

bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...

mysql遊戲伺服器快取 遊戲伺服器快取策略

1 什麼是快取 在資料庫與伺服器邏輯之間加入的資料層 2 作用 減少資料庫操作 伺服器使用mysql作為資料庫,mysql每秒鐘併發數量有限,所以我們要減少mysql的操作。3 erlang的快取 erlang 在記憶體中可用 程序字典 gen state ets 儲存變數,理論上三種方式都可以作為...

遊戲伺服器架構

登陸伺服器判斷賬戶合法性,如果合法的話,把session資訊寫入memcache,閘道器伺服器收到玩家連線請求後,在memcache裡查詢是否合法玩家,防止非法連線。閘道器伺服器要管理玩家連線,需要高併發,可以開多個 scene mgr純粹的 訊息功能 資料庫伺服器純粹的查詢修改資料功能,如果成為瓶...