XMPP协议
2016-07-16 17:23
260 查看
XMPP 全称Extensible Messaging and Presence Protocol,前称Jabber
从本质上讲, 一个XML流作为会话期间发送的XML节的信封, 而另一个XML流作为会话期间接收的XML节的信封. 我们可以用如下的简化模型做一个展示.
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节
< message />节定义了消息语义,< message />节可被看作“推”机制,一个实体推信息给其它实体,与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者;根据接收到那样的一个节,服务器应该路由或传送它到有意的接收者。
用于两个用户之间发送消息
例子:
< 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的消息。
例子:
< iq />节定义了请求语义,< iq />节可被看作一个请求-响应机制,与[HTTP]在某些方面相似。IQ语义让一个实体向其它实体请求或接收其它实体的响应成为可能。请求与响应的数据内容由IQ无素的直接子元素的命名空间声明定义,并且,交互由请求实体通过使用‘id’属性来跟踪。因此,IQ交互遵从结构化数据交换的一个通用模式,此交换例如得到/结果或设置/结果(虽然如果合适的话,对一个请求的响应可能会以错误返回)。
IQ消息是通过“请求/响应”机制在实体间进行交换的。IQ元素用于不同的目的,它们之间通过不同的命名空间来加以区分。在Jabber/XMPP消息协议里有许多的命名空间,但最常用的命名空间是:”jabber:iq:register”,”jabber:iq:auth”,”jabber:iq:roster”
例子:
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给这三种节定义了五种通用属性
1、to属性指定接收节的JID。
2、from属性指定发送者的JID。
3、id属性是可选的。并且,在接收应用(通常是一个服务器)中是唯一的。(注意:流ID可能是严格安全的,并且因此必须是即不能预测也不能重复的)
4、type属性指定目的或消息上下文,出席或IQ节的详细信息。
(1)、IQ节的type属性有
(2)、presence节的type(非必须)属性有:
(3)、 message节的type属性有:
5、xml:lang属性值指定任意可读XML字符数据的缺省语言
从本质上讲, 一个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] gtalk & XMPP & libjingle
- IM 协议的分析和选取 (XMPP&WebSocket)
- XMPP学习笔记(1)
- Ubuntu12.04(64bit)上部署编译运行Openfire+Spark环境
- 在Openfire源码中添加自己的插件
- 关于sparkweb
- tigase的message流转
- wikipedia上的AMQP介绍
- 解决<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized></not-authorized></failure>
- iOS开发之使用XMPPFramework实现即时通信(一)
- iOS开发之使用XMPPFramework实现即时通信(二)
- iOS开发之使用XMPPFramework实现即时通信(三)
- IOS录音发送
- [素材资源] Android实现推送方式解决方案(转)
- XMPP
- 谷歌雅虎将联手实行即时信息兼容性计划
- Jabber介绍
- Jabber介绍(补充)
- 网址收藏