码迷,mamicode.com
首页 > 其他好文 > 详细

XMPP协议

时间:2016-07-17 00:04:23      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:

XMPP 全称Extensible Messaging and Presence Protocol,前称Jabber

从本质上讲, 一个XML流作为会话期间发送的XML节的信封, 而另一个XML流作为会话期间接收的XML节的信封. 我们可以用如下的简化模型做一个展示.

+--------------------+--------------------+
| INITIAL STREAM     |  RESPONSE STREAM   |
+--------------------+--------------------+
| <stream>           |                    |
|--------------------|--------------------|
|                    | <stream>           |
|--------------------|--------------------|
| <presence>         |                    |
|   <show/>          |                    |
| </presence>        |                    |
|--------------------|--------------------|
| <message to=‘foo‘> |                    |
|   <body/>          |                    |
| </message>         |                    |
|--------------------|--------------------|
| <iq to=‘bar‘       |                    |
|     type=‘get‘>    |                    |
|   <query/>         |                    |
| </iq>              |                    |
|--------------------|--------------------|
|                    | <iq from=‘bar‘     |
|                    |     type=‘result‘> |
|                    |   <query/>         |
|                    | </iq>              |
|--------------------|--------------------|
| [ ... ]            |                    |
|--------------------|--------------------|
|                    | [ ... ]            |
|--------------------|--------------------|
| </stream>          |                    |
|--------------------|--------------------|
|                    | </stream>          |
+--------------------+--------------------+

XMPP协议的组成

主要的XMPP 协议范本及当今应用很广的XMPP 扩展 RFC 3920 XMPP:核心。定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XML Stanza(XML 节),并规定XMPP 协议在通信过程中使用的XML 标签。使用XML 标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全方面,把TLS 安全传输机制与SASL 认证机制引入到内核,与XMPP 进行无缝的连接,为协议的安全性、可靠性奠定了基础。Core 文档还规定了错误的定义及处理、XML 的使用规范、JID(Jabber Identifier,Jabber 标识符)的定义、命名规范等等。所以这是所有基于XMPP 协议的应用都必需支持的文档。

XEP-0030 服务搜索。一个强大的用来测定XMPP 网络中的其它实体所支持特性的协议。
XEP-0115 实体性能。XEP-0030 的一个通过即时出席的定制,可以实时改变交变广告功能。
XEP-0045 多人聊天。一组定义参与和管理多用户聊天室的协议,类似于Internet 的Relay Chat,具有很高的安全性。
XEP-0096 文件传输。定义了从一个XMPP 实体到另一个的文件传输。
XEP-0124 HTTP 绑定。将XMPP 绑定到HTTP 而不是TCP,主要用于不能够持久的维持与服务器TCP 连接的设备。
XEP-0166 Jingle。规定了多媒体通信协商的整体架构。
XEP-0167 Jingle Audio Content Description Format。定义了从一个XMPP 实体到另一个的语音传输过程。
XEP-0176 Jingle ICE(Interactive Connectivity Establishment)Transport。ICE传输机制,文件解决了如何让防火墙或是NAT(Network Address Translation)保护下的实体建立连接的问题。
XEP-0177 Jingle Raw UDP Transport。纯UDP 传输机制,文件讲述了如何在没有防火墙且在同一网络下建立连接的。
XEP-0180 Jingle Video Content Description Format。定义了从一个XMPP 实体到另一个的视频传输过程。
XEP-0181 Jingle DTMF(Dual Tone Multi-Frequency)。
XEP-0183 Jingle Telepathy Transport Method。

XMPP XML格式

XMPP定义了三种顶级XML节

<iq />
<message />
<presence />

< message />节定义了消息语义,< message />节可被看作“推”机制,一个实体推信息给其它实体,与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者;根据接收到那样的一个节,服务器应该路由或传送它到有意的接收者。
用于两个用户之间发送消息

例子:

<message  
  to="lily@jabber.org/contact"  
  type="chat" > 
    < body> 你好,在忙吗</ body> 
</ message >   

< presence />节定义了出席语义,< presence />节可被看作基本广播或“出版-订阅”机制,多实体收到他们已订阅(在这种情况下,网络可利用信息)实体的信息。总的来说,出版实体应该发送一个不带‘to’属性的出席节,在这种情况下,与此实体相连的服务器应该广播给所有订阅实体。然而,一个出版实体也可能发送一个带有‘to’属性的出席节,此种情况下,服务器应该路由或传送节到有意的接收者。
presence用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态。要想接受presence消息,必须经过一个叫做presence subscription的授权过程。

show:

chat:聊天中
away:暂时离开
xa:eXtend Away,长时间离开
dnd:勿打扰

status:
格式自由,可阅读的文本。也叫做rich presence或者extended presence,常用来表示用户当前心情,活动,听的歌曲,看的视频,所在的聊天室,访问的网页,玩的游戏等等。

priority:
范围-128~127。高优先级的resource能接受发送到bare JID的消息,低优先级的resource不能。优先级为负数的resource不能收到发送到bare JID的消息。

例子:

<presence from="alice@wonderland.lit/pda"> 
  <show>xa</ show> 
  <status>down the rabbit hole!</ status> 
< /presence> 

< iq />节定义了请求语义,< iq />节可被看作一个请求-响应机制,与[HTTP]在某些方面相似。IQ语义让一个实体向其它实体请求或接收其它实体的响应成为可能。请求与响应的数据内容由IQ无素的直接子元素的命名空间声明定义,并且,交互由请求实体通过使用‘id’属性来跟踪。因此,IQ交互遵从结构化数据交换的一个通用模式,此交换例如得到/结果或设置/结果(虽然如果合适的话,对一个请求的响应可能会以错误返回)。

IQ消息是通过“请求/响应”机制在实体间进行交换的。IQ元素用于不同的目的,它们之间通过不同的命名空间来加以区分。在Jabber/XMPP消息协议里有许多的命名空间,但最常用的命名空间是:”jabber:iq:register”,”jabber:iq:auth”,”jabber:iq:roster”

请求实体                     应答实体
----------                  ----------
    |                            |
    | <iq id=‘1‘ type=‘get‘>     |
    |   [ ... payload ... ]      |
    | </iq>                      |
    | -------------------------> |
    |                            |
    | <iq id=‘1‘ type=‘result‘>  |
    |   [ ... payload ... ]      |
    | </iq>                      |
    | <------------------------- |
    |                            |
    | <iq id=‘2‘ type=‘set‘>     |
    |   [ ... payload ... ]      |
    | </iq>                      |
    | -------------------------> |
    |                            |
    | <iq id=‘2‘ type=‘error‘>   |
    |   [ ... condition ... ]    |
    | </iq>                      |
    | <------------------------- |
    |                            |

例子:

<iq from="alice@wonderland.lit/pda"  
    id="rr82a1z7" 
    to="alice@wonderland.lit"  
    type="get"> 
  < query xmlns="jabber:iq:roster"/> 
</ iq>  

XMPP协议的命名空间:

jabber:iq:private – 私有数据存储,用于本地用户私人设置信息,比如用户备注等。
jabber:iq:conference – 一般会议,用于多个用户之间的信息共享
jabber:x:encrypted – 加密的消息,用于发送加密消息
jabber:x:expire – 消息终止
jabber:iq:time – 客户端时间
jabber:iq:auth – 简单用户认证,一般用于服务器之间或者服务器和客户端之间的认证
jabber:x:roster – 内部花名册
jabber:x:signed – 标记的在线状态
jabber:iq:search – 用户数据库查询,用于向服务器发送查询请求
jabber:iq:register – 注册请求,用于用户注册相关信息
jabber:x:iq:roster – 花名册管理
jabber:x:conference – 会议邀请,用于向参加会议用户发送开会通知
jabber:x:event – 消息事件
vcard-temp – 临时的vCard,用于设置用户的头像以及昵称等

XMPP协议属性

XMPP给这三种节定义了五种通用属性

to
from
id
type
xml:lang

1、to属性指定接收节的JID。
2、from属性指定发送者的JID。

3、id属性是可选的。并且,在接收应用(通常是一个服务器)中是唯一的。(注意:流ID可能是严格安全的,并且因此必须是即不能预测也不能重复的)

4、type属性指定目的或消息上下文,出席或IQ节的详细信息。

(1)、IQ节的type属性有

Get :获取当前域值。类似于http get方法。
Set :设置或替换get查询的值。类似于http put方法。
Result :说明成功的响应了先前的查询。类似于http状态码200。
Error: 查询和响应中出现的错误。
如果是错误类型,会提示一下错误类型
"error-type" 必须是以下之一:
auth -- 在提供身份之后重试
cancel -- 不要重试 (该错误不能加以弥补)
continue -- 继续 (这个条件只是个警告)
modify -- 在修改发送的数据之后重试
wait -- 等待之后重试 (该错误是暂时的)

(2)、presence节的type(非必须)属性有:

subscribe:订阅其他用户的状态
Subscribed:已订阅
Unsubscribe:不能订阅
Unsubscribed:不可订阅的
probe:请求获取其他用户的状态
unavailable:不可用,离线(offline)状态
Available:可用,在线状态
Error:请求中出现的错误
Invisible:不可见

(3)、 message节的type属性有:

Chat:类似于qq里的好友即时聊天,主要特点是实时通讯;
Error:如果发送message出错,发现错误的实体会用这个类别来通知发送者出错了;
GroupChat:类似于聊天室里的群聊;
Headline:用于发送alert和notification;
Normal  :类似于email,主要特点是不要求响应;

5、xml:lang属性值指定任意可读XML字符数据的缺省语言

XMPP协议

标签:

原文地址:http://blog.csdn.net/zhiyahan/article/details/51925403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!