Fym*_*Fym 2 web-applications whatsapp
我目前正在学习有关Web编程的知识。我开始学习有关Internet协议和其他Internet应用程序的更多信息。
所以我只想了解whatsapp的运作方式?它使用xmpp和仅与服务器通信的代码。但是在后台发生了什么?
whatsapp如何与服务器对话?什么是whatsapp的xmpp服务器IP?与服务器通讯时使用该应用程序使用哪种格式?为什么没有人可以直接在PC上使用?如果whatsapp是通讯软件,则意味着我可以从任何设备或任何操作系统与服务器通讯?但是我找不到任何例子。
最后,当我第一次使用电话号码在whatsapp中注册后,它会向我发送短信并进行验证。但是之后,WhatsApp如何认识我?从我的mac地址?还是其他任何特殊键?
如果在具有两个不同IP地址的两个不同设备中识别密钥或MAC地址相同,会发生什么情况?服务器可以理解吗?他们中的一个会接受消息还是两者都接收?
所以我只想了解whatsapp背景下发生了什么?
提前致谢...
保持冷静,我不是想破解whatsapp服务器;):p
WhatsApp或大多数其他消息传递应用程序很少在对等基础上工作。因此,它不会打开(从您的设备)到每个朋友设备的连接。而是您的设备连接到他们的服务器。然后,它可以使用自定义TCP协议或HTTP将您的消息传递到服务器。作为回报,服务器会将其分派到您朋友的设备中。如果您的朋友打开了他们的应用程序或至少正在运行应用程序进程,则可能与服务器存在实时连接。WhatsApp将使用该连接向他们发送您的消息。如果他们的应用程序处于“离线”状态,则他们可能选择向他们发送推送通知。WhatsApp选择了Erlang语言,该语言是为编写可承受错误的可伸缩应用程序而构建的。Erlang为此使用了一个称为Actor模型的抽象。http://en.wikipedia.org/wiki/Act...。Actor通过发送彼此的消息进行通信,而不是使用更传统的共享内存方法。不同于线程的Actor被设计为轻量级的。参与者可以在同一台机器上,也可以在不同的机器上,并且传递消息的抽象对这两种都起作用。WhatsApp的简单实现可以是:每个用户/设备代表一个参与者。该参与者负责处理用户的收件箱,如何将其序列化到磁盘,用户发送的消息以及用户接收的消息。假设Alice和Bob是WhatsApp的朋友。因此,有一个爱丽丝演员和一个鲍勃演员。
让我们跟踪一系列来回的消息:爱丽丝决定向鲍勃发送消息。爱丽丝的电话建立了与WhatsApp服务器的连接,并且确定该连接肯定来自爱丽丝的电话。爱丽丝现在通过TCP发送以下消息:“致鲍勃:一个巨大的怪物正在攻击金门大桥”。WhatsApp前端服务器之一反序列化此消息,并将此消息传递给称为Alice的参与者。演员Alice决定对此序列化并将其存储在一个名为“ Alice's Sent Messages”的文件中,该文件存储在复制的文件系统上,以防止由于不可预知的怪物横冲直撞而导致数据丢失。然后,演员爱丽丝通过向其传递消息“爱丽丝的Msg1:一个巨大的怪物正在攻击金门大桥”,决定将该消息转发给演员鲍勃。演员Alice可以按指数退避重试,直到演员Bob确认收到消息为止。演员鲍勃最终从(2)收到消息,并决定将此消息存储在一个名为“鲍勃的收件箱”的文件中。一旦持久存储了此消息,Bob演员就会通过向演员Alice发送一个自己的消息“我收到Msg1”来确认收到消息。演员爱丽丝现在可以停止重试。然后,演员Bob会检查Bob的电话是否与服务器建立了活动连接。它会这样做,因此演员Bob会通过TCP将此消息流传输到设备。鲍勃(Bob)看到了此消息,并回复“致爱丽丝:让我们创造一个与之作战的巨型机器人”。现在,演员鲍勃(步骤1)概述了此信息。
WhatsApp实际上使用XMPP协议,而不是我上面概述的极为优越的协议,但是您明白了。
对于您自己的应用程序,需要考虑以下事项:您可能无法控制每隔10分钟发送一次GPS坐标到服务器的客户端。如果您的客户端在移动设备上运行,则操作系统可能会决定使您从资源中饿死,或者只是扼杀您的进程。您需要维护连接到服务器的客户端的状态,以确保在满足要求时可以将消息发送到活动客户端。这是对几乎每个框架都具有的“ Comet应用程序”示例的略微修改。无论是从客户端还是从服务器端,建立TCP连接都不会浪费太多资源。如果您的服务器软件生态系统支持无阻塞IO,则每个连接所需的状态很小。如果您努力尝试,则可以在一个普通的盒子上支持多达10万个连接。如果您使用的是JVM,Netty可能会在这里为您提供帮助。Python有Twisted和Tornado。如果您在* NIX系统上,C ++ / C可以使用epoll,kqueue或选择。Golang通过其标准库支持大量连接。我们在这里解决了垂直可伸缩性,即您可以在一个简单的盒子上支持多少个用户。如果您真的想扩展并构建一个维护状态的分布式系统,则可能要考虑使用Erlang(使用OTP)或Actor模型的其他实现,例如Akka(JVM),它也支持远程消息。事件源和消息传递体系结构的结合可以为您提供所需的所有横向可伸缩性。Golang通过其标准库支持大量连接。我们在这里解决了垂直可伸缩性,即您可以在一个简单的盒子上支持多少个用户。如果您真的想扩展并构建一个维护状态的分布式系统,则可能要考虑使用Erlang(使用OTP)或Actor模型的其他实现,例如Akka(JVM),它也支持远程消息。事件源和消息传递体系结构的结合可以为您提供所需的所有横向可伸缩性。Golang通过其标准库支持大量连接。我们在这里解决了垂直可伸缩性,即您可以在一个简单的盒子上支持多少个用户。如果您真的想扩展并构建一个维护状态的分布式系统,则可能要考虑使用Erlang(使用OTP)或Actor模型的其他实现,例如Akka(JVM),它也支持远程消息。事件源和消息传递体系结构的结合可以为您提供所需的所有横向可伸缩性。例如Akka(JVM),它也支持远程消息。事件源和消息传递体系结构的结合可以为您提供所需的所有横向可伸缩性。例如Akka(JVM),它也支持远程消息。事件源和消息传递体系结构的结合可以为您提供所需的所有横向可伸缩性。
| 归档时间: |
|
| 查看次数: |
4539 次 |
| 最近记录: |