以下內(nèi)容整理自互聯(lián)網(wǎng)侣诵,僅用于個人學(xué)習(xí)
原文http://huachao1001.github.io/article.html?6sO6QBBT
1. 心跳機制
心跳機制是定時發(fā)送一個自定義的結(jié)構(gòu)體(心跳包),讓對方知道自己還活著,以確保連接的有效性的機制究西。
當(dāng)一臺智能手機連上移動網(wǎng)絡(luò)時,其實并沒有真正連接上Internet物喷,運營商分配給手機的IP其實是運營商的內(nèi)網(wǎng)IP卤材,手機終端要連接上Internet還必須通過運營商的網(wǎng)關(guān)進行IP地址的轉(zhuǎn)換,這個網(wǎng)關(guān)簡稱為NAT(NetWork Address Translation)峦失,簡單來說就是手機終端連接Internet 其實就是移動內(nèi)網(wǎng)IP扇丛,端口,外網(wǎng)IP之間相互映射尉辑。 由于大部分的移動無線網(wǎng)絡(luò)運營商為了減少網(wǎng)關(guān)NAT映射表的負荷帆精,如果一個鏈路有一段時間沒有通信時就會刪除其對應(yīng)表,造成鏈路中斷隧魄,正是這種刻意縮短空閑連接的釋放超時卓练,原本是想節(jié)省信道資源的作用,卻讓應(yīng)用不得以遠高于正常頻率發(fā)送心跳來維護推送的長連接购啄。
另外襟企,長連接比較耗電。
2. android系統(tǒng)的推送和iOS的推送有什么區(qū)別
首先我們必須知道狮含,所有的推送功能必須有一個客戶端和服務(wù)器的長連接顽悼,因為推送是由服務(wù)器主動向客戶端發(fā)送消息,如果客戶端和服務(wù)器之間不存在一個長連接那么服務(wù)器是無法來主動連接客戶端的辉川。因而推送功能都是基于長連接的基礎(chǔ)是上的表蝙。
IOS長連接是由系統(tǒng)來維護的拴测,也就是說蘋果的IOS系統(tǒng)在系統(tǒng)級別維護了一個客戶端和蘋果服務(wù)器的長鏈接乓旗,IOS上的所有應(yīng)用上的推送都是先將消息推送到蘋果的服務(wù)器然后將蘋果服務(wù)器通過這個系統(tǒng)級別的長連接推送到手機終端上,這樣的的幾個好處為:
- 在手機終端始終只要維護一個長連接即可集索,而且由于這個長連接是系統(tǒng)級別的不會出現(xiàn)被殺死而無法推送的情況屿愚。
- 省電,不會出現(xiàn)每個應(yīng)用都各自維護一個自己的長連接务荆。
- 安全妆距,只有在蘋果注冊的開發(fā)者才能夠進行推送,等等函匕。
android的長連接是由每個應(yīng)用各自維護的娱据,但是google也推出了和蘋果技術(shù)架構(gòu)相似的推送框架,C2DM,云端推送功能盅惜,但是由于google的服務(wù)器不在中國境內(nèi)中剩,其他的原因你懂的忌穿。所以導(dǎo)致這個推送無法使用,android的開發(fā)者不得不自己去維護一個長鏈接结啼,于是每個應(yīng)用如果都24小時在線掠剑,那么都得各自維護一個長連接,這種電量和流量的消耗是可想而知的郊愧。雖然國內(nèi)也出現(xiàn)了各種推送平臺朴译,但是都無法達到只維護一個長連接這種消耗的級別。
3. 推送的實現(xiàn)方式
- 客戶端不斷的查詢服務(wù)器属铁,檢索新內(nèi)容眠寿,也就是所謂的pull 或者輪詢方式
- 客戶端和服務(wù)器之間維持一個TCP/IP長連接,服務(wù)器向客戶端push
- 服務(wù)器有新內(nèi)容時焦蘑,發(fā)送一條類似短信的信令給客戶端澜公,客戶端收到后從服務(wù)器中下載新內(nèi)容,也就是SMS的推送方式
蘋果的推送系統(tǒng)和googleC2DM推送系統(tǒng)其實都是在系統(tǒng)級別維護一個TCP/IP長連接喇肋,都是基于第二種的方式進行推送的坟乾。第三種方式由于運營商沒有免費開放這種信令導(dǎo)致了這種推送在成本上是無法接受的,雖然這種推送的方式非常的穩(wěn)定蝶防,高效和及時甚侣。
在TCP機制里面,本身是存在有心跳包機制的间学,也就是TCP選項:SO_KEEPALIVE. 系統(tǒng)默認(rèn)是設(shè)置的2小時的心跳頻率殷费。
心跳包的機制,其實就是傳統(tǒng)的長連接低葫∠晗郏或許有的人知道消息推送的機制,消息推送也是一種長連接 嘿悬,是將數(shù)據(jù)有服務(wù)器端推送到客戶端這邊從而改變傳統(tǒng)的“拉”的請求方式实柠。下面介紹一下安卓和客戶端兩個數(shù)據(jù)請求的方式
- push 這個也就是有服務(wù)器推送到客戶端這邊 現(xiàn)在有第三方技術(shù) 比如極光推送。
- pull 這種方式就是客戶端向服務(wù)器發(fā)送請求數(shù)據(jù)(http請求)