两个基本概念,使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换:XML流和XML节。这些术语的定义以下。 数据库
有三种节: message, presence, 和 IQ ("Info/Query"的缩写). 这些节类型提供三种不一样的通信原语: 一个 "推送" 机制用于已生成的消息, 一个特定的 "发行-订阅" 机制用于广播网络可用性信息, 和一个 "请求-应答" 机制用于更结构化的数据交换 (相似 HTTP . 更多解释分别位于 8.2.1 , 8.2.2 , 和 8.2.3 . 服务器
从本质上讲, 一个XML流做为会话期间发送的XML节的信封, 而另外一个XML流做为会话期间接收的XML节的信封. 咱们能够用以下的简化模型作一个展现.网络
+--------------------+--------------------+ | INITIAL STREAM | RESPONSE STREAM | +--------------------+--------------------+ | <stream> | | |--------------------|--------------------| | | <stream> | |--------------------|--------------------| | <presence> | | | <show/> | | | </presence> | | |--------------------|--------------------| | <message to='foo'> | | | <body/> | | | </message> | | |--------------------|--------------------| | <iq to='bar' | | | type='get'> | | | <query/> | | | </iq> | | |--------------------|--------------------| | | <iq from='bar' | | | type='result'> | | | <query/> | | | </iq> | |--------------------|--------------------| | [ ... ] | | |--------------------|--------------------| | | [ ... ] | |--------------------|--------------------| | </stream> | | |--------------------|--------------------| | | </stream> | +--------------------+--------------------+
+----------+--------------------------+-------------------------+ | | 初始实体 到 接收实体 | 接收实体 到 初始实体 | +----------+--------------------------+-------------------------+ | to | 接收实体JID | 初始实体JID | | from | 初始实体JID | 接收实体JID | | id | 忽 略 | 流标识 | | xml:lang | 默认语言 | 默认语言 | | version | XMPP 1.0+ supported | XMPP 1.0+ supported | +----------+--------------------------+-------------------------+
C: <?xml version='1.0'?> <stream:stream from='juliet@im.example.com' to='im.example.com' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'> S: <?xml version='1.0'?> <stream:stream from='im.example.com' id='++TR84Sm6A3hnt3Q065SnAbbk3Y=' to='juliet@im.example.com' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'> [ ... stream negotiation ... ] C: <message from='juliet@im.example.com/balcony' to='romeo@example.net' xml:lang='en'> <body>Art thou not Romeo, and a Montague?</body> </message> S: <message from='romeo@example.net/orchard' to='juliet@im.example.com/balcony' xml:lang='en'> <body>Neither, fair saint, if either thee dislike.</body> </message> C: </stream:stream> S: </stream:stream>
<message/>节是一个"推送"机制,这里一个实体推送信息到另外一个实体, 相似发生在email系统里的通信同样. 全部消息节将拥有'to'属性用来指定该消息指望的接收者 (见8.1.1和10.3), 除非消息是被一个已链接的客户端账号的纯JID发送的. 接收到一个带有'to'地址的消息节以后, 服务器应该尝试路由或递送它到指望的接收者那里(见第十章里和XML节相关的通用路由和递送规则). 异步
<presence/>节是一个特定的"广播"或"发布-订阅"机制, 这里多个实体接收关于他们订阅的一个实体的信息(在这个案例中, 是网络可用性信息). 一般, 发布客户端应该发送一个不带有'to'属性的联机状态节, 这种状况下该客户端链接的那个服务器将广播那个节给全部已订阅的实体. 然而, 发布客户端也能够发送一个带有'to'属性的联机状态节, 这种状况下该服务器将路由或递送那个节到指望的接收者. 尽管<presence/>节大部分状况下是由XMPP客户端使用, 它也可能被服务器, 附加服务, 以及任何其余类型呃XMPP实体使用. 参见第十章中和XML节相关的通用路由和递送规则, 以及XMPP‑IM中联机状态应用的特定规则. 学习
信息查询(Info/Query),或IQ, 是一个"请求-应答"机制, 相似某些状况下的超文本传输协议HTTP. IQ的语义容许一个实体对另外一个实体作出一个请求, 并接收一个应答. 这个请求和应答的数据内容由schema或其余限定IQ元素的直接子元素的XML命名空间相关的结构化定义(见8.4)来限定, 发出请求的实体使用'id'属性来跟踪交互过程. 因此, IQ交互沿用告终构化数据交换的常见模式,相似 get/result 或 set/result (尽管适当的时候对于某个请求会返回一个error):加密
请求实体 应答实体 ---------- ---------- | | | <iq id='1' type='get'> | | [ ... payload ... ] | | </iq> | | -------------------------> | | | | <iq id='1' type='result'> | | [ ... payload ... ] | | </iq> | | <------------------------- | | | | <iq id='2' type='set'> | | [ ... payload ... ] | | </iq> | | -------------------------> | | | | <iq id='2' type='error'> | | [ ... condition ... ] | | </iq> | | <------------------------- | | |
jabber:iq:private -- 私有数据存储,用于本地用户私人设置信息,好比用户备注等。
jabber:iq:conference -- 通常会议,用于多个用户之间的信息共享
jabber:x:encrypted -- 加密的消息,用于发送加密消息
jabber:x:expire -- 消息终止
jabber:iq:time -- 客户端时间
jabber:iq:auth -- 简单用户认证,通常用于服务器之间或者服务器和客户端之间的认证
jabber:x:roster -- 内部花名册
jabber:x:signed -- 标记的在线状态
jabber:iq:search -- 用户数据库查询,用于向服务器发送查询请求
jabber:iq:register -- 注册请求,用于用户注册相关信息
jabber:x:iq:roster -- 花名册管理
jabber:x:conference -- 会议邀请,用于向参加会议用户发送开会通知
jabber:x:event -- 消息事件
vcard-temp -- 临时的vCard,用于设置用户的头像以及昵称等spa
这是从XMPP学习——二、登录的例子 截取的协议传输过程图。.net
以上内容均参考自wiki百科:xmpp中文翻译计划翻译