转自:http://www.cnblogs.com/happyhotty/articles/1900206.html
一.What is the MSNP (MSN Messenger Protocol)?
MSN
消息协议由一系列的在客户端和服务器之间传送的命令组成。例如,你的一个好友下线了,服务器就会发送一条消息:
FLN [email protected]
到你的客户端。你的客户端就会将这个好友标记为下线状态。
FLN
就是一个在服务器和客户端传送的命令,它带有参数
[email protected]
,这个参数是客户端的
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消息协议传送的命令
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
:
客户端仅仅使用两个方法:
“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
表示用户使用的是
MSN Messenger
“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
消息的例子:
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