MSN Messenger 协议分析一

 
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
 
命令详细内容查询网址:
四. 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 的一个对象。
 
 
参考文档:
 
1 . SIP 协议解析与实现 (c 和 c++ 使用 osip) 1— 概述
2 . SIP 协议解析与实现 (c 和 c++ 使用 osip) 2— SIP 协议的结构
3 . SIP 协议解析与实现 (c 和 c++ 使用 osip) 3—SIP 消息
4 . SIP 协议解析与实现 (c 和 c++ 使用 osip) 4— 消息体
5 . SIP 协议解析与实现 (c 和 c++ 使用 osip) 5— 一般用户代理行为
6 . MSNPiKi (专门分析 MSN Messenger protocol 的网站,已分析的 MSN 协议版本: MSNP8 到 MSNP15 )
7 . MSNSLP and P2P
8 . MSN Messenger protocol ( MSNP9 , MSNP10 )
9 . NOKIA SIP application development
10 . SIP 消息之逐项讲解
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值