whatsapp如何运作?

时间:2016-01-25 01:45:36

标签: web-applications whatsapp

我目前正在学习网络编程。我开始更多地了解互联网协议和其他互联网应用程序。

所以我只是想了解whatsapp是如何工作的?它使用xmpp和一个代码来与服务器进行通信。但是在后台发生了什么?

whatsapp如何与服务器通话?什么是whatsapp的xmpp服务器ip?与服务器进行通信时使用该应用程序的格式是什么?为什么没有人可以直接在电脑上使用?如果whatsapp是一个通信软件,这意味着我可以通过任何设备或任何操作系统与服务器进行通信吗?但我找不到任何关于它的例子。

最后,我第一次使用我的电话号码注册了whatsapp,然后向我发送短信并进行验证。但在此之后,whatsapp如何识别我?从我的mac地址?或者从任何其他特殊钥匙?

如果在具有两个不同ip地址的两个不同设备中识别密钥或mac地址相同,会发生什么?服务器能理解吗?他们中的一个会接受这个消息吗?

所以我只想了解whatsapp背景下发生的事情?

提前致谢...

保持冷静,我不是想破解whatsapp服务器;):p

1 个答案:

答案 0 :(得分:2)

WhatsApp或大多数其他消息传递应用很少在点对点的基础上工作。因此,它不会打开(从您的设备)到您的每个朋友的连接。设备。而是您的设备连接到他们的服务器。然后,它可以使用自定义TCP协议或HTTP来将您的消息传达给服务器。作为回报,服务器会将它们发送给您的朋友'设备。如果您的朋友打开了他们的应用程序或至少运行了应用程序进程,则可能是与服务器的实时连接。 WhatsApp将使用该连接向他们发送您的消息。如果他们的应用是"离线"然后他们可能会选择向他们发送推送通知。 WhatsApp选择Erlang是一种语言,用于编写可承受错误的可扩展应用程序。 Erlang使用一种称为Actor模型的抽象来实现它的并发性 - http://en.wikipedia.org/wiki/Act ....而不是更传统的共享内存方法,actor通过发送彼此的消息进行通信。与线程不同的演员设计为轻量级。 Actor可以在同一台机器上,也可以在不同的机器上,并且消息传递抽象适用于两者。 WhatsApp的简单实现可能是: 每个用户/设备都表示为一个actor。该actor负责处理用户的收件箱,如何将其序列化到磁盘,用户发送的消息以及用户收到的消息。让我们假设Alice和Bob是WhatsApp的朋友。所以有一个Alice演员和一个Bob演员。

让我们追踪一系列来回流动的消息: 爱丽丝决定给鲍勃留言。爱丽丝的手机建立了与WhatsApp服务器的连接,并确定此连接肯定来自爱丽丝的电话。爱丽丝现在通过TCP发送以下信息:"对于鲍勃:一个巨大的怪物攻击金门大桥"。其中一个WhatsApp前端服务器反序列化此消息并将此消息传递给名为Alice的actor。 演员决定对此进行序列化并将其存储在名为" Alice的已发送消息"的文件中,该文件存储在复制的文件系统上,以防止由于不可预测的怪物横冲直撞而导致数据丢失。然后演员爱丽丝决定将这个消息转发给演员鲍勃,告诉他一个消息"来自爱丽丝的Msg1:一个巨大的怪物攻击金门大桥"。演员可以使用指数后退重试,直到Bob演员确认收到消息。 演员最终收到来自(2)的消息,并决定将此消息存储在名为" Bob的收件箱"的文件中。一旦它已经持久地存储了这个消息,那么演员将通过向演员发送爱丽丝自己的说法来确认收到该消息。我收到了Msg1"。演员爱丽丝现在可以阻止它的重试工作。然后,演员鲍勃检查鲍勃的电话是否与服务器有活动连接。它确实如此Bob扮演者通过TCP将此消息流式传输到设备。 鲍勃看到了这条消息并回复了#34;对于爱丽丝:让我们创造巨型机器人来对抗他们"。现在,这是由演员鲍勃接收到的,如步骤1中所述。演员随后重复步骤2和3,以确保爱丽丝最终收到将拯救人类的想法。

WhatsApp实际上使用的是XMPP协议,而不是我上面概述的极其优越的协议,但你明白了。

对于您自己的应用程序要考虑的事项: 您可能无法控制每10分钟向服务器发送GPS坐标的客户端。如果您的客户端在移动设备上运行,操作系统可能会决定让您从资源中匮乏,或者只是终止您的进程。 您需要为连接到服务器的客户端维护状态,以确保在满足要求时可以向活动客户端发送消息。这是对股票" Comet app"的略微修改。几乎每个框架都有的例子。 建立TCP连接不会浪费资源,无论是来自客户端还是来自服务器端。如果您的服务器软件生态系统支持非阻塞IO,则每个连接所需的状态很小。如果你努力的话,你可以在平庸的盒子上支持超过10万的连接。如果您在JVM上,Netty可能会帮助您。 Python有Twisted和Tornado。如果你在* NIX系统上,C ++ / C可以使用epoll,kqueue或select。 Golang通过它的标准库支持大量连接。我们已经解决了垂直可伸缩性问题,即您可以在一个简单的盒子上支持多少用户。 如果您真的想要扩展并构建一个维护状态的分布式系统,您可能需要考虑使用Erlang(使用OTP)或Actor模型的其他实现,例如也支持远程消息的Akka(JVM)。事件源和消息传递架构的组合可以为您提供所需的所有水平可伸缩性。