msn的协议

今天看了看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 协议的更多内容参见这里

2 thoughts on “msn的协议”

Leave a Reply to Mvision » Blog Archive » msn的会话监控(draft) Cancel reply

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


Fatal error: Uncaught Error: Call to undefined function imagecreate() in /backups/wordpress/wordpress/wp-content/plugins/captcha-code-authentication/wpCaptcha.php:506 Stack trace: #0 /backups/wordpress/wordpress/wp-content/plugins/captcha-code-authentication/wpCaptcha.php(330): WP_Captcha_Code::generate_captcha_image() #1 /backups/wordpress/wordpress/wp-includes/class-wp-hook.php(324): WP_Captcha_Code::captcha_comment_form() #2 /backups/wordpress/wordpress/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters() #3 /backups/wordpress/wordpress/wp-includes/plugin.php(517): WP_Hook->do_action() #4 /backups/wordpress/wordpress/wp-includes/comment-template.php(2847): do_action() #5 /backups/wordpress/wordpress/wp-content/themes/twentysixteen/comments.php(77): comment_form() #6 /backups/wordpress/wordpress/wp-includes/comment-template.php(1629): require('...') #7 /backups/wordpress/wordpress/wp-content/themes/twentysixteen/single.php(24): comments_template() #8 /backups/wordpress/wordpress/wp-includes/template-loader.php(106): include('...') #9 /backups/wordpress/wordpress/wp-blog-header.php(19): require_once('...') #10 /backups/wordpress/wordpress/index.php(17): require('...') #11 {main} thrown in /backups/wordpress/wordpress/wp-content/plugins/captcha-code-authentication/wpCaptcha.php on line 506