遊戲伺服器心跳包的作用
首先查一下tcp的斷線是否真的可靠
看到了一位同學的經驗
之前的測試都是,手動強制關閉客戶端程序,然後檢視伺服器的情況,結果往往是,伺服器收到了客戶端關閉的事件。其實,我一直忽略了一個問題,我沒有拔掉網線來測試!
上面的手動關閉客戶端程序,事實上並不能測試出想要的結果,因為程序是在應用層的,所以,這種測試方法不能保證網路驅動層也不傳送資料報文給伺服器。經過測試發現,當應用層強制結束程序時,對於TCP連線,驅動層會發送reset資料包!而伺服器收到這個資料包就可以正常關閉了!
那麼,如果拔掉網線呢,伺服器收不到這個資料包,就會導致死連線存在!
所以,心跳包是必要的,或者應用TCP協議本身的Keep-alive來設定
之所以產生前面的誤解,也是由於以前看書的時候,憑空想象,以為TCP連線如同一條繩子,一方斷開了,另外一方必然會知道的。殊不知,TCP連線,這個“面向連線”的連線並不存在,它只是抽象出來的概念,對於物理層,對於網線、光纖而言,不存在連線不連線的概念,因為,對它們而言,無非就是一些電流脈衝而已。TCP的連線,不過是通過ACK、SEQ這些機制來模擬實現的。
以上為引用
這麼看來socket本身的斷開通知不是很靠譜,心跳包會更合理一些
那麼心跳包的一個意義就是可以更可靠的檢測連線是否暢通
之後詢問了一下組內其他同學
他們表示,頁遊之前會用心跳包檢測加速作弊
比如如果某玩家應用加速器作弊,那麼他傳送的心跳包時間時間間隔就會異常,這樣就可以揪出作弊,但是。。作弊器已經越來越高端了,檢測心跳包已經幾乎沒用,所以這個作用幾乎沒有了
心跳包曾經可以檢測作弊
組內同學還表示,心跳包可以檢測遊戲延遲,不過。。。手遊我檢測個什麼延遲
心跳包可以檢測遊戲延遲