Web applications WhatsApp是如何工作的?

Web applications WhatsApp是如何工作的?,web-applications,whatsapp,Web Applications,Whatsapp,我目前正在学习网络编程。我开始学习更多关于互联网协议和其他互联网应用的知识 我只是想了解WhatsApp是如何工作的?它使用XMPP,只是一个与服务器通信的代码。但是背景中发生了什么 WhatsApp如何与服务器对话?WhatsApp的XMPP服务器IP是什么?与服务器通信时使用该应用程序的格式是什么?为什么没有人可以直接在pc上使用它?如果WhatsApp是一个通信软件,那就意味着我可以从任何设备或任何操作系统与服务器通信,对吗?但是我找不到任何关于它的例子 最后,在我第一次用我的电话号码注册

我目前正在学习网络编程。我开始学习更多关于互联网协议和其他互联网应用的知识

我只是想了解WhatsApp是如何工作的?它使用XMPP,只是一个与服务器通信的代码。但是背景中发生了什么

WhatsApp如何与服务器对话?WhatsApp的XMPP服务器IP是什么?与服务器通信时使用该应用程序的格式是什么?为什么没有人可以直接在pc上使用它?如果WhatsApp是一个通信软件,那就意味着我可以从任何设备或任何操作系统与服务器通信,对吗?但是我找不到任何关于它的例子

最后,在我第一次用我的电话号码注册WhatsApp后,它会向我发送短信并进行验证。但在这之后WhatsApp如何认出我?从我的mac地址?或者其他特殊的钥匙


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

WhatsApp或大多数其他消息传递应用很少在对等基础上工作。因此,它不会打开(从您的设备)到每个朋友设备的连接。相反,您的设备连接到他们的服务器。然后,它可以使用自定义TCP协议或HTTP将您的消息传递给服务器。作为回报,服务器会将它们发送到您朋友的设备。如果您的朋友打开了他们的应用程序或至少运行了应用程序进程,则可能存在到服务器的实时连接。WhatsApp将使用该连接向他们发送您的消息。如果他们的应用程序处于“脱机”状态,那么他们可能会选择向他们发送推送通知

WhatsApp选择了Erlang,这是一种专为编写可伸缩应用程序而构建的语言,其设计目的是抵御错误。Erlang使用了一种称为的抽象,而不是更传统的共享内存方法,参与者通过相互发送消息进行通信。与线程不同的参与者被设计为轻量级的。参与者可以在同一台机器上,也可以在不同的机器上,消息传递抽象对这两种机器都有效。WhatsApp的一个简单实现可以是: 每个用户/设备都表示为一个参与者。该参与者负责处理用户的收件箱、如何将其序列化到磁盘、用户发送的消息以及用户接收的消息。让我们假设Alice和Bob是WhatsApp上的朋友。所以有一个爱丽丝演员和一个鲍勃演员

让我们追踪一系列来回流动的消息: 爱丽丝决定给鲍勃捎个口信。Alice的手机建立了与WhatsApp服务器的连接,并确定此连接肯定来自Alice的手机。Alice现在通过TCP发送以下消息:“给Bob:一个巨大的怪物正在攻击金门大桥”。WhatsApp前端服务器之一反序列化此消息,并将此消息传递给名为Alice的参与者

Alice演员决定将其序列化,并将其存储在一个名为“Alice's Sent Messages”的文件中,该文件存储在一个复制的文件系统中,以防止由于不可预知的怪物暴乱而导致数据丢失。然后,演员爱丽丝决定将此消息转发给演员鲍勃,并向其传递一条消息“爱丽丝传来的Msg1:一个巨大的怪物正在攻击金门大桥”。Alice参与者可以重试,并退出,直到Bob参与者确认收到消息为止

演员Bob最终收到来自(2)的消息,并决定将此消息存储在名为“Bob的收件箱”的文件中。一旦它持久地存储了此消息;演员Bob将通过向演员Alice发送自己的消息“我收到了Msg1”来确认收到该消息。演员Alice现在可以停止重试。演员Bob然后检查Bob的手机是否与服务器有活动连接。确实如此,因此Bob参与者通过TCP将此消息流式传输到设备。 Bob看到这条消息,回答说:“为了Alice,让我们创造巨型机器人来与他们战斗。”。如步骤1所述,演员Bob现在会收到此消息。然后,演员鲍勃重复第2步和第3步,以确保爱丽丝最终接受拯救人类的想法

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

对于您自己的应用程序,需要考虑以下事项: 您可能无法控制客户端每10分钟向服务器发送GPS坐标。如果您的客户端运行在移动设备上,操作系统可能会决定让您缺乏资源,或者干脆终止您的进程。 您需要维护连接到服务器的客户端的状态,以确保在满足要求时可以向活动客户端发送消息。这是对几乎每个框架都有的股票“Comet应用程序”示例的一个轻微修改。 建立TCP连接并不是对客户端或服务器端资源的极大浪费。如果服务器软件生态系统支持非阻塞IO,则每个连接所需的状态很小。如果你努力的话,你可以在一个普通的盒子上支持超过100k的连接。如果您在JVM上,Netty可能会在这里帮助您。巨蟒已经扭曲和龙卷风。如果您在*NIX系统上,C++/C可以使用epoll、kqueue或select。Golang通过其标准库支持大量连接。我们在这里讨论了垂直可伸缩性,即在一个简单的盒子上可以支持多少用户。
如果您真的想扩展并构建一个维护状态的分布式系统,那么您可能需要考虑Erlang(OTP)或Actudio模型的其他实现,比如支持远程消息的Akka(JVM)。事件源和消息传递体系结构的组合可以让您获得所需的所有水平可伸缩性。

您是否要求WhatsApp的内部工作?只有在那里工作的人才可以