http://www.hypothetic.org/docs/msn/index.php
在试着改写 twisted sample 的过程中,基本上是靠这个网站上的内容来学习 MSN 协议的。
在 twisted 里面定义了三类 ClientFactory,分别对应 dispatch server、notification server、switchboard server
客户端启动的时候首先去请求 dispatch server (messenger.msn.com),它会告诉客户端一个可用的 notification server,然后立刻关闭连接。
客户端接下去连接 notification server,其间还会到别的服务器上去认证一下(就是通过 https 把用户名密码送到一台机器上,然后获得一个临时令牌,再告诉 notification 这个令牌信息,认证就通过了)。最终身份确认后,在 MSN 登录其间就不会再断掉这个 TCP 连接了,所有的 presence 信息就是通过这个链接传递的。
可以想象 MSN 有无数台 NS,那么连接在不同 NS 上的用户之间怎么传递消息呢?Jabber/XMPP 的类似机制是 router,用一个专门的服务来帮助寻径。MSN 的解决方案是 switchboard server。
就是说 A 想和 B 说话的时候,就临时请求一个 switchboard server 资源,然后自己连接上去,B 也会接受到一个通知对话发起的 notification,里面包括 sb server 的地址。B 连接上去以后两个人就可以通过这台 sb server 进行通信了。
写到这里突然想到,notification 好像都是明文传输。理论上我们可以监听 MSN 的 notification 拿到 IP/Port/SessionID/Key,然后先 B 一步连接上 sb server,这样就可以冒充 B 的身份和 A 聊天了,想恶作剧的可以尝试一下(黑客可以利用这个来伪造信任身份传恶意 URL,还是挺可怕的)。
除了 dispatch、notification、switchboard 的概念外,我的例子里面还涉及到了联系人的信任状态,即 forward、reverse、allow、block。其实这篇文档里面介绍的很详细了,英文也很容易懂,就不再多说了。
最新评论