題:
不使用時,WhatsApp如何接收消息?
Ram Rachum
2013-04-19 22:21:30 UTC
view on stackexchange narkive permalink

我對WhatsApp在不使用時如何接收消息感到好奇。

我的意思是,我知道WhatsApp使用Internet連接而不是手機網絡來工作。想像一下我幾個小時都沒有觸摸手機。那時,一個朋友在WhatsApp上給我發送了一條消息。我馬上知道。這是否意味著WhatsApp始終保持Internet連接連接?這是否意味著WhatsApp充當服務器,打開電話上的端口?還是一個長時間運行的HTTP請求?

另請參閱https://www.whatsapp.com/faq/zh/s60/20910578
另請參閱http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html
六 答案:
Trebor Rude
2013-04-20 00:01:10 UTC
view on stackexchange narkive permalink

起初,我以為這很可能是 Android雲到設備消息傳遞的實例,但事實並非如此:WhatsApp並未聲明必要的權限,並且可以在Eclair( Android 2.1),而云到設備的消息傳遞(及其替代品Google Cloud Messaging)至少需要Froyo(Android 2.2)。

不過,它很可能是某種推送通知服務。在沒有訪問WhatsApp的源代碼的情況下,不可能確切地說出它是如何實現的。

關於它在不使用時能夠接收消息的部分相對容易解釋。該應用程序幾乎可以肯定有一個服務,該服務在後台運行以定期向服務器簽入(或接收服務器推送或執行的任何操作)。當您收到消息時,服務會彈出通知。

關於服務器如何執行推送的問題,這是一種可能性(同樣,如果沒有源代碼,我將無法驗證):

  1. WhatsApp啟動並打開兩個套接字:一個用於監聽,一個用於向服務器發送消息。
  2. WhatsApps開始在第一個套接字上監聽。
  3. WhatsApp將包含您的電話號碼和偵聽套接字的端口的消息發送到服務器,並等待確認。
  4. 服務器在消息中記錄電話和端口號以及IP地址,
  5. 服務器將確認發送到應用。
  6. 應用收到確認並關閉消息套接字。
  7. 與您的消息一起的消息電話號碼作為目的地進入服務器。
  8. 服務器使用與您的電話號碼關聯的IP地址和端口號,並使用該信息將消息推送到您的電話。
  9. 為此,應用程序需要監視網絡連接狀態並在必要時重置偵聽套接字/重新發送註冊消息(例如,如果IP地址更改)。

Whatsapp是否取決於Playstore應用?摘自Wikipedia鏈接:*它要求運行Android 2.2或更高版本的設備也安裝了Market應用程序。*因此,可能並非完全相同,但肯定基於相同的原理。但是,您可能希望包括文章第二段的摘錄,以使您的答案更有價值(並獲得更多好評;)
您說得對,@Izzy,我應該添加更多詳細信息。但是,當我坐在Subway上編寫SGS3時,這很難做到。我已經更新了答案。 :-)
您的方向正確:)編輯後,對我來說看起來很完美,所以+1 :)
服務器如何進行推送?這就是問題的癥結所在。
我已經更新了答案,以包括服務器如何完成推送的可能性。
感謝您提供更具體的信息,但我仍然認為,您的分析並未考慮問題的癥結所在。步驟8對我來說很麻煩:它如何“將消息推送到您的手機”?發送網絡數據包?但是,您的設備如何在不連續在線的情況下接收網絡數據包?也許有某種我不熟悉的機制可以在將網絡數據包發送到您的手機時重新建立連接?
讓我嘗試解釋一下:有一種資源正在不斷使用。 WhatsApp服務打開的是監聽套接字。它只是坐在手機上等待入網連接(有關更多信息,請參見[listen(2)](http://linux.die.net/man/2/listen))。這在內存,電池電量或其他方面基本上沒有成本。當WhatsApp服務在服務器上註冊時,它會發送足夠的信息以使服務器與偵聽套接字建立網絡連接(通過調用[connect(2)](http://linux.die.net/man/2/連接)。
當您說“等待傳入的網絡連接”時,是否意味著等待建立TCP連接?當電話未連接到Internet時,如何等待這樣的事情?或者,當有Whatsapp消息要接收時,是否存在某種將電話連接到Internet的機制?
是的,正在等待TCP連接。只要您沒有明確關閉WiFi和移動數據,即使屏幕關閉,您的電話也已連接到Internet。
即使移動設備處於靜態ip上,Nat也不允許執行步驟8,這永遠不會發生。可能的方法是Xmpp或長輪詢http
它確實具有必需的權限。它在Play商店中列為“從Internet接收數據”。看到http://android.stackexchange.com/a/61794
不幸的是,傳入的TCP連接在移動設備上幾乎是不可能的。它們中的絕大多數沒有公共IP地址,即使它們具有公共IP地址(例如,支持IPv6的運營商),也通常會過濾入站連接。如今,大多數應用程序都使用Google的推送服務或將自己的持久客戶端滾動到服務器套接字連接(最值得注意的是Facebook)。根據我的經驗,WhatsApp似乎採取了一種混合方法:如果GCM可用,則持久套接字在空閒幾分鐘後將關閉。
Mindless152
2013-07-25 19:23:03 UTC
view on stackexchange narkive permalink

我當然可以確定WhatsApp不會打開任何監聽端口。大多數ISP會阻止傳入的請求,這將不起作用。

WhatsApp擁有服務。基本上,這意味著從技術上講,您永遠不會退出WhatsApp。因此,“不運行”時接收消息的方式與運行WhatsApp時接收消息的方式完全相同。

客戶端(在本例中為WhatsApp)連接到服務器。客戶端維護該連接。當服務器上有新內容要說時,它會通過該連接將其發送給客戶端,僅此而已。

您的第一個猜測是正確的。

WhatsApp沒有真正的註銷機制,請參見

WhatsApp沒有註銷機制。該應用程序旨在始終保持連接狀態,以便即使您沒有積極使用手機也可以快速接收消息。這類似於SMS的工作方式,並允許WhatsApp消息幾乎立即發送。

您的[link](http://www.whatsapp.com/faq/en/nokia/20910578)適用於諾基亞-我在他們的網站上找不到適用於Android的類似問題。您確定同樣適用於Android嗎?此[來自其Android常見問題的問題](http://www.whatsapp.com/faq/zh/android/20887936)表示它採用了PUSH架構(“消息是否仍需要很長時間才能到達您的手機? “)-而不是持續連接的服務器/客戶端。
@DylanYaga是正確的。參見例如[此答案](http://android.stackexchange.com/a/32347/16575)和[Trebors這裡的答案](http://android.stackexchange.com/a/43974/16575)的最後一段。
這似乎是最合邏輯的。這些服務很多時候被稱為推送服務,但我無法想像客戶端會打開端口,實際上充當本地服務器。那肯定會引起安全問題。
black
2014-02-17 17:49:58 UTC
view on stackexchange narkive permalink

他們的常見問題解答建議他們使用GCM。檢查“消息是否仍需要很長時間才能到達手機?”

沒錯,FAQ暗示了這一點,但是正如Trebor Rude指出的那樣,該應用程序沒有必要的許可,因此他們不能使用GCM本身。
它確實具有必需的權限。它在Play商店中列為“從Internet接收數據”。看到http://android.stackexchange.com/a/61794
從我所見,他們使用GCM(如果可用)。如果由於某種原因(例如,在沒有Play服務的設備上或通過網絡過濾的設備)不可用,則該套接字會無限期保持運行狀態。
Dickson
2016-02-06 05:35:04 UTC
view on stackexchange narkive permalink

Whatsapp像其他應用一樣作為服務運行。(您始終保持連接狀態)發送給您的消息將存儲在whatsapp服務器上直到30天,在此期間您的whatsapp應該處於活動狀態以接收和確認收到消息。個人帳戶中存儲著用戶電話號碼@ whatsapp.net

**30天**。請鏈接該事實的來源
Nasir
2019-08-02 11:54:08 UTC
view on stackexchange narkive permalink

我認為應該是這樣的:

當whatsapp是新的時,它將使用基於PNS的解決方案,該PNS只會喚醒設備,一旦喚醒,它就可以創建套接字連接到whatsapp服務器。

當whatsapp如今流行之後,作為本機應用程序和本機應用程序而來的大多數設備都不會被殺死。在我的三星s8中,我無法卸載whatsapp,省電模式無法將其殺死

Revanth G
2020-01-10 07:20:11 UTC
view on stackexchange narkive permalink

Google保持與android的連接,而apns服務器保持與Apple設備的連接,沒有gcm或fcm的情況下,任何第三方都無法向Android設備發送推送通知。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...