IM后台實現的一些思考


IM后台實現的一些思考

   之前困惑於IM如何維持用戶的在線狀態,如果用UDP,那么服務器為了得知客戶端是否還在線,是否輪詢用戶列表,對每個用戶發包探測?如果這樣,客戶端沒有任何動作,服務器已經忙於維護在線狀態而不斷占用CPU輪詢,不斷發包,而且這種情況下如果用戶下線,好友還要等到服務器輪詢到該用戶才知道他下線了,這個延時比較大。反之,如果對每個在線用戶維護一個TCP連接,這樣用戶一下線服務器就立刻知道,但是,用戶量這么大,每個用戶fork一個進程不現實,而單個進程能打開的文件數目是1024。再說,大量的TCP連接長時間占用系統資源。

   看了騰訊大講堂的視頻,有些收獲,最大的收獲是,清楚計算機網絡沒學好……端口映射,上網查了下資料,原來還有個打洞的技術,不過,還是選擇用服務器轉發簡單。

   抓包,發現QQ登錄時發了好多了UDP,登錄后,每隔半分鍾發個數據報,這可能就是講座中提到的hello,服務器回復一個數據報,如果沒有回復,客戶端就重發,我這才發現,服務器沒有用TCP維護與客戶的連接,也沒有對客戶輪詢發包,而是用戶自己發hello包通知服務器自己還在,服務器上記錄有客戶最近一次hello的時間,服務器上有個遍歷記錄的進程,發現hello時間距今超過半分鍾,客戶就算是斷線了,而客戶如果正常下線,則會發送離線提示,這樣好友能立刻知道客戶下線,即使客戶無故斷線,最遲也是半分鍾的延遲而已。之所以要30秒一次hello包,是因為客戶端有可能是處於局域網中,要通過路由器與服務器通信,涉及到局域網與外網通信,要“打洞“,而路由器上的連接session只保存可能只保存數十秒,所以要不斷”打洞“,也就是不斷發hello包維持通信。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM