可扩展消息的和出席信息协议(XMPP)主要采用XML流实现在任意两个网络终端接近实时的交换结构化信息,XMPP提供一个通用的可扩展的框架来交换XML数据,用于准实时消息和出席信息以及请求-响应服务。
XMPP没有指定任何特定的网络结构,但它通常是采用客户-服务器架构进行实现,其中客户端通过TCP方式使用XMPP访问服务器,服务器之间也采用TCP方式进行通信。
1.同一域名服务器和客户端组成的简单XMPP架构
具有惟一名称的客户机通过相关的服务器与另外一个具有惟一名称的客户机进行通信,每个客户机执行客户机的协议表单,而服务器在表单中提供路由功能
2.包含网关的复杂XMPP架构
针对不同域(XMPP域,短信服务(SMS)域和一个 SMTP 域)之间,网关可以把 XMPP 翻译成外部(非XMPP)消息系统,并把返回的消息翻译成 XMPP 。作为一个可扩展的协议,XMPP 对于在不同的端点协议间提供统一连接性来说是一个理想的中枢协议。XMPP 网关允许终止一个给定的客户端到服务器的会话,并且向目标端点协议发起一个新的会话(同时进行必要的协议转换)。
一个XMPP实体的地址被称为JID,一个合法的JID包含可选节点,域名,可选资源名,一个JID作为网络通讯ID,其具有唯一性
XMPPJID *jid = [ node "@" ] domain [ "/" resource ];
一个 JID 的每个合法部分(节点名,域名,资源名)的长度不能(MUST NOT)超过 1023 字节。也就是整体长度(包括 '@' 和 '/' )不能超过 3071 字节
域名:主要ID,一个域名标识引用的实体,并非总是一个服务器,它也可能是一个服务器的子域地址
可选节点:第二ID,通常表示一个向服务器或网关请求和使用网络服务的实体(比如一个客户端),当然它也能够表示其他的实体(比如在多用户聊天系统中的一个房间)
可选资源:通常表示一个特定的会话,连接(比如设备或者所在位置),或者一个附属于某个节点ID实体相关实体的对象(比如多用户聊天室中的一个参加者),也称第三ID
XML流和XML节使得实体之间异步交换低负载的结构化信息成为可能
一个XML流是一个容器,包含了两个实体之间通过网络交换的XML元素。一个XML流是由一个XML打开标签 <stream> (包含适当的属性和名字空间声明)开始的,流的结尾则是一个XML关闭L标签 </stream> 。在流的整个生命周期,初始化它的实体可以通过流发送大量的XML元素,用于流的握手(TLS握手或SASL握手)或XML节(此处主要指符合缺省名字空间的元素,包括<message/>,<presence/>, 或 <iq/> 元素)
“初始的流”由初始化实体(通常是一个客户端或服务器)和接收实体(通常是一个服务器)握手,从接收实体来看,它就是那个初始实体的"会话".初始化流允许从初始化实体到接收实体的单向通信;为了使接收实体能够和初始实体交换信息,接收实体必须发起一个反向的握手(应答流).
一个XML节是一个实体通过 XML 流向另一个实体发送的结构化信息中的一个离散的语义单位。任何XML节都是从一个XML流的下一级的某个打开标签(如 <presence>)开始,到相应的关闭标签(如 </presence>)(此处XML节仅限于<message/>, <presence/>, 和 <iq/> 元素)
1.客户端发送一个打开标签<Stream>给服务器,初始化流(也可在此之前发送一段文本声明XML版本和支持的字符集)
2.服务器回复一个XML流给客户端(也可在此之前发送一段文本声明)
3.客户端完成SASL握手
4.客户端发送关闭标签</stream>给服务器(或服务器发送给客户端)
5.客户端与服务器彻底终结这个连接(通常为一个TCP连接)
使用 XMPP 的实时消息传递系统包含三大通信类别:
<stream> <presence> <show/> </presence> <message> <body/> </message> <iq> <query/> </iq> </stream>
虽然有很多非必需的连接使用XML流来绑定[TCP]连接(两个实体可以通过别的机制来互联,比如通过[HTTP]连接轮询),在客户和服务器通信的过程中,服务器必须允许客户端共享一个TCP连接来传输XML节,包括从客户端传到服务器和从服务器传到客户端。在服务器之间的通信过程中,服务器必须用一个 TCP连接 向对方发送 XML节,另一个 TCP连接(由对方初始化)接收对方的XML节,一共两个 TCP连接。
当XML流开始握手时,尽管可能存在某种共有的机制能够保证双向安全,但是“初始化流”(比如从初始化实体发给接收实体的流)和“应答流”(比如从接收实体发给初始化实体的流)还是必须安全的分开。在流被验证之间,实体不应该尝试通过流发送XML节;就算它这样做了,对方的实体也不能接受这些XML节,并且应该返回一个 <not-authorized/> 的流错误信息并且终止当前TCP连接上双方的XML流;注意,这仅仅是针对XML节(包含在缺省命名空间中的 <message/>, <presence/>, 和 <iq/> 元素),而不是指那些用于 TLS握手、SASL握手握手的流。
流的根元素可以(MAY)包含一个 <error/> 子元素,由流的名字空间前缀作为它的前缀
<stream:error> <defined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/> [optional text] <text xmlns='urn:ietf:params:xml:ns:xmpp-streams' xml:lang='langcode'> descriptive text </text> </stream:error>
http://www.ibm.com/developerworks/cn/xml/x-xmppintro/index.html
http://www.ibm.com/developerworks/cn/xml/tutorials/x-realtimeXMPPtut/index.html