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>
服务端响应资源绑定请求,并返回绑定后的Full JID名
<iq type='result' id='bind_2'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
<jid>somenode@example.com/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形成一对多的用户接入映射,方便获得同一账号的多个接入信息,可灵活的设计多点登陆时用户的自选策略(是否踢下其他登陆、或选择最近登陆接收消息等)。
分享到:
相关推荐
Messaging and Presence Protocol (XMPP) that provide basic instant messaging (IM) and presence functionality in conformance with the requirements in RFC 2779. This document obsoletes RFC 3921.
XMPP Prebind for PHP后端此类专为PHP后端设计,用于将XMPP会话与XMPP服务器(如Openfire(已测试),eJabberd等)预先绑定。 换句话说,如果您想使用像这样的前端XMPP客户端并利用PHP的(又名 )优势,那么您来对...
xmpp-ftw angular conversejs 克隆这个应用程序用户angluar-xmpp-services。 UI 是从 conversejs 中窃取的。 这是alpha软件
iris:XMPP网络库
基于XMPP协议的类似QQ的即时通信demo 简单实现了 注册,登录,添加好友,删除好友,好友的通信 包括发文本,图片和声音。
乳液:XMPP:left-right_arrow:电报桥
XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。 简介:XMPP是一种基于XML的协议,它继承...
Psi是为经验丰富的用户设计的功能强大的XMPP客户端。 它具有高度的可移植性,可以在GNU / Linux,MS Windows,macOS,FreeBSD和Haiku上运行。 程序的用户界面在定制方面非常灵活。 例如,有“多个窗口”和“所有...
开源xmpp im客户端
XMPP体系架构 XMPP server:其内核是一个XMPP路由器,完成基本组件间的数据包交换和路由。 功能: 1.会话管理器:负责客户端会话认证,在线状态,用户联系表等 2.数据存储器(XDB):连接数据库系统,保持用户信息、...
vacuum-im:跨平台XMPP客户端
XMPP组件“绑定”到一个域,通常是主要XMPP服务的子域,例如pubsub.example.org或Conference.example.org。 所有来电节给该域(以=“service.example.org”),或在该域的实体(以=“ ”)将被路由到您的基于xmpp.js...
XmppStone 轻量级XMPP客户端库完全用Dart编写。 我的意图是为基于Flutter的未来XMPP客户端编写易于使用的库。 支持的文件: RFC6120 :可扩展消息和状态协议(XMPP):核心RFC6121 :可扩展消息和状态协议(XMPP):...
XMPP模糊器 XMPP-FUZZER 是 XMPP 的模糊测试工具。 它建立在 Smack 库之上。 可惜目前只支持中文。 它最初发布在 code.google.com/p/xmpp-fuzzer 上。 共同开发者:姜峰和( ) 2009年开发。
ruby_bosh:XMPP BOSH会话预初始化器,用于Ruby Web应用程序
基于XMPP的企业即时通讯IM源代码,delphi开发,包括所有资源文档
本课程使用asmack、openfire等开源...并且自己用openfire搭建服务端,通过本课程的学习,学员完全可以自己搭建和编写一个完全属于自己的IM聊天系统。在局域网和Internet都可以,只要自己有一个可访问的服务器即可。
XMPP联合会 “授权用于给定域的流量的方法如何信任连接。” 该方法有两个方面: 确定信任(证明类型) 代表团 校样 有多种方法可以验证与(TLS)连接关联的域: DANE < > 使用HTTPS和PKIX的POSH(在此定义)...
Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码
StropheCappuccino是用于绑定纯Javascript Strophe库的一组类。 这允许在Cappuccino Web应用程序中使用实时XMPP。 该库由Archipel Project使用。 该库是根据LGPL许可发布的。 随意使用或改进它。建造要构建...