Push mail 的實現原理是什麼?

目前有很多push mail的解決方案,國外的RIM Blackberry,Apple iOS,Google Android,國內的尚郵等第三方郵箱託管服務.

但是我一直不明白其中的實現原理,有說是pull的,有說是運營商發送二進位triger的.說的好像很簡單,但是都沒有技術細節.

我所知道的三種實現方法,

  • 第一,客戶端不斷查詢伺服器,檢索新內容,就是所謂的pull,
  • 第二客戶端和伺服器保持一條socket,並且周期性的告知伺服器undead,
  • 第三,伺服器有新內容時,發送一條類似簡訊的信令給客戶端,即上文所述triger,客戶端開啟相應的應用程序或者後台服務抓取信息.

請教知乎的朋友:

  1. 一方面是實現的技術是什麼,
  2. 另一方面是技術原理是什麼,
  3. 是否如我所知,
  4. 是否有我還未知的技術.

我在自己的博客上總結過黑莓的實現方式,但是沒有官方證實,我也不敢肯定自己的想法是不是正確。(看這裡http://sqbing.info/?p=38)


技術原理基本上就樓主所說的三種:

  1. Pull
  2. SMS
  3. Persistent TCP/IP

Pull和SMS方式的缺點是顯而易見的,Pull會加重伺服器負擔,過快消耗移動設備的電力;SMS費用較高,時效性也沒有優勢,而且很難在全球範圍內推廣。比較靠譜的方案是TCP/IP長連接。我可以說說Android上Push Notification的實現原理。

Android從2.2版之後推出了一個新的東西:C2DM(Android Cloud to Device Messaging Framework),其實就是Android上的Push Notification機制。使用C2DM,第三方應用程序可以搭建自己的伺服器,配合Google的C2DM Server實現消息的即時通知。

C2DM其實使用的也是TCP/IP長連接,所不同的是它運行在系統級別,從而避免了被操作系統殺死使整個Push機制失效的悲劇(第三方應用程序當然可以不使用C2DM自己實現Push機制,但一旦系統內存較低,程序被操作系統殺死後你就歇菜了)。另外,由於所有的第三方Push數據都必須走Google的C2DM Server,所以在實現上只需保持一個TCP/IP長連接,所有的Push數據都通過這個連接傳送,從而節省了很多電力開銷。

關於C2DM的更多信息,請參考:

Android Cloud to Device Messaging Framework - Google Projects for Android

http://code.google.com/intl/zh-CN/android/c2dm/


還有一種介於pull和Persistent TCP/IP之間的技術:long polling(長輪詢)。原理是客戶端每次對服務的請求都被服務端hold住,等到有message返回或time out之後,會再次主動發起請求,等待message的到達。這種模式不需要保持心跳,也不需要持續TCP的佔用,比較適合頁面端及時消息的推送。


端到端的實現主要有2類:

1、手機和郵件伺服器間有個中間伺服器/網關,提供推送

如:黑莓的BI;蘋果的推送服務;Android的C2DM

2、手機直接連郵件伺服器

如:微軟的ActiveSync

不論手機連中間伺服器還是直接連郵件伺服器,推送的實現可以是:

1、長連接推送

如:黑莓。

2、帶外的通知,如簡訊(也算推送),進而觸發終端上來拉

如:中移動的手機郵箱。

相比較推送做的好的還是黑莓,因為終端硬體也是它的,所以能在手機到BI和BI到郵件伺服器之間的協議上做不少工作,如:壓縮、定址、數據包等,尤其是手機和BI之間是UDP而不是TCP,因為無線網路穩定性遠低於PC的網路。

蘋果硬體也是自己的,在協議上本可以做的更好些,但剛開始的MobileMe效果不好,IT出身的廠商對無線網路特性的認知會逐步提高。


不同意lss說的,SMS Push沒有時效性的問題。

我來說明一下SMS Push,當有新郵件時,伺服器發送SMS Push,激活客戶端聯網收郵件,時效性是可以得到保證的,當然,如果要求有新郵件就立即收到,那的確是沒有Persistent TCP/IP快。

SMS Push最大的問題的確是費用,因為需要向目標設備發送SMS激活簡訊。

好處是,在此期間不需要手機有任何操作,因此對於手機用戶來說比較節省流量和省電。


建議看iFanr的一篇老文章:關於PushMail那些事

http://www.ifanr.com/3371


Mobileme和Gmail應該很顯然是Persistent TCP/IP或者蔡明軍所說的long polling,常常網頁端還沒有收到郵件,但手機端已經有通知了。


複雜度還是有的;建議參考ipad iphone的apple site的幫助——講解的很清楚了。


C2DM 需要gmail賬號支持,第一次要在google的伺服器上註冊,天朝是被牆的。

SMS要運營商的支持吧,如果沒有手機卡,純wifi是不是就無效了?


C2DM貌似需要每個客戶端都有Gmail賬戶才可以使用。

Persistent TCP/IP雖說是最靠譜的方式,但是在國內一些地區,移動網路質量比較差,這種長連接需要花很多功夫去維護,當然,最常遇到的問題就是手機系統自己把鏈接關閉了,這點非常頭痛。

還有一種方式是comet架構,http的長連接,樓上們的回復也有提及,這個可以參考一下pushlet,這個框架是一個鬼佬實現的,有js、java、as等各種客戶端實現,移植也比較方便。

當然最爽的是黑莓的推送機制了,直接跟運營商合作的,使用push消息來觸發,省電、及時,這也是黑莓的資費貴的原因之一吧,需要與運營商分成。


顯然由客戶端定時查詢伺服器這種方式不能稱為push mail,郵件肯定不是實時到達的,在查詢周期之間到達的郵件需要下一個查詢才能收到。

簡訊作為一個triger的話很顯然有實時性問題,我們總是會遇到簡訊沒有實時到達的問題。

只有tcp長鏈接才比較靠譜。一是這條鏈路上在沒有郵件的時候只需要保持心跳,二是客戶端和伺服器端都壓力比較小。三是最實時。


推薦閱讀:

HTC Desire 816能帮HTC打赢这场中低端战役吗?
在身體上做一個二維碼紋身,能否實現信息讀取,所讀取信息能否在不改變紋身圖案的狀況下實現更新或改變?
iOS 9 增加了左上角應用之間的跳轉導航,為何沒人指責蘋果抄安卓?
豌豆莢 2013 年清明節後執行的應用審查制度影響如何?

TAG:iOS | Blackberry黑莓 | 推送Push | 郵件推送 | 熱門問答 | Android |