MSN Messenger 协议分析将分如下几个部分进行:
1,MSN Messenger 协议概述
2,登陆部分
3,文本聊天部分
4,音视频聊天部分
5,显示图片部分
6,文件传输部分
第一部分 MSN Messenger Protocol概述
一.What is the MSNP (MSN Messenger Protocol)?
MSN消息协议由一系列的在客户端和服务器之间传送的命令组成。例如,你的一个好友下线了,服务器就会发送一条消息:FLN example@hotmail.com 到你的客户端。你的客户端就会将这个好友标记为下线状态。FLN就是一个在服务器和客户端传送的命令,它带有参数example@hotmail.com ,这个参数是客户端的Email 地址,也是用户名。MSN消息协议就靠在客户端和服务器之间传送这样一些带参数的命令来交流信息。
MSN的协议到目前已有多个版本,微软的服务器支持客户端使用:MSNP8,MSNP9,MSNP10,MSNP11,MSNP12,MSNP13,MSNP14,MSNP15这些协议版本。
MSN消息协议建立在TCP/IP上,除了显示图片,自定义表情,文件传输与语音视频聊天是p2p外,其它都通过服务器来进行。
二.MSN Messeger Servers
MSN聊天用到的消息服务器有三大类:
1、Dispatch Server,派遣服务器,简称DS,客户端最初连接的服务器,负责给客户端分配合适的通知服务器。有固定的域名与端口。完成派遣任务后切断TCP连接。(在高版本中已不用)
2、Notification Server,通知服务器,简称NS,客户端需要一直保持连接的服务器,很多任务都在这个会话内完成,但其不负责传输与消息实体相关的数据。
3、Switchboard Server,接线服务器,简称SB,客户端之间聊天使用的中转服务器,每开一个聊天窗口,客户端和服务器就建立一个TCP会话。开始聊天前,发起方必须先申请并连接这个服务器。
MSN消息服务器结构如下:
三.MSN消息协议传送的命令
1.Logon/Dispatch server
下面这些命令在连接到Dispatch服务器或Notification服务器时被发送和接收:
VER - Protocol version
CVR - Sends version information
USR - Authentication command
XFR - Redirection to Notification server
2.Notification Server
下面这些命令在请求联机以后,通过Dispatch服务器或Notification服务器被发送和接收。
联系人列表/设置/初始化同步命令:
BLP - Initial settings download
BPR - Initial settings download
GTC - Initial contact list/settings download
ILN - Initial contact presence notification
LSG - Initial contact list download - Groups
LST - Initial contact list download - Contacts
MSG - Initial profile download
PRP - Initial settings download - Mobile settings and display name
标准的发送/接收命令
ADL - Add users to your contact lists
ADC - Add users to your contact lists (deprecated as of MSNP13)
ADD - Add users to your contact lists (deprecated as of MSNP11)
ADG - Create groups
CHG - Change client’s online status
GCF - Unknown
OUT - Gracefully logout
PNG - Client ping
QNG - Server response to PNG
QRY - Response to CHL by client
SBS - Unknown
SYN - Begin synchronization/download contact list
REA - Change display name
REG - Rename groups
REM - Remove contacts
RMG - Remove groups
XFR - Opens new chat session on switchboard server
UBX - Inform you with a user PSM/Media
异步命令:
CHL - Client challenge (see MSNP8:Challenges)
FLN - Principal signed off
NLN - Principal changed presence/signed on
RNG - Client invited to chat session
3.Switchboard Server
通过Notification服务器请求一个连接到Switchboard服务器的会话后,下面的这些命令将会被发送和接收:
ANS - Log in to switchboard chat session using invitation
IRO - Defines which principals are in the current chat session
USR - Log in to switchboard chat session after requesting session from NS
CAL - Invite a user to a chat session
JOI - Response to CAL, when user connected successfully
MSG - Used to send and receive messages in the chat session
BYE - Contact has left conversation
OUT - Gracefully leave switchboard chat session
命令详细内容查询网址:
http://msnpiki.msnfanatic.com/index.php/Reference:Commands
四. MSN Client Protocol
随 着MSN Messenger 6版本的发布,MSN在进行P2P消息发送时,应用层使用基于SIP[2](Session Initiation Protocol)协议的MSNSLP协议。MSNSLP协议与SIP协议大部分相同,但他比SIP协议使用更少的request方法。MSNLP仅使用 INVITE 和BYE 方法。
MSNSLP消息遵循如下结构:
start line/r/n
message-header-1: header value 1/r/n
message-header-2: header value 2/r/n
…
message-header-n: header value n/r/n
/r/n
message body of zero or more bytes
NUL ()
1)start line
如果是一个request,此行将是一个请求行,数据包格式如下:
method SPACE MSNMSGR:buddy@mail.com SPACE MSNSLP-Version /r/n
method:
客户端仅仅使用两个方法:“INVITE”和 “BYE”,INVITE方法开始一个会话,BYE结束一个会话。如果你在一个会话中收到另外一个INVITE消息,这常常会改变会话的参数,如果没什么问题,你可以接受这个消息。
SPACE:
表示空格。
MSNSLP-Version:
对于MSNSLP v1.0,这一部分的值为:MSNSLP/1.0
如果不是一个请求,此行是一个将是一个状态行,数据包格式如下:
version SPACE status-code SPACE reason-phrase /r/n
version:协议版本
status- code和reason-phrase:status-code是一个三位的整形数字的状态码,用于指名对请求的理解和满足的结果。reason- phrase表示这个状态码所代表的意思。客户端必须读取这个状态码来确定它是表示OK 的200还是表示像找不到的404。
例如:MSNSLP/1.0 200 OK /r/n
2)Message Header
消息头部的数据格式按下面的顺序包含值:
“To”, “From”, “Via”, “CSeq”, “Call-ID”, “Max-Forwards”, “Content-Type” and “Content-Length”.
当你收到一条incoming消息,你需要检查上面这几个部分是否是正确的值,如果有错,就需要给发送方反回一个错误信息。
“To” 和“From”包含接受端和发送端的Email地址,格式如下:
<msnmsgr:mail@hotmail.com>
Msnmsgr 表示用户使用的是MSN Messenger
mail@hotmail.com表示某个人的Email地址。
“Via”指明这个请求应该采取什么样的路径,其格式总是为:
“MSNSLP/1.0/TLP ;branch={BranchUID}”
“MSNSLP/1.0″是所使用的协议和版本,“{BranchUID}”是这条消息的唯一标示符。
“CSeq”是Command Sequence的简称,大部分时候,其值为0。但当接收到一条INVITE消息时,你就应该回复一条在CSeq部分加1的消息。即:接收到的INVITE消息的“CSeq”部分是N,则回复消息的CSeq部分应为N+1。
“Call-ID”单独识别一个特定的邀请,对于此用户的所有其他的请求和回应,Call-ID都应该有相同的值。
“Max-Forwards”为最大转发数。
“Content-Type”具体说明内容的类型是哪一种,
对于request,它的值是“application/x-msnmsgr-sessionreqbody”
或者“application/x-msnmsgr-transreqbody”,
对于Response,它的值是“application/x-msnmsgr-sessionreqbody”
或者“application/x-msnmsgr-transrespbody”。
3)Message Body
“message-body”消息的内容依赖于所请求数据的类型,但消息体必须总是以0×00结束。Message Body的内容格式将在音视频部分说明。
下面是一个INVITE消息的例子:
INVITE MSNMSGR:xiongchuanbo1@hotmail.com MSNSLP/1.0
To: <msnmsgr:xiongchuanbo1@hotmail.com>
From: <msnmsgr:aarone@yahoo.cn>
Via: MSNSLP/1.0/TLP ;branch={F560153A-5BF1-40DC-A526-13BED4DFE30A}
CSeq: 0
Call-ID: {3B0DFFDD-48B9-48EF-8BAC-9C073DE413F0}
Max-Forwards: 0
Content-Type: application/x-msnmsgr-transreqbody
Content-Length: 263
//以上部分是消息头,以下部分到结束是消息体
Bridges: TRUDPv1 TCPv1 SBBridge TURNv1
NetID: -1904420899
Conn-Type: Symmetric-NAT
TCP-Conn-Type: Symmetric-NAT
UPnPNat: false
ICF: false
Hashed-Nonce: {1B77505F-D164-58EF-754C-47DC72FBAE39}
SessionID: 40889363
SChannelState: 0
Capabilities-Flags: 1
五.MSN协议数据包的构造
在jml-1.0a2.jar组件包中,上述协议命令的构造位于net.sf.jml.protocol包中。MsnMessage类负责构造各个命令数据包,类图结构如下:
每个子类负责一个命令数据包的构造。然后封装为MsnMessage的一个对象。