第1章. 文档说明 本文档建立在另一篇文章——《MSNP15(MSN8.1)协议分析》的基础上。因此MSNP的一些基础知识请参考该文,而本文的重心是进一步分析MSN Media所用的协议。 第2章. 通信过程 2.1. 概述 MSN Media的通信过程将分音频通信过程和视频通信过程两部分来讲解。音频和视频的通信过程同即时消息的通信过程(《MSNP15(MSN8.1)协议分析》中已讲述)很类似。只是音频通信和视频通信不经服务器中转,一般是点对点的UDP通信,而且为了保证实时性和服务质量,UDP之上还使用了RTP/RTCP协议(请参看《RTP协议分析》)。 2.2. 音频通信过程 msn单纯语音聊天时,建立连接用的是STUN协议,数据传输使用RTP协议。示意性的过程如下。 1) 本机客户端向NS服务器(Notification Server,假设其IP:端口为64.4.13.195:1863)请求两个新SB 服务器地址(Switchboard Server),其中一个用于发送请求,另一个用于接受回复。如下面表格所示: secondary connection port range protocol type direction info 6891-6900 tcp inbound sending 6891-6900 tcp outbound receiving 客户端通过tcp向服务器发送xfr命令,参数为sb。NS服务器收到请求后,同样以xfr命令返回,参数中包含SB服务器的ip地址和端口号,以及SB服务器的cki安全序号。如下例所示: >>> xfr 10 sb <<< xfr 10 sb 64.4.12.193:1863 cki 16925950.1016955577.17693 2) 客户端根据返回的ip地址和端口好,通过tcp协议连接两SB服务器。 3) 连接成功后,客户端分别向两SB服务器发送usr命令,第一个参数为实际连接的电子邮件地址,第二个参数为第二步骤返回SB服务器cki安全序号。如果发送成功,SB服务器返回usr命令,第一个参数为ok。如下例所示: >>> usr 1 example@passport.com 16925950.1016955577.17693 <<< usr 1 ok example@passport.com mike 4) 当邀请对方对话时,把对方的注册的电子邮件地址作为参数传递到cal命令中,然后发送SB服务器,收到该请求后,服务器返回一个id号。同时服务器又向客户端发送joi命令,把被请求方的电子邮件地址作为第一个参数。如下例所示: >>> cal 2 name_123@hotmail.com <<< cal 2 ringing 11752099 <<< joi name_123@hotmail.com name_123 以上步骤都是本机客户端与两SB服务器之间同时进行,都执行了以上所有的步骤。 5) 当客户要进行语音对话时,本机客户端向发送请求SB服务器发送一个请求(假设SB服务器的ip地址:64.4.12.192,端口:1863)。该请求的格式如下例所示: msg 4 n 277 mime-version: 1.0 content-type: text/x-msmsgsinvite; charset=utf-8 application-name: 请求服务类型 application-guid: {5d3e02ab-6190-11d3-bbbb-00c04f795683} session-protocol:sm1 context-data: requested:sip_a; capabilities: sip_a,sip_v invitation-command: invite ………… 6) 服务器64.4.12.192收到该请求后,回复ack,表示确定已收到该请求。 7) 当被请求方接受你的语音对话邀请后,回复SB服务器(假设为ip地址:64.4.12.159,端口:1863)向本机客户端发送回复,其回复格式如下: msg name_123@hotmail.com name_123 mime-version: 1.0 content-type: text/x-msmsgsinvite; charset=utf-8 invitation-command: accept ………… ip-address:返回被请求方的ip地址。 8) 当本机收到该回复后,向服务器64.4.12.159发送一个消息,其格式如下: msg 4 a 237 mime-version: 1.0 content-type: text/x-msmsgsinvite; charset=utf-8 invitation-command: accept ………… ip-address:本机的ip地址和端口。 9) 服务器64.4.12.159收到该消息后,返回一个ack命令,表示确认已收到。 10) 然后由被请求方根据本机客户端的ip地址和端口进行udp连接,进行数据传递。 2.3. 视频通信过程 视频通信过程与语音通信相同,同样申请两个SB服务器,最后通过udp进行连接,进行数据传送。当然视频通信也可以使用TCP通信,这种情况下MSN视频聊天时,先用TCP建立连接,然后用HTTP传输数据。 第3章. RTP封装 关于RTP的详细介绍,请参考《RTP协议分析》。在这里我们主要关注RTP头部的3个字段:Payload Type、Sequence Number和Time Stamp。 Payload Type:长度为7比特,该区域的数值标识了载荷所承载的内容的数据类型。如果此RTP流是用来传输语音或者视频数据的,此区域的数值是具体的载荷数据的编码类型。这些具体的数值所对应的编码由IETF的其他RFC规定,但是现存的大量的应用程序使用的是自己定义的标识符,MSN同样是这样的。例如对于音频通信,MSN的音频通信一般使用自定义类型114(对应的十六进制为0x72)。 Sequence Number和Time Stamp则用来实现RTP信息的排序和同步。 第4章. 实现方案
表 1协议分析要求 表 1给出了协议分析要求。音视频连接开始建立时,客户端和服务器的交互信息中有双方的信息(账号、IP地址和端口等),我们提取这些信息就能获得Local account和Opponents account。 至于Audio和Video信息的还原可这样来做。 1) 首先客户端会向服务器发送一个操作请求数据包,包中存在一项数据指明了请求的操作类型,其关键字以application-name开头,随后为相关数据以ascii 码表示。语音对话和视频对话ascii 码相同,都为3a 20 e8 af ad e9 9f b3 e5 af b9 e8 af 9d 0d 0a。我们可以提取此关键字段来判断当前是否出现了Audio和Video,当然我们也可以根据客户端与服务器端的交互过程来判断。 2) 然后,我们可以根据RTP包中Payload Type中来判断当前的包是音频包还是数据包,并且得到这个包的相应解码方式。我们可以根据RTP包中的Sequence Number和Time Stamp对RTP包排序和同步,并利用相应的解码方法对其解码,从而还原出音频和视频。解码方法的设计可以在参考现有的解码器的实现。 第5章. 参考资料 [1] 《MSNP15(MSN8.1)协议分析》。 [2] 《RTP协议分析》。 [3] http://bbs.intercn.net/viewthread.php?tid=34,该文较好地讲述MSN的各中通信过程。 [4] http://www.cncert.net/tec/ours/2007-7-18/114.html, 该文以实例的形式较好地分析了MSNP15的通信过程。 [5] bingwen0210/archive/2007/03/30/1546475.aspx,该文较好地讲述了MSNP9/MSNP10。 [6] http://msnpiki.msnfanatic.com/index.php/MSN_Protocol_Version_15,该英文网站有很多MSNP8-MSNP15的资料。 [7] http://www.hypothetic.org/docs/msn/index.php,该英文网站算得上MSNP的官方网站了,但是目前提供的资料还只到MSNP10。 (彭令鹏) |