摘要:本规范定义了如何采用BOSH技术传输XMPP数据节。在设备或客户端不能为XMPP服务器维持长久的TCP连接的情况下,我们使用HTTP绑定来协助XMPP通信。
1.介绍
BOSH协议定义了如何能够有效并可靠地通过HTTP在客户端和服务器之间双向传输任意XML元素。本文档定义了一些BOSH的小扩展来将XMPP流绑定到HTTP上。
2.<body/>元素
如果BOSH的<body/>元素不为空,它应该包含以下内容之一:
* 一个完整的<stream:features/> 元素 (此时BOSH <body/> 元素一定要包含命名空间 xmlns:stream='http://etherx.jabber.org/streams')。
* 一个用于通过SASL验证的完整元素,并且要由'urn:ietf:params:xml:ns:xmpp-sasl'命名空间认定。
* 一个或者多个完整的<message/>, <presence/>, 和/或者 <iq/> 元素,由'jabber:client'命名空间认定。
* 一个<stream:error/>元素(在这种情况下, BOSH <body/>元素一定要包含命名空间 xmlns:stream='http://etherx.jabber.org/streams' 并且它一定要着重说明'remote-stream-error' 终端错误的条件),在它之前可以有0个或多个完整的<message/>, <presence/>, 和/或者 <iq/> 元素,由'jabber:client'命名空间认定。
注 意:许多BOSH客户端和连接管理器现有的特殊XMPP实现没有指定<message/>,<presence/>,或 者<iq/>元素的命名空间,因为它允许它们传输不经修改的数据节(XMPP <stream:stream/> 元素和TCP一起代表性地设置了默认的命名空间'jabber:client')。作为替代,它们只是简单地假定'jabber:client'命名空间 的所有内容都是'http://jabber.org/protocol/httpbind'命名空间的子集。
注意:可以包含TLS验证元素,但是并不推荐。有关TLS如何通过BOSH来实施的内容目前已经超过了本文档的范围。作为替代,通道加密应该在HTTP传输层完成,而不是在XMPP应用层。
3.会话创建请求
客 户端应该在会话创建请求中包含由'urn:xmpp:xbosh'命名空间认定的'version'属性。这个属性相当于定义在RFC 3920文档中XMPP <stream:stream/>元素的'version'属性。连接管理器应该相应地将其值传给XMPP服务器。
例1 使用version属性请求会话
POST /webclient HTTP/1.1Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 104
<body content='text/xml; charset=utf-8'
hold='1'
rid='1573741820'
to='jabber.org'
route='xmpp:jabber.org:9999'
secure='true'
wait='60'
xml:lang='en'
xmpp:version='1.0'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:xmpp='urn:xmpp:xbosh'/>注意:与Jabber HTTP Polling中的定义的协议不同,一个开放的<stream:stream>标签并没有发送给连接管理器(因为BOSH <body/>元素一定不能包含部分XML元素)。连接管理器负责管理任何在它和XMPP服务器之间的数据流(它超越了本文档的范围)。
4.会话创建响应
连接管理器一旦收到服务器的数据,应该在它的会话创建响应或是任何后继响应中包含一个'version'属性(由'urn:xmpp:xbosh'命名空 间认定)和一个<stream:features/>元素(由'http://etherx.jabber.org/streams'命名空 间认定)。
注意:同样的程序也应用于BOSH <body/>元素中过时的特殊XMPP 'authid'属性,它包含了由XMPP服务器产生的XMPP流ID的值。这个值只在旧系统的XMPP客户端使用过时的非SASL认证协议完成摘要认证 时使用。
例2 具有流特征的会话创建响应 HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 674
<body wait='60'
inactivity='30'
polling='5'
requests='2'
hold='1'
accept='deflate,gzip'
sid='SomeSID'
secure='true'
charsets='ISO_8859-1 ISO-2022-JP'
xmpp:version='1.0'
authid='ServerStreamID'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:xmpp='urn:xmpp:xbosh'
xmlns:stream='http://etherx.jabber.org/streams'>
<stream:features>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
</body>
如果在连接管理器的会话创建响应中没有<stream:features/>元素,客户端应该发送空的请求元素,直到它收到含有<stream:features/>元素的响应为止。
例3 具有流特征的后继响应
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 483
<body xmpp:version='1.0'
authid='ServerStreamID'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:xmpp='urn:xmpp:xbosh'
xmlns:stream='http://etherx.jabber.org/streams'>
<stream:features>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
</body>
注意:客户端应该忽略任何传输层安全(TLS)特性,因为BOSH的通道加密应该在HTTP层讨论。
不推荐TLS压缩(在RFC 3920中定义)和流压缩(在流压缩中定义[7]),因为压缩应该使用BOSH会话创建响应中的'accept'属性在HTTP层协商。TLS压缩和流压 缩不应该在HTTP内容编码的同时使用。
注意:当添加新数据流到会话中时,由'urn:xmpp:xbosh'命名空间认定的'version'属性也应该包含在请求和响应中。
5. 认证,源绑定和即时通讯会话的建立
以下是成功的使用XMPP协议进行认证和源绑定的实例。需要这些协议的细节说明(包括错误实例),请参考RFC 3920。
例4 SASL认证步骤1
POST /webclient HTTP/1.1
Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 172
<body rid='1573741821'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>
</body>
例5 SASL认证步骤2
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 250
<body xmlns='http://jabber.org/protocol/httpbind'>
<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9
ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg==
</challenge>
</body>
例6 SASL认证步骤3
POST /webclient HTTP/1.1
Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 418
<body rid='1573741822'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
dXNlcm5hbWU9InNvbWVub2RlIixyZWFsbT0ic29tZXJlYWxtIixub25jZT0i
T0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5jPTAw
MDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5jb20i
LHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3LGNo
YXJzZXQ9dXRmLTgK
</response>
</body>
例7 SASL认证步骤4
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 190
<body xmlns='http://jabber.org/protocol/httpbind'>
<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZAo=
</challenge>
</body>
例8 SASL认证步骤5
POST /webclient HTTP/1.1
Host: httpcm.jabber.org
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=utf-8
Content-Length: 152
<body rid='1573741823'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
</body>
例9 SASL认证步骤6
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 121
<body xmlns='http://jabber.org/protocol/httpbind'>
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
</body>
在收到元素以后,客户端一定还要让连接管理器通过发送“重新开始请求”来重新发送数据流,“重新开始请求”的结构如下:
* BOSH <body/> 元素一定要包含布尔型的'restart'属性,(由'urn:xmpp:xbosh'命名空间认定) 其值为真。
* BOSH <body/> 元素应该包含'to'属性。
* BOSH <body/> 元素应该包含'xml:lang'属性。
* BOSH <body/> 元素应该为空 (比如不能包含XML数据节)。然而,如果客户端在body中包含了XML数据节,连接管理器应该忽略它。
下面的例子说明了重新开始请求的格式。
例10 重新开始请求
POST /webclient HTTP/1.1
Content-Type: text/xml; charset=utf-8
Content-Length: 240
<body rid='1573741824'
sid='SomeSID'
to='jabber.org'
xml:lang='en'
xmpp:restart='true'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:xmpp='urn:xmpp:xbosh'/>
在收到一个重新开始请求后,连接管理器一定要考虑之前由即将关闭的XMPP服务器发送的数据流。之后它一定要在同样的TCP连接上发送一个开放的<stream:stream>标签到XMPP服务器来初始化一个新的数据流。如果连接管理器收到一个来自XMPP服务器的<stream:features/>元素,它一定要将这个元素发送到客户端:
例11 重新发送请求的
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 221
<body xmlns='http://jabber.org/protocol/httpbind'
xmlns:stream='http://etherx.jabber.org/streams'>
<stream:features>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
</stream:features>
</body>
客户端之后能完成任何强制的或随意的数据流特性协商。
例12 源绑定请求
POST /webclient HTTP/1.1
Content-Type: text/xml; charset=utf-8
Content-Length: 240
<body rid='1573741825'
sid='SomeSID'
xmlns='http://jabber.org/protocol/httpbind'>
<iq id='bind_1'
type='set'
xmlns='jabber:client'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
<resource>httpclient</resource>
</bind>
</iq>
</body>
例13 源绑定结果
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 221
<body xmlns='http://jabber.org/protocol/httpbind'>
<iq id='bind_1'
type='result'
xmlns='jabber:client'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
<jid>stpeter@jabber.org/httpclient</jid>
</bind>
</iq>
</body>
6. 远程数据流错误
<body/>元素的内容是来自XMPP服务器的0个或多个数据节,伴随着一个<stream:error/>元素(由'http://etherx.jabber.org/streams'命名空间认定)复本:
例14 远程错误HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 68
<body condition='remote-stream-error'
type='terminate'
xmlns='http://jabber.org/protocol/httpbind'
xmlns:stream='http://etherx.jabber.org/streams'>
<message from='contact@example.com'
to='user@example.com'
xmlns='jabber:client'>
<body>I said "Hi!"</body>
</message>
<stream:error>
<xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
<text xmlns='urn:ietf:params:xml:ns:xmpp-streams'
xml:lang='en'>
Some special application diagnostic information!
</text>
<escape-your-data xmlns='application-ns'/>
</stream:error>
</body>7. 接收者不存在或断线
即使客户端的连接不存在了,连接管理器也有可能收到要发送给客户端的数据节(例如,在连接管理器通知XMPP服务器客户端的连接已断之前)。在这种情况下,连接管理器会向XMPP服务器返回一个错误信息,我们建议连接管理器进行以下操作,因为它与RFC 3921文档第11部分的第2点中的情况类似:
- 如果被传递的数据节是<presence/>,悄悄地抛弃这个数据节并且不向发送者返回错误信息。
- 如果被传递的数据节是 <iq/>,向发送者返回一个 <service-unavailable/>错误。
- 如果被传递的数据节是 <message/>,向发送者返回一个<recipient-unavailable/>错误。
当XMPP服务器收到来自连接管理器的包含<recipient-unavailable/>错误的<message/>数据节时,它应该将这个消息保存起来,以备日后支持线下存储 (参见 Best Practices for Handling Offline Messages [11])时的信息传递,否则应将这个错误数据节返回给发送者。
相关推荐
标题 "XEP-0384:libpurple的OMEMO加密" 指涉的是一个与即时通讯安全相关的技术标准,XEP(eXtended Protocol)是XMPP(Extensible Messaging and Presence Protocol)扩展协议的缩写。XEP-0384是其中的一个特定规范...
《XEP-0035: SSL/TLS Integration》是XMPP(Extensible Messaging and Presence Protocol)标准框架下关于SSL/TLS整合的一份文档。该文档由Robert Norris撰写,并于2003年11月5日发布,但随后在同一天被撤销,因为其...
7. **XEP-0363:HTTP over XMPP**:允许通过XMPP网络传输HTTP内容,比如文件下载。 8. **XEP-0352:客户端证书认证**:增强了安全性的认证方式,使用客户端证书进行身份验证。 每个XEP文档都详细描述了扩展协议的...
Xabber-适用于Android的XMPP客户端开源...0138:流压缩XEP-0203:延迟交货XEP-0091:旧版延迟交付XEP-0199:XMPP Ping XEP-0147:XMPP URI方案查询组件XEP-0085:聊天状态通知XEP-0184:邮件传递收据XEP-0155:节会话协
* XEP-0045:群聊消息,类似互联网的中继聊天(IRC)协议,允许多人在一个虚拟的房间内聊天。 * XEP-0049:私人 XML 存储,定义了私人数据如何在服务端存储。 * XEP-0050:工作流管理,提供实体向另一个实体执行远程...
XEP-0054:电子名片 XEP-0153:基于vCard的头像 XEP-0085:聊天状态通知 XEP-0280:消息碳 XEP-0092:软件版本 XEP-0012:最后活动 XEP-0333:聊天标记 XEP-0184:邮件传递收据 路线图 追踪最近使用过的贴纸 管理...
10. 跨协议兼容:XEP-0199(XMPP Ping)和其他一些XEP还允许XMPP与非XMPP系统进行交互,增强了与其他通信协议的兼容性。 以上只是部分XMPP常用的XEP协议,实际中还有许多其他协议用于扩展XMPP的功能,如地理位置...
XEP-0363,即HTTP文件上传扩展,允许Jabber/XMPP用户通过HTTP上传和分享文件,而不是直接通过IM服务器传递大文件,从而减轻服务器负担并提高传输效率。 本文将深入探讨`jabber-http-file-upload`项目,它为Emacs ...
支持的文件: RFC6120 :可扩展消息和状态协议(XMPP):核心RFC6121 :可扩展消息和状态协议(XMPP):即时消息和状态XEP-0198 :流管理XEP-0085 :聊天状态通知XEP-0318 :客户端启动的状态探针的最佳实践XEP-...
PHP-Component 是 XEP-0114 和相关 XEP 的 PHP 语言实现,专门为 Lopbox ( ) 项目编写。 它旨在非常易于使用并让 PHP 程序员开发各种类型的服务:Jabber / XMPP 机器人、传输、MUC 引擎和许多其他类型的组件。 将 ...
XEP-Jingle协议是XMPP(Extensible Messaging and Presence Protocol)扩展协议中的一部分,用于实现实时多媒体通信,如音频、视频通话以及文件共享等。它为XMPP用户提供了一种标准化的方式来建立、管理和终止多媒体...
- **XEP-0199:XMPP Ping** - 提供心跳检测,保持连接活跃。 - **XEP-0163:个人事件通知(PEP)** - 实现用户分享状态、兴趣、位置等个人信息。 - **XEP-0060:发布订阅** - 允许用户发布和订阅事件。 - **XEP-0133...
* message-archive-xep-0136:消息归档 * jabber:iq:auth:简单用户认证 * urn:ietf:params:xml:ns:xmpp-sasl:SASL协商 * urn:ietf:params:xml:ns:xmpp-bind:资源绑定 * urn:ietf:params:xml:ns:xmpp-sessions:...
XEP-0035是Extensible Messaging and Presence Protocol (XMPP)扩展协议之一,它关注的是如何在XMPP服务器之间以及客户端与服务器之间实现安全的SSL/TLS(Secure Sockets Layer/Transport Layer Security)整合。...
XEP-0321是这个家族中的一项标准,目的是允许用户在不同XMPP服务器之间共享和管理他们的联系人列表,或者名册。 Openfire是一款开源、基于Java的即时通讯服务器,它使用XMPP协议来提供实时通信服务。Gojara插件是为...
8. **扩展功能**:XMPP协议允许通过XEP(XMPP Extension Protocols)进行扩展。这个库可能包含了对某些常见XEP的支持,比如文件传输、私聊、群组管理等。 9. **错误处理和调试**:为了方便开发者,库应该提供良好的...
这允许XEP-0357兼容的客户端在ejabberd服务器上使用mod_push的内部应用服务器,或者在运行Oshiya的任何XEP-0114兼容的服务器上使用。 Oshiya是GSoC 2015项目的一部分。 请发送反馈。 ##功能Oshiya将支持以下推送...
- XEP-0065:SOCKS5 Bytestreams,提供了一种通过中间代理进行数据传输的方法。 - RFC-3920:XMPP 核心,定义了 XMPP 的基本框架和数据格式。 - RFC-3921:XMPP 实时通信,详细描述了用户间的实时消息传递机制。 ...
xmpp 扩展协议 xep-0045 中文pdf文档,聊天室协议中文文档
XEP-0128:服务发现扩展 XEP-0115:实体功能 XEP-0054:vcard-temp XEP-0153:基于vCard的头像 XEP-0045:多用户聊天(不完全) XEP-0078:非SASL身份验证 XEP-0138:流压缩 XEP-0203:延迟交货 XEP