RFC 6120中文链接地址:点击打开链接
参考:点击打开链接
1.介绍
XMPP Core 用XMPP定义了流的XML技术(也就是流的建立和终止,包括认证和加密)。但是核心的XMPP协议并没有为管理一个灵活的XML流提供工具。
Stream Management背后的基本概念是,初始化的实体(一个服务端或者客户端)和接收的实体(一个服务端)可以为更灵活的管理stream交换“命令”。下面两条 Stream Management的特性被广泛的关注,因为它们可以提高网络的可靠性和终端用户的体验:
*Stanza确认(Stanza Acknowledgements) —— 能够确认一段或者一系列Stanza是否已被好友接收。
*流恢复(Stream Resumption) —— 能够迅速的恢复(resume)一个已经被终止的流。
Stream management 用较的短XML元素实现了这些特性,这些XML元素是在流的标准上的。这些元素并不是XMPP意义上的“stanzas”(也就是说,不是<iq/>, <message/>, or <presence/>这样的stanzas,stanzas在RFC 6120中有定义),它们不会在Stream management中被counted或者被acked,因为它们是为管理stanzas本身而存在的。
Stream management是在XML流的标准上使用的。检查一个给定的流TCP的连通性的时候,特别推荐使用whitespace keepalives(见RFC 6120)、XMPP Ping (XEP-0199) 或者TCP keepalives。对比Stream management,高级消息处理Advanced Message Processing (XEP-0079)和消息回执Message Delivery Receipts (XEP-0184),定义了ack,它可以通过多个流实现端对端的传输;这些特性在一些特殊情况中是有用的,但是没必要去检查在两个xmpp实体之间直接传递的流。
注:Stream management可以用于服务端到服务端、客户端到服务端的流。但是,为了方便,本规范只讨论客户端到服务端的流。同样的原则也适用于服务器到服务器的流。(在本文档中,以“C:”开头的都是由客户端发送的,由“S:“开头的都是由服务器发送的)。
2. 流特性(Stream Feature)
服务端返回一个流的header连同流的features给客户端,这些features包括一个<sm/>元素“urn:xmpp:sm:3”的命名空间namespace(见Namespace Versioning 关于版本号增加的可能性)。
注:客户端不能negotiate(谈判,商议;转让;越过) stream management,除非客户端已经身份验证并且绑定了一个资源;见下面的特定的限制条件。
例1:服务器发送新的流的header和流的features。
S: <stream:stream from='example.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'> S: <stream:features> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/> <sm xmlns='urn:xmpp:sm:3'/> </stream:features>
3. 启动Stream Management
要启动使用Stream Management,客户端发送一个<enable/> 命令给服务端。
例2:客户端启动Stream Management
C: <enable xmlns='urn:xmpp:sm:3’/>
如果客户端想被允许恢复流,必须包括一个boolean类型的“resume”属性,默认为false。恢复先前的一个会话(section),请参阅本文档的恢复部分。
<enable/>元素可以包含一个“max”属性,用来指定客户端最优的最大恢复时间,以秒为单位。
一旦受到启动请求,服务端必须回复一个<enabled/>元素,或者一个<failed/>,注明 ‘urn:xmpp:sm:3‘ 的命名空间namespace。<failed/>元素表示在建立stream management 会话(session)中存在一个问题。<enabled/>元素表示成功的建立了stream management 会话。
例3:服务端启动stream management
S: <enabled xmlns='urn:xmpp:sm:3’/>
然后可以使用stream management的特性定义下面的内容。
如果服务端允许会话恢复,服务端必须包括一个resume属性,值为”ture“或者”1“。
例4:服务端启动允许会话恢复的stream management
S: <enabled xmlns='urn:xmpp:sm:3' id='some-long-sm-id' resume='true’/>
<enabled/>元素可以包含一个”max“属性,用来指定服务端特定的最大恢复时间。
<enabled/>属性可以包含一个”location“属性,用来指定服务端的IP地址或者域名(端口可选)重新连接,见RFC6120的4.9.3.19部分(即,"domainpart:port", IPv6地址在方括号里[…],见RFC5952)。如果重连那个location失败了,标准的XMPP重连算法在RFC6120中有详细说明。
客户端不能尝试negotiate stream management,除非通过了身份验证;也就是说客户端不能发送一个<enabled/>元素直到完成了身份验证。(例如,SASL,Non-SASL Authentication (XEP-0078)或者 Server Dialback (XEP-0220)已经成功完成)。
例5:如果客户端试图在未绑定资源前启动stream management,服务端返回错误
S: <failed xmlns='urn:xmpp:sm:3'> <unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </failed>
未完待续。。。
XEP-0198 流管理(Stream Management)中文翻译