[微信协议分析] 多点登陆

  IM产品的多点登陆逻辑特别复杂,很难做到很好的用户体验,就像新版mac handoff 功能也不少人在喷。

  微信最开始并不支持多点登陆,后来陆续增加的Web版、Mac版,但并不是完整意义的客户端,要说只是辅助工具。

  微信允许: 一个移动端(下面称之为主客户端) + 一个web/mac 同时在线(下面称之为从客户端),web/mac 只能接收在线消息、发消息,不记录消息历史。这样多点逻辑就变得相对简单很多了。

  存储

  服务器不用保存完整消息历史,通过客户端对push消息的ack保证消息送达,协议保证消息至少一次推送到主客户端,然后消息即可删除;服务器只存储未下发到主客户端的消息。

  多点时:主客户端依然采用Push推送消息(只是应该会保留一小段时间消息记录等待从Sync),从客户端Sync消息;如果主不在线,消息记录不会删除,等主重新连上下载离线消息。

  服务器不存储消息历史,一个是安全,再者节省硬件成本,大量短消息的存储和读取成本是非常高的,因为基本都是随机IO。whatapp 用500台机器,支撑1亿在线,100w/s 消息,只离线消息存储量是很少的。

 未读数同步

   这个很好解决,如果客户端知道自己处于多端在线情况下时,进入会话时,需要告诉服务器消息已读。消息已读也保存为一条消息,再通过Sync协议,同步到另外的客户端。web 微信会调用webwxstatusnotify 同步未读。

  未读变化也当成一条消息存储,且只在多端情况下存在,单点在线时未读数由客户端维护。

 自己同步自己

   每个操作(发消息、清未读等),应答后,因为SyncKey 变化了,Sync协议上会产生一个空的Sync操作用于更新SyncKey。

   为啥不通过应答更新SyncKey?  并发情况直接更新会造成丢消息问题

  对于主客户端:

  - 单点在线时,SyncKey通过应答,节省同步流量。怎么防止丢消息呢?

   猜想是判断 请求时带上SyncKey(local), 服务器在inc SyncKey得到SyncKey(current) == SyncKey(local) 时,直接返回SyncKey(current),否则返回Sync(local) 并推送New SyncKey Notify。因为此时确保客户端没有未收消息,坏情况应答比新消息慢,也不会有啥问题。

    - 多点在线时,发消息和从客户端一样,也会自己同步自己

   为何不保持和单点时一样呢,暂时还没想明白

时间: 2024-12-17 01:13:31

[微信协议分析] 多点登陆的相关文章

[微信协议分析] 文本消息

参考: 微信协议简单调研笔记 微信破解研究总结 Sync协议 道听途说,加上上面参考中都是提到微信使用Sync协议.去年项目中做过参考Microsoft Exchange ActiveSync 协议来优化消息协议的方案,虽经过长时间讨论定稿,但由于一些原因最终没有实现:也从中深知Sync并不是表面上那么简单.那么好用. Sync 有啥问题呢? 1. SyncKey 生成维护成本 SyncKey 在ActiveSync中为字符串,客户端不需要解析,但服务端实现要用数字自增,需要强一致性,且不能回退

webqq协议分析之~~~~登陆

最近好几个新项目积一起了,比较忙,所以博客迟迟未更新,还请各位见谅!下面来继续分析webqq协议,本章将说明如何实现登陆 1:输入QQ号和密码登陆,检测HTTP请求url如下,这是第一次登陆 https://ssl.ptlogin2.qq.com/login?u={0}&p={1}&verifycode={2}&webqq_type=10&remember_uin=1&login2qq=1&aid=501004106&u1=http%3A%2F%2F

[微信协议分析] 多媒体

语音片断 语音片断的发送.接收都是通过长连接分包进行. 发送:语音录制过程中,客户端每2秒发一次,每次2.5K左右 接收:服务器将语音分片文件整体当成一条消息,和文本消息一样的方式推送 总结,语音分片发送和文本相差不大,只是语音因为体积较大,录制过程中会同时上传操作,加快发送速度,取消时,删除已上传部分即可. 图片.视频片断.小视频 都类似,只是文件类型,大小不一样,客户端处理方式不同,对于服务器差别不大. 发送:https短连接,不走长连接,所有发送完后SyncKey 会通过长连接回推 接收:

协议分析TMP

最近闲来有事, 分析了一个非常低端(非常低端的意思是说你不应该对她是否能取代你现有的QQ客户端作任何可能的奢望,她只是一个实验性的东西)的手机QQ的协议, 是手机QQ3.0,      所用到的TCP/HTTP通信协议版本是1.4, 也不知道是哪一年release的了, 至少有七八年的历久了吧, 反正就是: 功能非常弱! 主要的分析原因是想学学网络方面的编程经验(这是我第2次弄socket编程 :-) ), 以及学学怎么抓包分析. 主要用到的工具软件 手机QQ3.0: http://www.ru

集成基于OAuth协议的单点登陆

在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例如Google就使用OAuth协议来管理它的帐户. 相较于CAS协议,OAuth协议不仅仅可以完成对用户凭证的验证,更可以提供权限管理的功能.在这些权限管理功能的支持下,一个应用甚至可以访问其它使用相同OAuth服务的应用的数据,从而完成应用间的交互. OAuth集成示例 现在我们就来看一个通过OA

客户端协议思考,对比微信协议

做了长时间的后台,越来越感觉到客户端和服务器之间的协议,是个很值得思考的东西. 一是消息的序列化,二是消息的推送,三是要不要支持多点登陆,就是一个账号同时使用多个客户端. 这三个问题,影响到流量大小和客户端.服务器的逻辑.如果能搞好,我认为能减少服务器极多流量和压力. 序列化 首先是序列化.这里只讨论msgpack和protobuffer.在app上,我认为msgpack比protobuff好,流量少,随便定义,可扩展性和性能都特别好.不知道为什么这么多人用protobuffer,个人感觉每次都

POP3协议分析邮箱自动激活用户

使用POP3协议分析邮箱自动激活用户 2015-03-28 Lover雪儿 前几天,我们实现了,用户PHP模拟邮件激活注册用户, 地址:http://www.cnblogs.com/lihaiyan/p/4359927.html ,但是有的时候,往往是需要注册用户自己手动的向服务器的邮箱进行发送一封邮件,然后服务器通过分析邮箱的发件人,从而匹配自动的激活用户账号. 上class.pop3.php 邮件发送人分析php源代码: 1 <?php 2 3 //用户往[email protected]邮

SMTP协议分析

SMTP协议分析 第1章.     SMTP概述 1.1.  SMTP在邮件通信中的位置 SMTP,即简单邮件传送协议,所相应RFC文档为RFC821.同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的邮件传送.SMTP在整个电子邮件通信中所处的位置如图 1所看到的. 图 1电子邮件的通信过程 能够看出,SMTP是用来将客户机上的邮件传送到server上.这里的客户机是指某次连接中的发送方,server是指对应的接收方.在解说发送邮件的整个通信过程前,先解释一以下几个术语.

编译2.6.35内核安装L7-filter2.23实现七层过滤及QQ协议分析

一.前言 本文,接着上篇<Linux下Netfilter/IPTables防火墙案例分析>来说说七层过滤. iptables等防火墙工作在四层及四层以下,都是通过数据包过滤或能够基于传输层状态检测的. 但是一般企业应用的时候,很多场景下,需要提供屏蔽不良内容.封堵某些应用层软件的功能. QQ是一款最常用的即时通讯软件,但是很多情况下,它的使用会影响工作效率,所以有需求要把QQ屏蔽掉. 如果识别QQ的特征? IP检查,不行.因为它的服务器IP地址段有可能变化. 端口检查,不行.局域网必须放行向外