Session Establishment
许多基于XMMP的IM都实现这么一个client-server构架:要求client来建立一个和server相关的的session用来处理预料中的即时通讯和出席状态。然而,这有很多前提条件:
1.流认证Stream Authentication
在尝试建立session和发送任何xml节之前,client必须完成流认证(Stream Authentication)
2.资源绑定Resource Binding
在完成流认证之后,client必须绑定资源到流上,so that the client's address is of the form <user@domain/resource>, after which the entity is now said to be a "connected resource" in the terminology of [XMPP‑CORE]
如果server支持session,他必须包含一个<session/>元素,这个元素是被'urn:ietf:params:xml:ns:xmpp-session'命名空间限制的。他向client宣告session建立
server向client告知session建立功能
<stream:stream
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
id='c2s_345'
from='example.com'
version='1.0'>
<stream:features>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
</stream:features>
在接到必须建立session的通知(完成资源绑定),如果client期望使用即时通讯和出席功能的话,它就必须建立session。
第一步:client向server请求session
<iq to='example.com'
type='set'
id='sess_1'>
<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
</iq>
第二步:server告知client,session已经被建立
<iq from='example.com'
type='result'
id='sess_1'/>
当建立session的时候,一个连接的资源被称之为活跃的资源。
可能会出现多种错误情况。例如,由于用户名或授权身份(authorization identity)没有创建session的许可,或者资源标识符已经有了一个活跃的资源连接, server就可能在创建session时遇到内部的错误。
第二步(alt):server返回错误(内部错误)
<iq from='example.com' type='error' id='sess_1'>
<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
<error type='wait'>
<internal-server-error
xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
如果用户或者资源不允许创建资源,server必须返回错误
<iq from='example.com' type='error' id='sess_1'>
<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
<error type='auth'>
<forbidden
xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
如果已经存在一个一个活跃的资源连接,server会有两种处理:1)终止连接,创建一个新的连接;2)驳回新连接创建请求,继续维护以前的活跃连接。这两种server都都要实现,但是建议实现第一种情况。
在第一种情况,server应该向活跃的资源连接发送<conflict/>流错误,并终结该活跃资源的XML流和潜在的TCP连接,同时向新请求的session返回一个类型为‘result’的IQ节以表示成功。
在第二种情况,server应该向新请求的连接发送<conflict/>流错误,同时维护以前连接的XML流,以便于新请求的连接有机会在另一个session请求建立发送过来前议定一个不冲突的资源标示符(non-conflicting resource identifier)。
情况一
<stream:error>
<conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
</stream:error>
</stream:stream>
情况二
<iq from='example.com' type='error' id='sess_1'>
<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
<error type='cancel'>
<conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>
在请求建立后,client应该发送初始的出席信息和请求花名册(roster),虽然这些都是可选的。
Note:在允许创建一个即时通讯和出席的session之前,server也许会要求事先帐户配置(prior account provisioning)。事先帐户配置(prior account provisioning)的方法包括server管理员创建帐户和用'jabber:iq:register'的帐户创建
分享到:
评论