msn的会话监控

前几天研究了一下msn的协议,应该说比QQ的那个协议好看得多。现在来看看如何对msn的一个会话进行监控。

我们假设的场景为用户Bob想建立两个对话,对话Session1中Bob与Dave和George说hello,对话Session2中Bob与Frank说test。OK, here we go。
msn用户在新建一个会话之前,首先需要向服务器连接到一个SB服务器(Switchboard),每一个会话对应一个SB ,SB是用于控制整个会话的服务器端,它会存储一些必要的信息,例如参加会话的人员、地址等,并且转发数据。在这一步,用户向NS服务器(Notification Server)发送一个询问,NS服务器返回一个SB的地址。之后,用户就可以连接SB服务器新建一个会话了。

具体如下所示:
>>> XFR 15 SBrn
<<< XFR 15 SB 207.46.108.37:1863 CKI 17262740.1050826919.32308rn

以上就说明NS服务器返回了SB地址为207.46.108.37:1863。如果我们在监视客户端和NS服务器的时候发现有服务器向客户端发送XFR的信息的时候,我们就能知道SB的信息。

接下来,用户获知SB1服务器地址后,会连结SB1,它会发送cal Dave请求和cal George请求,于是SB1返回两个cal session号,session号就是整个Session1的标记。我们可以通过这个session号来判断是否是同一个会话。最后通过joi邀请Dave和George进入会话。

例如:

>>> CAL 8 dave@passport.comrn
<<< CAL 8 RINGING 17342299rn
<<< JOI dave@passport.com Davern

>>> CAL 10 ed@passport.comrn
<<< CAL 10 RINGING 17342299rn

<<< JOI george@passport.com Georgern

上面说明了我们邀请了Dave和George进入我们的会话1

OK,一个会话已经建立,用户需要再建立一个Session2用于和Frank通信。它需要一个新的SB服务器。于是,它重新向NS服务器发送XFR请求,获得一个新的SB2服务器。当这一步完成后,重复上面的工作,对SB2发送cal Frank请求,获得Session2的session号。

两个会话已经建立,接下来就是发送信息了。发送的时候,由于每一个会话对应一个连接,即对应一个SB服务器,所以只需向相应的SB服务器发送消息即可,而无需指定相应的接收方地址。

>>> MSG 4 N 133rn
MIME-Version: 1.0rn
Content-Type: text/plain; charset=UTF-8rn
X-MMS-IM-Format: FN=Arial; EF=I; CO=0; CS=0; PF=22rn
rn
Hello.

上面的Hello 就是我们发送的内容,这样Dave和George都能接收到如下的消息:

<<< MSG bob@passport.com Bob 133rn
MIME-Version: 1.0rn
Content-Type: text/plain; charset=UTF-8rn

X-MMS-IM-Format: FN=Lucida%20Sans%20Unicode; EF=B; CO=ff0000; CS=0; PF=22rn

rn
Hello.

真正对我们有用的是MSG后面的发送者,以及每一个新行后面的内容就是我们要获取的信息。

最后,当一个Dave想离开会话1,可以发送bye:

<<< BYE dave@passport.comrn

当一个会话超过15分钟没有反应的时候,那就是超时了,监控应该停止,不然资源可能会被消耗光的。
先总结一下 ,监控一个会话,首先要从XFR开始,获得SB服务器地址,然后全程监视用户和SB服务器的通信,获得有用的信息。

Leave a Reply

Your email address will not be published. Required fields are marked *