2016-01-25 60 views
1

我目前正在學習關於網絡編程。我開始更多地瞭解互聯網協議和其他互聯網應用。WhatsApp如何工作?

所以我只想了解whatsapp是如何工作的?它使用xmpp,只是一個代碼來與服務器通信。但是背景發生了什麼?

whatsapp如何與服務器通話?什麼是whatsapp的xmpp服務器IP?與服務器通信時使用該應用的什麼類型的格式?爲什麼沒有人可以直接在PC上使用?如果whatsapp是一個通訊軟件,這意味着我可以通過任何設備或任何操作系統與服務器通信嗎?但我無法找到任何有關它的例子。

終於在我用我的電話號碼第一次註冊whatsapp後,它給我發短信並進行驗證。但在此之後,whatsapp如何認可我?從我的Mac地址?或從任何其他特殊的關鍵?

如果在具有兩個不同IP地址的兩個不同設備中識別密鑰或MAC地址相同,會發生什麼情況?服務器能理解嗎?他們中的一個會接受這個信息還是兩者?

所以我只想了解whatsapp背景下發生了什麼?

在此先感謝...

保持冷靜,我不是試圖破解WhatsApp的服務器;):P

+1

你要求的WhatsApp的內部運作?只有在那裏工作的人才能回答這些問題。 – DMH

+0

我聽說過類似於mac地址的whatsapp標識。如果只是在公司工作的人知道這個軟件是如何工作的,那麼人們如何學習呢?我只是想了解的所有信息可能學習和查找... – Fym

+0

你不學習的WhatsApp是如何工作的,你瞭解服務器,通信協議和其他東西。 – DMH

回答

1

WhatsApp的或大部分的其他信息應用的很少上的對等工作,以對等的基礎。所以它不會打開(從您的設備)到每個朋友的設備的連接。而您的設備連接到他們的服務器。然後它可以使用自定義的TCP協議或HTTP可以將消息傳遞給服務器。作爲回報,服務器會將它們發送給你的朋友的設備。如果您的朋友打開了他們的應用程序,或者至少運行的應用程序進程可能與服務器有活動連接。 WhatsApp將使用該連接向他們發送消息。如果他們的應用「脫機」,那麼他們可能會選擇向他們發送推送通知。 WhatsApp選擇Erlang是一種爲編寫可伸縮應用程序而設計的語言,這種應用程序可以承受錯誤。 Erlang使用一種稱爲Actor模型的抽象來實現併發性 - http://en.wikipedia.org/wiki/Act ....與傳統的共享內存方法不同,演員通過發送其他消息來進行通信。與線程不同的演員被設計爲輕量級。參與者可以在同一臺機器上,也可以在不同的機器上,並且消息傳遞抽象對兩者都有效。 WhatsApp的一個簡單實現可能是: 每個用戶/設備都被表示爲actor。該actor負責處理用戶的收件箱,如何將其序列化到磁盤,用戶發送的消息以及用戶收到的消息。假設Alice和Bob是WhatsApp上的朋友。所以有一個愛麗絲演員和一個鮑勃演員。

讓我們追溯一系列來回流動的消息: 愛麗絲決定給Bob發消息。 Alice的手機建立了與WhatsApp服務器的連接,並確定該連接肯定來自Alice的手機。愛麗絲現在通過TCP發送以下消息:「對於Bob:一個巨大的怪物攻擊金門大橋」。 WhatsApp前端服務器之一反序列化此消息並將此消息傳遞給名爲Alice的演員。 愛麗絲演員決定序列化這個並將其存儲在一個名爲「Alice's Sent Messages」的文件中,存儲在一個複製的文件系統中,以防止由於不可預測的怪物橫衝直撞造成的數據丟失。演員Alice接着決定通過向Bob發送消息「Alice的Msg1:一個巨大的怪物攻擊金門大橋」來轉發此消息給Bob。愛麗絲演員可以以指數退避的方式重試,直到演員的鮑勃承認接收到該消息。 鮑勃演員最終從收到消息(2),並決定該消息存儲在一個名爲「鮑勃的收件箱」文件。一旦它永久地存儲了這個消息,那麼演員將通過向演員發送其自己說的「我收到Msg1」的消息給Alice來接收該消息。愛麗絲演員現在可以停止它的重試工作。 Bob演員然後檢查Bob的電話是否與服務器有活動連接。它的確如此,因此Bob通過TCP將此消息流式傳輸到設備。 鮑勃看到這條消息並回復「For Alice:讓我們創建巨型機器人來對抗他們」。 Bob現在收到了Bob的演員,如步驟1所述。然後,演員Bob重複步驟2和步驟3,以確保Alice最終收到將拯救人類的想法。

WhatsApp的實際使用XMPP協議,而不是我上面列出的大大優於協議,但你明白了吧。

對於自己的應用程序需要考慮的事情: 您可能沒有過的客戶發送GPS座標控制到服務器的每10分鐘。如果您的客戶端在移動設備上運行,操作系統可能會決定讓您從資源中匱乏或者只是殺死您的進程。 您需要維護連接到服務器的客戶端的狀態,以確保您可以在滿足您的要求時將消息發送到活動客戶端。這是對幾乎每個框架都有的股票「Comet應用程序」示例的輕微修改。 從客戶端或服務器端建立一個TCP連接並不是一個非常大的資源浪費。如果您的服務器軟件生態系統支持非阻塞IO,則每個連接所需的狀態很小。如果你努力嘗試,你可以在平庸的盒子上支持10萬以上的連接。如果你在JVM上,Netty可能會幫助你。 Python有Twisted和Tornado。如果您在* NIX系統上,C++/C可以使用epoll,kqueue或select。 Golang通過它的標準庫支持大量的連接。我們已經解決了垂直可伸縮性問題,即您可以在簡單的盒子上支持多少用戶。 如果你真的想向外擴展,並建立一個分佈式系統維護狀態,你可能要考慮二郎(與OTP)或Actor模型的其他實現,如阿卡(JVM),這也支持遠程郵件。事件採購和消息傳遞架構的結合可以爲您提供所需的所有水平可擴展性。