XMPP协议设计中引入了一个抽象的资源绑定过程,何为资源,如何绑定?
首先这得从JID的格式设计说起,JID是XMPP前身Jabber协议ID的简写,用于唯一标识一个客户身份。一个合法的 JID 包括一组排列好的元素,包括域名(domain identifier),节点名(node identifier),和资源名(resource identifier),如下:
jid = [ node "@" ] domain [ "/" resource ] ,所有 JID 都是基于上述的结构,类似 <user@host/resource> 这种结构。
node:是对用户的抽象,既可以代表一个真实的用户,也能表示一个虚拟用户如一个聊天室等。
domain:表达了客户所连接的服务器,在实践中通常表示一个特定的集群,由同一domain来表示。
resource:它通常表示一个特定的会话,连接。对于服务器和和其他客户端来说,资源名是不透明的。
资源名的获得需要经历一个资源绑定的过程,这个过程按照XMPP协议约定是在SASL握手完成后,由客户端重新发起初始化流请求后。
服务器向客户端声明资源绑定特性,过程如下:
<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'/> </stream:features>
<iq type='set' id='bind_2'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <resource>pc-win-someone</resource> </bind> </iq>
<iq type='result' id='bind_2'> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <jid>[email protected]/pc-win-someone-server-gen-random-string</jid> </bind> </iq>
以上过程即完成了资源绑定,那么资源绑定有什么作用呢,注意查看协议xml中客户端端请求绑定资源名为pc-win-someone,通常实现中可考虑用客户端的平台相关标识,例如 pc-win标示pc下的windows平台等,标识连接客户端的平台和自身名称,但XMPP协议约定resource由服务端按照每客户端生成随机值,用于唯一标识一个客户端一次连接会话。因此服务端的实现在客户端请求资源名后添加了随机生成的唯一后缀,用于区分不同的客户端连接。
那么如此设计的目的何在?
主要考虑方便同账号用户的多点登陆(手机、pad、pc端等多点同时在线),通过resource区分同一用户的不同接入点,由node+domain+resource组成唯一的用户在线标识。
通过用户ID形成一对多的用户接入映射,方便获得同一账号的多个接入信息,可灵活的设计多点登陆时用户的自选策略(是否踢下其他登陆、或选择最近登陆接收消息等)。