[心跳] 互聯網推送服務原理:長連接+心跳機制


互聯網推送消息的方式很常見,特別是移動互聯網上,手機每天都能收到好多推送消息,經過研究發現,這些推送服務的原理都是維護一個長連接(要不不可能達到實時效果),但普通的socket連接對服務器的消耗太大了,所以才會出現像MQTT這種輕量級低消耗的協議來維護長連接,那么要如何維護長連接呢?

    在寫之前,我們首先了解一下為什么android維護長連接需要心跳機制,首先我們知道,維護任何一個長連接都需要心跳機制,客戶端發送一個心跳給服務器,服務器給客戶端一個心跳應答,這樣就形成客戶端服務器的一次完整的握手,這個握手是讓雙方都知道他們之間的連接是沒有斷開,客戶端是在線的。如果超過一個時間的閾值,客戶端沒有收到服務器的應答,或者服務器沒有收到客戶端的心跳,那么對客戶端來說則斷開與服務器的連接重新建立一個連接,對服務器來說只要斷開這個連接即可。那么在智能手機上的長連接心跳和在Internet上的長連接心跳有什么不同的目的呢?原因就在於智能手機使用的是移動無線網絡,那么我們在講長連接之前我們首先要了解無線移動網絡的特點。

1.無線移動網絡的特點:

    當一台智能手機連上移動網絡時,其實並沒有真正連接上Internet,運營商分配給手機的IP其實是運營商的內網IP,手機終端要連接上Internet還必須通過運營商的網關進行IP地址的轉換,這個網關簡稱為NAT(NetWork Address Translation),簡單來說就是手機終端連接Internet 其實就是移動內網IP,端口,外網IP之間相互映射。相當於在手機終端在移動無線網絡這堵牆上打個洞與外面的Internet相連。原理圖如下:(來源網絡)



    GGSN(GateWay GPRS Support Note 網關GPRS支持節點)模塊就實現了NAT功能,由於大部分的移動無線網絡運營商為了減少網關NAT映射表的負荷,如

果一個鏈路有一段時間沒有通信時就會刪除其對應表,造成鏈路中斷,正是這種刻意縮短空閑連接的釋放超時,原本是想節省信道資源的作用,沒想到讓互聯網

的應用不得以遠高於正常頻率發送心跳來維護推送的長連接。這也是為什么會有之前的信令風暴,微信搖收費的傳言,因為這類的應用發送心跳的頻率是很短的,

既造成了信道資源的浪費,也造成了手機電量的快速消耗。

2.android系統的推送和IOS的推送有什么區別:

    首先我們必須知道,所有的推送功能必須有一個客戶端和服務器的長連接,因為推送是由服務器主動向客戶端發送消息,如果客戶端和服務器之間不存在一個長連接那么服務器是無法來主動連接客戶端的。因而推送功能都是基於長連接的基礎是上的。

    iOS長連接是由系統來維護的,也就是說蘋果的IOS系統在系統級別維護了一個客戶端和蘋果服務器的長鏈接,IOS上的所有應用上的推送都是先將消息推送到蘋果的服務器然后將蘋果服務器通過這個系統級別的長鏈接推送到手機終端上,這樣的的幾個好處為:1.在手機終端始終只要維護一個長連接即可,而且由於

這個長鏈接是系統級別的不會出現被殺死而無法推送的情況。2.省電,不會出現每個應用都各自維護一個自己的長連接。3.安全,只有在蘋果注冊的開發者才能

夠進行推送,等等。

    android的長連接是由每個應用各自維護的,但是google也推出了和蘋果技術架構相似的推送框架,C2DM,雲端推送功能,但是由於google的服務器不在中

國境內,其他的原因你懂的。所以導致這個推送無法使用,android的開發者不得不自己去維護一個長鏈接,於是每個應用如果都24小時在線,那么都得各自維

護一個長連接,這種電量和流量的消耗是可想而知的。雖然國內也出現了各種推送平台,但是都無法達到只維護一個長連接這種消耗的級別。

3.推送的實現方式:

    一:客戶端不斷的查詢服務器,檢索新內容,也就是所謂的pull 或者輪詢方式

    二:客戶端和服務器之間維持一個TCP/IP長連接,服務器向客戶端push

    三:服務器又新內容時,發送一條類似短信的信令給客戶端,客戶端收到后從服務器中下載新內容,也就是SMS的推送方式

    蘋果的推送系統和googleC2DM推送系統其實都是在系統級別維護一個TCP/IP長連接,都是基於第二種的方式進行推送的。第三種方式由於運營商沒有免費開放。這種信令導致了這種推送在成本上是無法接受的,雖然這種推送的方式非常的穩定,高效和及時。如果想了解android中各種推送方式請參考這個鏈接:Android實現推送方式解決方案 這篇博客已經介紹的非常好了。


免責聲明!

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



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