gpt4 book ai didi

web-applications - WhatsApp如何运作?

转载 作者:行者123 更新时间:2023-12-04 08:29:21 24 4
gpt4 key购买 nike

我目前正在学习有关Web编程的知识。我开始学习有关Internet协议(protocol)和其他Internet应用程序的更多信息。
我只是想了解WhatsApp的工作原理?它使用的是XMPP,而只是用于与服务器通信的代码。但是后台发生了什么?
WhatsApp如何与服务器对话?什么是WhatsApp的XMPP服务器IP?与服务器通信时使用该应用程序使用哪种格式?为什么没有人可以直接在PC上使用它?如果WhatsApp是通信软件,则意味着我可以从任何设备或任何操作系统与服务器通信?但是我找不到关于它的任何例子。
最后,当我第一次使用电话号码在WhatsApp上注册后,它会向我发送短信并进行验证。但是之后,WhatsApp如何识别我?从我的Mac地址?还是通过其他任何特殊键?
如果在具有两个不同IP地址的两个不同设备中识别 key 或mac地址相同,会发生什么情况?服务器可以理解吗?他们中的一个会接受消息还是两者都接收?

最佳答案

WhatsApp或大多数其他消息传递应用程序很少在对等基础上工作。因此,它不会打开(从您的设备)到每个 friend 设备的连接。而是,您的设备连接到他们的服务器。然后,它可以使用自定义的TCP协议(protocol)或HTTP将您的消息传递到服务器。作为返回,服务器会将其分派(dispatch)到您 friend 的设备中。如果您的 friend 打开了他们的应用程序,或者至少正在运行应用程序进程,则可能与服务器存在实时连接。 WhatsApp将使用该连接向他们发送您的消息。如果他们的应用程序处于“离线”状态,则他们可能选择向其发送推送通知。
WhatsApp选择了Erlang语言,该语言是为编写可承受错误的可伸缩应用程序而构建的。 Erlang使用了一种称为Actor model for its concurrency的抽象,而不是更传统的共享内存方法,参与者通过相互发送消息进行通信。与线程不同的Actor被设计为轻量级的。 Actor可以在同一台机器上,也可以在不同的机器上,并且传递消息的抽象对这两者都适用。 WhatsApp的简单实现可以是:
每个用户/设备都代表一个 Actor 。该参与者负责处理用户的收件箱,如何将其序列化到磁盘,用户发送的消息以及用户接收的消息。假设Alice和Bob是WhatsApp的 friend 。因此,有一个爱丽丝 Actor 和一个鲍勃 Actor 。
让我们跟踪一系列来回流动的消息:
爱丽丝决定向鲍勃发送消息。爱丽丝的电话建立了与WhatsApp服务器的连接,并且确定该连接肯定来自爱丽丝的电话。爱丽丝现在通过TCP发送以下消息:“致鲍勃:一个巨大的怪物正在攻击金门大桥”。一台WhatsApp前端服务器反序列化此消息,并将此消息传递给名为Alice的参与者。
Actor Alice决定对此序列化,并将其存储在一个名为“Alice's Sent Messages”的文件中,该文件存储在复制的文件系统上,以防止由于不可预知的怪物横冲直撞而导致数据丢失。然后, Actor 爱丽丝通过向其传递消息“爱丽丝的Msg1:一个巨大的怪物正在攻击金门大桥”,决定将该消息转发给 Actor 鲍勃。 Actor Alice可以按指数退避重试,直到 Actor Bob确认收到消息为止。
Actor 鲍勃最终从(2)收到消息,并决定将此消息存储在一个名为“鲍勃的收件箱”的文件中。一旦持久存储了此消息; Actor Bob会通过向 Actor Alice发送自己的信息“我收到Msg1”来确认收到消息。 Actor 爱丽丝现在可以停止其重试工作。然后, Actor Bob会检查Bob的电话是否与服务器建立了事件连接。确实如此,因此 Actor Actor Bob通过TCP将此消息流传输到设备。
鲍勃(Bob)看到了此消息,并回复“致爱丽丝:让我们创造一个与之战斗的巨型机器人”。 Actor 鲍勃现在已按照步骤1中的步骤对此进行了接收。 Actor 鲍勃然后重复步骤2和3,以确保爱丽丝最终接受了拯救人类的想法。
WhatsApp实际上使用XMPP协议(protocol),而不是我上面概述的极为优越的协议(protocol),但是您明白了。
对于您自己的应用程序,需要考虑以下事项:
您可能无法控制每10分钟发送一次GPS坐标到服务器的客户端。如果您的客户端在移动设备上运行,则操作系统可能会决定使您从资源中饿死,或者只是扼杀您的进程。
您需要维护连接到服务器的客户端的状态,以确保在满足要求时可以将消息发送到事件客户端。这是几乎每个框架都具有的“Comet应用程序”示例的略微修改。
无论是从客户端还是从服务器端,建立TCP连接都不会对资源造成很大的浪费。如果您的服务器软件生态系统支持无阻塞IO,则每个连接所需的状态很小。如果您努力尝试,则可以在一个普通的盒子上支持多达10万个连接。如果您使用的是JVM,Netty可能会在这里为您提供帮助。 Python有Twisted和Tornado。 C++/C可以使用epoll,kqueue或选择您是否在* NIX系统上。 Golang通过其标准库支持大量连接。我们在这里解决了垂直可扩展性,即您可以在一个简单的盒子上支持多少个用户。
如果您真的想扩展并构建一个维护状态的分布式系统,则可能要考虑使用Erlang(使用OTP)或Actor模型的其他实现,例如Akka(JVM),它也支持远程消息。事件源和消息传递体系结构的结合可以为您提供所需的所有横向可伸缩性。

关于web-applications - WhatsApp如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34983909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com