2016-01-25 33 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),这也支持远程邮件。事件采购和消息传递架构的结合可以为您提供所需的所有水平可扩展性。