什麼是心跳?
在使用 tcp 長連線的im 服務設計中,往往都會涉及到心跳。心跳一般是指某端(絕大多數情況下是客戶端)每隔一定時間向對端傳送自定義指令,以判斷雙方是否存活,因其按照一定間隔傳送,類似於心跳,故被稱為心跳指令。
為什麼要在應用層做心跳
那麼問題就隨之而來了:為什麼需要在應用層做心跳,難道 tcp 不是個可靠連線嗎?我們不能夠依賴 tcp 做斷線檢測嗎?比如使用 tcp 的 keepalive 機制來實現。應用層心跳是目前的最佳實踐嗎?怎麼樣的心跳才是最佳實踐。
好吧,是不是以前從來沒有仔細考慮過這些問題,僅僅只是個簡單的心跳而已啊!(一臉懵逼)
對於客戶端而言,使用 tcp 長連線來實現業務的最大驅動力在於:在當前連線可用的情況下,每一次請求都只是簡單的資料傳送和接受,免去了 dns 解析,連線建立等時間,大大加快了請求的速度,同時也有利於接受伺服器的實時訊息。
但前提是連線可用。如果連線無法很好地保持,每次請求就會變成撞大運:運氣好,通過長連線傳送請求並收到反饋。運氣差,當前連線已失效,請求遲遲沒有收到反饋直到超時,又需要一次連線建立的過程,其效率甚至還不如 http。而連線保持的前提必然是檢測連線的可用性,並在連線不可用時主動放棄當前連線並建立新的連線。基於這個前提,必須要有一種機制用於檢測連線可用性。同時流動網路的特殊性也要求客戶端需要在空餘時間傳送一定的信令,避免連線被**。詳見《
從上面我們可以得出結論,目前而言,應用層心跳的確是檢測連線有效性,雙方是否存活的最佳實踐,那麼剩下的問題就是怎麼實現。
最簡單粗暴做法當然是定時心跳,如每隔 30 秒心跳一次,15 秒內沒有收到心跳回包則認為當前連線已失效,斷開連線並進行重連。這種做法最直接,實現也簡單。唯一的問題是比較耗電和耗流量。以乙個協議包 5 個位元組計算,一天收發 2880 個心跳包,乙個月就是 5 * 2 * 2880 * 30 = 0.8 m 的流量,如果手機上多裝幾個 im 軟體,每個月光心跳就好幾兆流量沒了,更不用說頻繁的心跳帶來的電量損耗。
移動IM開發指南2 心跳指令詳解
網易雲信多年ios im sdk開發的經驗,深度分析實際開發中的各種常見問題。移動im開發指南1 如何進行技術選型 移動im開發指南3 如何優化登入模組 在使用 tcp 長連線的 im 服務設計中,往往都會涉及到心跳。心跳一般是指某端 絕大多數情況下是客戶端 每隔一定時間向對端傳送自定義指令,以判斷...
移動IM開發學習 1
一.通訊方式 im通訊方式有兩種選擇 裝置直連 p2p 和通過伺服器中轉。1.p2p p2p多見於區域網內聊天工具,典型的應用有 飛鴿傳書,天網maze等。這類軟體在啟動後一般做兩件事情 進行udp廣播 傳送自己資訊和接受同區域網內其他端資訊 開啟tcp監聽 等待其他端進行連線 2.伺服器中轉 幾乎...
移動IM開發學習 3
在ubuntu系統上 xmpp環境搭建之mysql安裝 一.安裝mysql 資料庫也是伺服器,連線需要 位址 埠號 開啟終端 二.遠端訪問mysql資料庫 mysql遠端訪問的命令 mysql h192 168 1.11 uroot p123456出現這樣的錯誤 error 2003 hy000 c...