XMPP协议简介node
XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通讯标准而提出来的,最先是在Jabber上实现的。它继承了在XML环境中灵活的发展性。所以,基于XMPP的应用具备超强的可扩展性。而且XML很易穿过防火墙,因此用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP做为通用的传输机制,不一样组织内的不一样应用均可以进行有效的通讯。安全
XMPP协议特色服务器
1)全部XMPP信息都是以XML为基础的,信息交换的事实标准,扩展性强网络
2)XMPP系统是一个分布式系统,每台服务器控制本身的资源,可是若是须要,它能与外在的系统进行通讯。XMPP服务器利用开放的XML协议来进行S2S(Serverto Server)通讯,就像在C2S(Client to Server)同样。相比之下,大多数的IM系统使用了只是支持C2S/S2C通讯的协议,所以Jabber/XMPP服务器具备更大的灵活性。dom
3)XMPP协议是公开的,程序则开放源代码。定义了客户端和服务器端的交互要经由XML流。普通消息类型(message),如改变状态(presence),传递消息内容或查询/更新(info/quey)应用则用每一个指定的命名空间(namespace)来创建。分布式
4)状态(Presence)在整个持久链接中。经过持久链接的有效维持,XMPP协议一直有在网络中维持存在和可用信息的能力。ide
5)XMPP容许创建并行的TCP套接字链接对全部链接上的客户端和服务器端。一旦创建链接,则只有当状态改变,例如存在的改变,经过这个链接传输数据。既然这个链接是持久的,那么设置、认证、状态查找功能都不用每次都重复执行。这种持久的套接字的链接使得XMPP可以更有效的支持高级的具备存在能力的应用在带宽和处理资源的使用中。模块化
6)Jabber/XMPP系统是模块化的,并且Jabber/XMPP的设计强调如何实现可伸缩性、安全性和可扩展性。spa
XMPP协议分析开放源代码
XMPP中定义了三个角色:客户端,服务器,网关。
通讯可以在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,链接管理和信息的路由功能。网关承担着与异构即时通讯系统的互联互通,异构系统能够包括SMS
(短信),MSN,ICQ等。基本的网络形式是单客户端经过TCP/IP链接到单服务器,而后在之上传输XML。
XMPP的基本网络结构以下:
C1----S1---S2---C3
|
C2----+--G1===FN1===FC1
符号表示:C1,C2,C3=XMPP客户端;S1,S2=XMPP;服务端G1=在XMPP和使用外部消息网络(非XMPP)的协议之间转换的网;FN1=外部消息网络;FC1=外部消息网络的客户端。
(1)服务器
服务系统是XMPP通讯的智能提取层,它主要负责:管理来自其余个体的会话链接或者XML流(streams)和来自客户端、服务器、其余个体的认证发送在XML流实体之中的适当的XML地址节点。大多数XMPP服务都容许存储一些客户端数据(好比联系人列表),在这种状况下,服务直接面向这个客户端处理XML数据,而不是其余个体。
(2)客户端
大多数客户端是经过TCP直接链接,而且使用XMPP得到服务器提供所有-12-第2章Jabber协议原理及其应用功能和其余服务。许多资源经过认证的客户端也许同时链接到服务器,定义在XMPP地址的每一个资源是不一样的(好比<node@domain/home>和<node@domain/work>)建议服务器和客户端采用的端中是5222。
(3)网关
它的主要功能是将XMPP协议转换成外部消息(non-XMPP)系统使用的协议,也将返回的数据转换成XMPP。这些通讯是基于网关和服务器,基于网关和外部消息系统之间的。
XMPP消息格式
Jabber/XMPP系统使用XML流在不一样实体之间相互传输数据。在两个实体的链接期间,XML流将从一个实体传送到另外一个实体。在实体间,有三个顶层的XML元素:<message/>,<presence/>和<iq/>。每个都包含属性和子节点。下面将分别描述这些元素。
1)消息(message)元素:
一个即时消息系统最基本的功能就是可以在两个用户之间实时交换消息,<message/>元素就提供了这个功能。每条消息都有一个或多个属性和子元素。属性“from”和“to”分别表示了消息发送者和接收者的地址。<message/>也能够包含一个“type”属性,这给接收者一个提示,这个消息是什么样的消息。表3-1给出了“type”属性的可能取值。<message/>中也能够包含“id”属性,用来惟一的标识一个输出消息的响应。
2)状态(presence)元素:
<presence/>元素用来传递一个用户的存在状态的感知信息。用户能够是“available”,要么是“unavailable”,“Hide”等。当用户链接到即时消息服务器后,好友发给他的消息就当即被传递。若是用户没有链接到服务器,好友发给他的消息将被服务器存储起来直到用户链接到服务器。用户经过即时消息客户端本身控制可用性。可是,若是用户断开了同服务器的链接,服务器将发送给订阅了这个用户的存在信息的用户通知他们用户已经不可用。<presence/>还包含了两个子元素:<show/>和<status/>。<status>包含了一个对<show/>的文本描述。
3)IQ(Info<Query)元素
IQ元素是Jabber/XMPP消息协议的第三个顶层元素。IQ表明"Info/Query",用来发送和获取实体之间的信息。IQ消息是经过“请求/响应”机制在实体间进行交换的。IQ元素用于不一样的目的,它们之间经过不一样的命名空间来加以区分。在Jabber/XMPP消息协议里有许多的命名空间,但最经常使用的命名空间是:"jabber:iq:register","jabber:iq:auth","jabber:iq:roster"。
上面描述了Jabber协议的三个顶层节点。经过这种格式Jabber消息不只能够是简单的文本(text),并且能够携带复杂的数据和各类格式的文件,也就是说Jabber不只能够用在人与人之间的交流,并且能够实现软件与软件或软件与人之间的交流。Jabber的这种功能大大扩展了即时通讯的应用范围。
XMPP工做机制
例如:一个终端名字是Remeo,经过服务器montague.lit与其余的用户相连,其余的用户
经过服务器juliet@capulet.lit创建链接。
第一步Romeo开始经过发送一个stream包与服务器montague.lit取得联系,这一步包含了鉴权,登陆等等。
<iq type=‘get’from=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’/>
</iq>
第二步Romeo获取了他的联系人列表,经过向服务器montague.lit发送<iq/>字段请求,按照下面的协议。
<iq type=‘result’to=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’>
<item jid=‘juliet@capulet.lit’/><item jid=‘mercutio@shakespeare.lit’/>
<item jid=‘benvolio@shakespeare.lit’/>
</query>
</iq>
第三步Romeo发送了一个presence请求到服务器montague.lit,而后会将这个信息广播到他的全部好友。
<presence from=‘romeo@montague.lit/pda’/>
<presence from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’/>
<presence from=‘romeo@montague.lit/pda’to=‘mercutio@shakespeare.lit’
/>
<presence from=‘romeo@montague.lit/pda’to=‘benvolio@shakespeare.lit’
/>
第四步若是Romeo的联系人都在线,就会将presence回复给Romeo,告知本身的状态。
<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/balcony’/>
<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/chamber’/>
<presence to=‘romeo@montague.lit/pda’from=‘mercutio@shakespeare.lit/home’/>
第五步Romeo和Juliet开始交换信息,进行聊天。
<message from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’>
<body>hi!</body>
</message>
<message from=‘juliet@capulet.lit/balcony’to=‘romeo@montague.lit/pda’
>
<body>hi yourself!</body>
</message>
以文档的观点来看,客户端或服务器发送的全部XML文本连缀在一块儿,从<stream>到</stream>构成了一个完整的XML文档。其中的stream标签就是所谓的XML Stream。在<stream>与</stream>中间的那些<message>...</message>这样的XML元素就是所谓的XML Stanza(XML节)。XMPP核心协议通讯的基本模式就是先创建一个stream,而后协商一堆安全之类的东西,中间通讯过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。可是这个过程并非一问一答的,任什么时候候都有可能从一个方发信给另一方。通讯的最后阶段是</stream>关闭流,关闭TCP/IP链接。
XML流: