今天看了看msn的协议分析,还是挺有意思的,有一点启发。
msn的协议都是基于文本形式的,很像http协议,所以很好理解(当然是指字面上的,机制还是有点复杂)。
第一部分是登陆,登陆首先要与服务器协商协议类型,有点像socks代理的协商,等确定一个双方都可接受的协议后,客户端开始进行认证。当认证成功之后,开始下载各种信息,例如用户资料,好友信息,好友状态等等。
第二部分是用户状态的确定,服务器每隔一段时间发送一个挑战字符串(Challenge), 用户需要正确回答,否则会被认为掉线被踢的。
第三部分是信息的发送,msn协议对于聊天的设计是采用了会话(Session) 的形式,你可以要求很多人加入一个会话。但是很有意思,用户在发送信息的时候,并没有给出需要发送的用户或者会话号,只是简单的给出了信息的格式和内容;而在信息的接收的时候,有发送人的信息。
后来我仔细的想了一想,后者没有矛盾,因为在一个会话中,你接收信息的时候 ,如果数据包中没有发送人,那么你就分不清到底是这个会话中的哪个人发送的。但是至于前者,我怎么都想不明白,因为如果你开了两个会话,那么你到底发给哪个会话呢?
后来,我仔细的看了一看,原来每一个会话都是一个新的连接(这是废话),所以本地端口不同,但是奇怪的是,连接远端的服务器的IP不同,而端口相同。例如,有三个会话,发送三个消息分别到:207.46.26.72:1863 ,207.46.26.144:1863,65.54.228.41:1863。你可以查一下这些IP,发现都是美国微软的,这就是说,那是一个机群,每一个会话对应一个NS服务器。
我看了看捕到的数据报,原来新建一个会话的时候,用户首先要获取一个NS服务器(XFR),一般每次服务器返回不同的NS服务器地址。这样的话,每一个会话都对应一个不同的NS服务器。NS服务器上存储了每次会话中的用户信息,所以每次用户向NS发送消息,NS服务器就能将消息中继到其他的用户那里。
基本上原理搞清楚了,不过有一个事实很明显,用户需要与100个人同时单独对话,那么他同时需要100台NS服务器。我只能说,M$还真TM的有钱!当时我做GoSafe的时候可只有一台localhost作服务器,sigh…
在此,也感谢在测试中被我骚扰的 雪雪、岳峰、海洋和liushi ,还有和我一起被QQ协议郁闷的大为同志 🙂
msn 协议的更多内容参见这里 。
[…] 前几天研究了一下msn的协议,应该说比QQ的那个协议好看得多。现在来看看如何对msn的一个会话进行监控。 […]
MSN的监听软件还是很好做的,但现在MSNP15对应8.1有些改动,做客户端还是有困难存在。