首页 文章

whatsapp如何运作?

提问于
浏览
1

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

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

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

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

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

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

提前致谢...

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

1 回答

  • 1

    WhatsApp或大多数其他消息传递应用很少在点对点的基础上工作 . 所以它不会't open a connection (from your device) to each of your friends'设备 . 而是您的设备连接到他们的服务器 . 然后,它可以使用自定义TCP协议或HTTP来将您的消息传达给服务器 . 作为回报,服务器会将它们发送给您的朋友' devices. If your friend had their app open or at least the app process running there might be a live connection to the server. WhatsApp will use that connection to send them your messages. If their app is 1741331 then they might choose to send them a push notification instead. WhatsApp has chosen Erlang a language built for writing scalable applications that are designed to withstand errors. Erlang uses an abstraction called the Actor model for it'并发 - http://en.wikipedia.org/wiki/Act ....而不是更传统的共享内存方法,参与者通过发送彼此的消息进行通信 . 与线程不同的演员设计为轻量级 . Actor可以在同一台机器上,也可以在不同的机器上,并且消息传递抽象适用于两者 . WhatsApp的一个简单实现可能是:每个用户/设备都表示为一个actor . 该actor负责处理用户的收件箱,如何将其序列化到磁盘,用户发送的消息以及用户收到的消息 . 让我们假设Alice和Bob是WhatsApp的朋友 . 所以有一个Alice演员和Bob演员 .

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

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

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

相关问题