MSN 通信协议学习笔记(转)

参考资料来自这个网站:http://www.hypothetic.org/docs/msn/index.php

  1. 两种服务器,一种 Notification Server (NS),一种 Switchboard (SB)。默认从 1863 端口建立 TCP 连接。连接总是客户端发起。
  2. 通讯都是文本,服务器和客户端之间互发命令。命令的格式:3 个字母(常规命令)或 3 个数字(错误代码)开头,space,事务 ID(有时没有),space,空格分隔的参数列表,/r/n。看起来文本命令比 QQ 那种二进制通信容易处理多了。
  3. 事务 ID 是客户端用来知道服务器是在回复哪条命令,取值范围是 UINT32,但 0 有固定的用途。一条命令可能 N 条回复,一般来说客户端发送命令的时候只要依次累加事务 ID 就行了。
  4. 客户不会向服务器发送错误消息,服务器返回的错误消息一定是某条客户命令的回复。
  5. 有一种命令叫做 payload 命令(这个怎么翻译)?它的最后一个参数是一个 content-length,处理完这条命令(including trailing newline)之后,还要再读指定字节数的数据(no trailing newline),然后再处理下一条命令。
  6. 服务器会主动向客户端发送一种消息,就是同步消息。它不是对客户命令的回复,因此有些同步消息没有事务 ID,另外的同步消息的事务 ID 为 0。
  7. 服务器回复命令不一定按什么顺序,所以要使用事务 ID 来跟踪回复。当然如果你的客户端 NB 到不用事务 ID 也能跟踪的话……

 

Messages

由 MSG 命令及其 payload 组成。来自服务器的 messages 格式为:

MSG <发送者帐号> <发送者显示名称> <payload 长度>

然后是 payload,它包括 MIME Header 和 body 两部分。Header 区分大小写,严格由 /r/n 分隔,必须包括 Content-Type 和 MIME-Version 两个值;body 就是消息正文了,也由 /r/n 分行但是 /n 不是必须的。

发送 messages 更复杂,一会再说。

Names

用户名(Account Name)可以是最长 129 个字节的合法 Email 地址,只有登陆的时候才需要提供你自己的用户名,其他时候都是要处理别人的用户名。

显示名称(Display Name)理论上最长 387 字节,但是官方客户端只支持 129 字节;一般显示名称都是放在命令的参数里面的,所以要先 URL-Encode 再发送。用 REA 命令修改自己的显示名称。

昵称(Nickname)跟显示名称差不多,这个是自己给好友起的名字,只显示在自己的联系人列表里面。

登陆过程

  1. 连接到 messenger.hotmail.com:1863 或者本地知道的服务器地址
  2. 报告自己支持的通信协议版本(必须有 CVR0)
    >>> VER 0 MSNP8 CVR0/r/n
  3. 服务器返回它支持的通信协议版本,你应该使用它返回的第一个协议版本(CVR0 不算)
    <<< VER 0 MSNP8 CVR0/r/n
  4. 报告自己的客户端名称、版本、运行平台、用户名等信息
    >>> CVR 2 0×0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS example@passport.com/r/n
  5. 服务器返回最低版本要求和推荐下载链接
    <<< CVR 2 6.0.0602 6.0.0602 1.0.0000 http://download.microsoft.com/download/8/a/4/8a42bcae-f533-4468-b871-d2bc8dd32e9e/SETUP9x.EXE http://messenger.msn.com/r/n
  6. 初始登陆命令
    >>> USR 3 TWN I example@passport.com/r/n
  7. 有的服务器会给你丢到另一台服务器去,这种情况下应该回到第1步,在给你的服务器上再做一遍登陆过程:
    <<< XFR 3 NS 207.46.106.145:1863 0 207.46.104.20:1863/r/n
    而有的服务器则会接受登陆请求:
    <<< USR 3 TWN S <a_very_long_string>
  8. 那个 a_very_long_string 是给你的登陆令牌,你应该拿着这个令牌去 MS Passport 登陆。GET 一下 https://nexus.passport.com/rdr/pprdr.asp,它会返回一堆 Passport 服务器,然后你再向其中的一个服务器建立 https 连接,然后发送登陆请求。如果成功,它会返回给你一个许可证。
  9. 拿着这个许可证回到 NS,再发送一次 USR 命令:
    >>> USR 4 TWN S <login_ticket>
  10. 一切顺利的话,服务器接受你的登陆请求:
    <<< USR 4 OK example@passport.com example%20display%20name 1 0/r/n
  11. 然后你就可以去抓联系人列表,设置初始状态,聊天……

邀请别人建立会话的过程:

  1. 在 NS 上请求 SB 服务器地址:
    >>> XFR 9 SB/r/n
  2. 如果你在线的话,NS 会丢给你一个 SB 服务器地址:
    <<< XFR 9 SB 207.46.108.46:1863 CKI 189597.1056411784.29994/r/n
  3. 最后一个参数是登陆令牌。连接指定服务器,用这个令牌登陆:
    >>> USR 7 alice@passport.com 189597.1056411784.29994/r/n
  4. 一切顺利的话,服务器返回登陆成功:
    <<< USR 7 OK alice@passport.com Alice/r/n
  5. 邀请其他人加入会话:
    >>> CAL 8 bob@passport.com/r/n
  6. 服务器会立即告诉你正在邀请 bob 的 session id:
    <<< CAL 8 RINGING 189597/r/n
    然后当 bob 接受邀请的时候,通知你(注意没有事务 ID,说明这条命令不是对上面 CALL 的回复):
    <<< JOI bob@passport.com Bob/r/n
  7. 然后就可以发送各种消息了。

被别人邀请建立会话的过程:

  1. NS 服务器 ring 你,告诉你 SB 服务器的地址、登陆令牌、被谁邀请、会话 ID 等一切你需要的信息。
    <<< RNG 17342299 207.46.108.78:1863 CKI 1056411141.26158 bob@passport.com Bob/r/n
  2. 连接指定的 SB 服务器,用给你的令牌登陆:
    >>> ANS 1 alice@passport.com 1056411141.26158 17342299/r/n
    注意这里是 ANS,而不是前边的 USR。
  3. 一切顺利的话,SB 服务器会告诉你当前会话中都有谁。
    <<< IRO 1 1 2 bob@passport.com Bob/r/n
    <<< IRO 1 2 2 carol@passport.com Carol/r/n
    <<< ANS 1 OK/r/n
  4. 然后就可以发送各种消息了。

关于“正在输入消息”的提示:

这个是 MSN 比较有特色的一个功能。MSN 的官方客户端是这么搞的:

  • 如果你在输入消息,那么它会每 5 秒钟向 SB 服务器通知一下你在输入消息。
    >>> MSG 4 U 91/r/n
        MIME-Version: 1.0/r/n
        Content-Type: text/x-msmsgscontrol/r/n
        TypingUser: alice@passport.com/r/n
  • 当官方客户端收到了一个 TypingUser 信息的时候,它会提示你那个用户正在输入;然后你接收到他的一条即时消息之后,或者 10s 之内没有再收到他的 TypingUser 消息的话,那么就把这条提示去掉。
    <<< MSG bob@passport.com Bob 89/r/n
        MIME-Version: 1.0/r/n
        Content-Type: text/x-msmsgscontrol/r/n
        TypingUser: bob@passport.com/r/n
        /r/n
        /r/n
  • 注意上面 bob@passport.com 出现了两次,但是只有在参数里面那个是有效的,后面那个最好忽略之;虽然官方客户端不是这么干的……
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值