查看: 7656|回复: 17

连载:MSN通讯过程详解!(更新中-2007.5.24更新)!

[复制链接]
发表于 2007-5-18 16:34:53 | 显示全部楼层 |阅读模式
2007.5.24 更新至连载二,在以后的连载中,我们都会提供相关部分的数据包文件,供大家查看。

近段时间对MSN协议进行了一番学习,现在我将的一些学习内容以连载的方式贴出来,内容主要分为MSN的登录,聊天过程,传输文件等!

今天,我们就来看MSN的登录过程。

----------------------------------我是分隔线---------------------------------------------


连载一:MSN登录

1   前言

MSN Messenger是Microsoft开发的聊天工具,目前在世界使用率第一的IM软件。使用MSN Messenger可以与他人进行文字聊天,语音对话,视频会议等即时交流,还可以通过此软件来查看联系人是否联机等。平常我们在使用MSN Messenger时,包括登录,聊天等等过程看似是这样的轻松简单,然而殊不知在这样简单的操作下面,包含了非常复杂的过程。

然而这些复杂的过程都是通过MSN协议完成的。1999年,Microsoft向IETF提交了一份"MSN Messenger Service 1.0 Protocol"草案,这是最初版本的MSN Messenger协议。MSN协议已经发展到了第13个版本。
今天,我们怀着对协议的学习的态度,通过使用科来网络分析系统,捕获MSN通讯的数据包,来对MSN Messenger的一些通讯过程进行分析学习。
我的网络环境非常简单:个人PC通过ADSL拨号上网。同时,我们使用Windows Live Messenger 8.1进行分析。

2   协议简述

MSN Messenger通常使用TCP 端口1863进行通信。在MSN Messenger工作中,客户端与三种服务器通过协议进行通信和数据交换,客户端和各服务器之间主要通过两种形式的进行通信,一种是命令,另一种是消息。

命令(Command):使用纯ASCII码多数数据是以标准的命令格式发送的。标准的命令格式主要由三部分组成,以命令标识符开始,然后是参数,以换行为结束。参数之间以空格区分。

消息(Message):符合MIME 1.0标准,由消息头与消息体组成。通常使用UTF-8编码,消息头中也需要URL编码格式,消息体则直接用二进制数据。它是一种独特的命令方式。它以MSG开头,每个消息的第一行的末尾以一个数字来表示消以下部分息的字节数(包括mime头和主体部分)。第二行为mime的头,一般形式为mime-version: 1.0,以换行结束。下一行所代表的是要发送消息的类型,定义的格式为content-type: */*; charset=utf-8,其中*/*代表消息类型,charset=utf-8是完全可选的,与是否使用该参数与定义的消息类型有关。随后mime头以两个换行结束,用于区分消息主体。

Transaction id:在客户端向服务器端发送的每个命令和消息中都包含一个transaction id。其位于命令标识符和MSG后面,服务器收到客户端的相应命令和消息后,回应客户端时把对应的Transaction id返回给客户端,客户端根据Transaction id来判断服务器回应的是哪个请求。每次客户端向服务器发送一次命令或消息后,Transaction id自动加1。

3   分析过程
我们启用科来网络分析系统,设置MSN协议的数据包过滤器,开始捕获。同时,使用Windows Live Messenger 8.1客户端进行登录,然后进行文字聊天,传输文件以等操作后,并停止捕获。下面我们通过捕获的数据包文件,分别对MSN的各个过程进行详细的分析。

3.1    MSN登录

我们先来看MSN的登录过程。MSN协议建立在TCP之上,除了文件传输和语音聊天是直接的"点对点"通信之外,其它所有的情形全部通过服务器进行。
首先我们特别了解三种类型的服务器,如下:

派遣服务器(Dispatch Server, DS):客户端最初连接的服务器。负责给客户端分配合适的通知服务器。域名是messenger.hotmail.com,标准服务端口是1863。完成派遣任务后,切断TCP连接。

通知服务器(Notification Server, NS):客户端需要一直保持连接的服务器。很多任务要在这个会话内完成,包括登录、改变状态、获取用户列表、修改用户信息、发起聊天、接受呼叫、邮件通知、退出等等。服务端口由派遣服务器指定,通常也是1863。
        
接线服务器(Switchboard Server, SS):客户端之间聊天使用的中转服务器。每开一个聊天窗口,客户端和服务器就建立一个TCP会话。当客户端之间需要进行文件传输或语音聊天时,发送系统消息,建立"点对点"会话通道(可能转为使用UDP)。服务端口通常也是1863。"点对点" 通信使用的端口由客户端自动协商决定,如文件传输通常使用6891端口。

现在我们开始结合数据包文件进行查看。如图1。

(图1  与派遣服务器建立TCP连接)

图1中,客户端在登录时,首先与派遣服务器建立TCP连接。当连接成功后,客户端会向派遣服务器发送一个VER命令,命令中将包含协议版本的参数。服务器收到请求后,同样返回VER命令。如图2所示。

(图2  VER命令协商版本)

随后,客户端将通过CVR命令与派遣服务器协商本地的一些信息,比如操作平台等信息,服务器也对其进行响应,随后客户端向派遣服务器请求认证。如图3。

(图3  CVR命令及派遣服务器认证)

图3中显示了客户端与派遣服务器之间的一些版本协商信息。
当客户端向派遣服务器请求认证后,派遣服务器会将会把客户端重定向到通知服务器,然后与客户端断开连接。客户端到派遣服务器的过程就结束了。如图4。


图4中,编号为9和10的数据包为客户端主动向派遣服务器断开连接。编号11的数据包为重定向到通知服务器的数据包。最后编号为12和13的数据包表示派遣服务器断开与客户端的连接。派遣服务器这边的工作结束了。
由于客户端被重定向到了通知服务器,所以现在客户端将与通知服务器建立连接,并进行更多的登陆操作。如图5所示。

(图5  与通知服务器建立连接)

图5中,数据包编号为14、16和17这个三个数据包描述了客户端与通知服务器建立连接的过程。数据包编号为18、19、20和21这四个数据包说明了客户端和服务器也经历协商版本信息的过程。我们可以看到,客户端与通知服务器建立连接的过程和派遣服务器的前几步是一样的,只是它们在认证过程是不同的。
下面我们看看客户端与通知服务器之间的认证过程。如下图6。

(图6 Notification认证过程)

图6中选中的数据包为客户端与通知服务器认证的过程。
客户端向服务器请求认证,根据参数向通知服务器发送USR命令,其中传入两个参数,第一个为Notification服务器返回的MD5,第二个参数为客户登录的电子邮件地址。服务器收到请求后返回USR。客户端再根据收到的答复后再次发送一个USR,参数为MD5。其中MD5值为上次服务器返回的MD5 hash的小写16进制。服务器收到后返回USR,进行认证,最后登录成功。

以上就是我们根据捕获到的数据包文件,通过对数据包的分析,所了解的MSN的登录过程。

:不同版本的MSN协议,可能存在一些细小差异。


----------------------------------我是分隔线---------------------------------------------

相关数据包文件:
本节完,下回请早!

[ 本帖最后由 KelvinFu 于 2007-5-24 16:00 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?CSNA会员注册

×

评分

1

查看全部评分

回复

使用道具 举报

发表于 2007-5-18 17:46:59 | 显示全部楼层
非常到位的讲解,论坛里看到这样的帖子实在没不再来的理由啊
回复

使用道具 举报

发表于 2007-5-18 20:19:52 | 显示全部楼层
牛 !但我不爱看分析。。。。
回复

使用道具 举报

发表于 2007-5-19 11:11:52 | 显示全部楼层
相当清楚
回复

使用道具 举报

发表于 2007-5-21 15:36:55 | 显示全部楼层
谢谢楼主,写得非常细致,看完此文后,对MSN登录有了详细的了解。

提个要求:楼主能否画一个简单的MSN登录的图啊,就是一步一步是怎样完成登录的?

另外,连载2什么时候推出呢,主题是什么?
回复

使用道具 举报

发表于 2007-5-22 09:25:22 | 显示全部楼层

回复 #5 cwym29 的帖子

看完此文后的理解

登陆过程:

客户机->派遣服务器->协商版本->认证->重定向到通知服务器->协商版本->请求认证->通过认证并登陆.
回复

使用道具 举报

 楼主| 发表于 2007-5-24 15:52:13 | 显示全部楼层
连载二:  获取好友列表

经过上面对登陆过程的描述,我们知道,客户端经过和通知服务器完成登陆认证后,表示服务器允许客户端登陆上来。在较新的MSN协议中,服务器将发送一些附加的数据,类似用户的信息和一个认证码(类似于一个cookie,可以用到许多其它的功能中),发送给我们的客户端。如图7。

(图7 )
接下来,客户端和通知服务器之间开始交互登陆账号的信息,比如,个人资料,说明,昵称等等,如图8。
  
(图8 客户端和通知服务器交互登陆账号的信息)
当这些信息交互完成后,我们的客户端是登录上服务器的,但是我们的状态仍然是离线。为了能够发送和接受信息,我们需要把我们的状态改成在线。所以客户端需要通过一些命令来完成上线。如图9所示。

(图9 改变状态)
图9中,通过CHG命令,客户端的状态改变为在线,现在,我们可以获取联系人的信息了。
随后就是服务器则向客户端发送回在线的好友及其相应的状态。这里就不详细说明了,请参见数据包。

----------------------------我是分隔线-------------------------------------------------
相关数据包文件下载:

[ 本帖最后由 KelvinFu 于 2007-5-24 15:55 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?CSNA会员注册

×
回复

使用道具 举报

发表于 2007-5-24 16:12:47 | 显示全部楼层
不错 很详细
不过msn连载起来是比较长的 楼上一定要坚持
http://www.hypothetic.org/docs/msn/index.php
回复

使用道具 举报

 楼主| 发表于 2007-5-24 16:45:56 | 显示全部楼层

回复 #8 harold 的帖子

俺一定会坚持的!

学习本来就是一个坚持的过程!

大家有什么想法和意见可以说啊!

有了交流才能更好的进步,一个的进步不算什么,大家一起进步才是棒!
回复

使用道具 举报

发表于 2007-7-20 13:41:02 | 显示全部楼层
lz的精神可嘉,支持;

个人这阵子也在分析msn的协议,对于登录/消息获取好像根据一些协议分析文章介绍还好理解;

但不知lz对于msn文件传输的分析怎样,个人的抓包分析好像不走固定TCP端口(如lz说6891等),

相关传输协议也不一定是MSNFTP,走得是MSNP2P,期待lz的“传输文件”
回复

使用道具 举报

发表于 2007-7-26 22:09:30 | 显示全部楼层
楼主好人阿,非常感谢!
回复

使用道具 举报

发表于 2007-12-28 14:23:53 | 显示全部楼层
想知道文件传输部分!分析好了吗?谢谢!!!
回复

使用道具 举报

发表于 2009-4-14 11:52:25 | 显示全部楼层
太强大了,我想知道这个软件是哪里搞的.
回复

使用道具 举报

发表于 2009-6-30 13:31:49 | 显示全部楼层
不错的分析谢了+
回复

使用道具 举报

发表于 2009-8-17 14:31:20 | 显示全部楼层

this'satestarticle多谢

{#con内容con#} 哈哈 很有用
回复

使用道具 举报

发表于 2009-8-17 14:43:09 | 显示全部楼层
谢谢分享,支持支持!辛苦了!
回复

使用道具 举报

发表于 2009-8-17 21:31:21 | 显示全部楼层
非常有调理
学习学习
回复

使用道具 举报

发表于 2009-10-31 17:33:21 | 显示全部楼层
不少的内容,得好好的消化呀!不过长了知识!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | CSNA会员注册

本版积分规则

快速回复 返回顶部 返回列表