一例長連接keepalive常見實現錯誤

最近在帶一個項目的過程中,看到測試同學提了一BUG:對軟件進行網絡限速之後,軟件會自動掉線,並且根據日誌能夠看出是服務器端主動關閉了該連接,導致客戶端掉線。而該BUG遲遲沒有得到解決,於是叫上負責開發的同學,問其如何實現的keepalive的超時判斷機制,負責同學的回答和我預料的完全一樣:當在閥值N秒收不到對端發來的KEEPALIVE包,則認爲網絡出現問題,主動關閉該socket。

先不談該處理的對錯,我們首先分析一下keepalive的作用:

一、由於IP地址的短缺等原因,很多團體採用NAT的方式接入到互聯網,NAT負責維護外部數據包到內網地址的映射關係(session),並且回收session算法中,主要是根據雙端沒有數據流動的時長。所以我們實現keealive一個主要的目的是防止NAT回收了session,導致我們的邏輯鏈接失效。

二、用戶偵測連接的健康狀況,如果一端每n秒發送一個數據包,而對應端n+m(m爲一閥值,根據現有互聯網狀況而定)秒沒有收到任何數據包,則可以認爲該連接出現問題,需要重建連接。

對於NAT,其回收session並不是根據有無keepalive包,而是有無數據(IP包)流動。而網絡健康的判斷規則也應該是有無數據包流動。我們應用中採用keepalive的機制是爲了在應用無正常業務數據包時,爲 上述 一 二而做。

所以,簡單期間,直接修改超時判斷標準,當收到對端發來的任何數據包時,都應該更新最後一次收包時間。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章