XMPP协议简介

  1. XMPP协议(Extensible Messaging and Presence Protocol,可扩展消息处理现场协议)是一种基于XML的协议。
  2. 目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。
  3. 它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。  
  4. 并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。
  5. 利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。

XMPP协议特点

  1. 所有XMPP信息都是以XML为基础的,信息交换的事实标准,扩展性强
  2. XMPP系统是一个分布式系统,每台服务器控制自己的资源,但是如果需要,它能与外在的系统进行通信。XMPP服务器利用开放的XML协议来进行S2S(Serverto Server)通信,就像在C2S(Client to Server)一样。相比之下,大多数的IM系统使用了只是支持C2S/S2C通信的协议,因此Jabber/XMPP服务器具有更大的灵活性。
  3. XMPP协议是公开的,程序则开放源代码。定义了客户端和服务器端的交互要经由XML流。普通消息类型(message),如改变状态(presence),传递消息内容或查询/更新(info/quey)应用则用每个指定的命名空间(namespace)来建立。
  4. 状态(Presence)在整个持久连接中。通过持久连接的有效维持,XMPP协议一直有在网络中维持存在和可用信息的能力。
  5. XMPP允许建立并行的TCP套接字连接对所有连接上的客户端和服务器端。一旦建立连接,则只有当状态改变,例如存在的改变,通过这个连接传输数据。既然这个连接是持久的,那么设置、认证、状态查找功能都不用每次都重复执行。这种持久的套接字的连接使得XMPP能够更有效的支持高级的具有存在能力的应用在带宽和处理资源的使用中。
  6. Jabber/XMPP系统是模块化的,而且Jabber/XMPP的设计强调如何实现可伸缩性、安全性和可扩展性。

XMPP协议分析

  XMPP中定义了三个角色:客户端,服务器,网关

  通信能够在这三者的任意两个之间双向发生。

  1. 服务器同时承担了客户端信息记录,连接管理和信息的路由功能。
  2. 网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。
  3. 基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。

服务器

  服务系统是XMPP通信的智能提取层,它主要负责

  1. 管理来自其他个体的会话连接或者XML流(streams)和来自客户端、服务器、其他个体的认证发送在XML流实体之中的适当的XML地址节点。
  2. 大多数XMPP服务都允许存储一些客户端数据(比如联系人列表),在这种情况下,服务直接面向这个客户端处理XML数据,而不是其他个体。

客户端

  1. 大多数客户端是通过TCP直接连接,并且使用XMPP获得服务器提供其应用功能和其他服务。
  2. 许多资源通过认证的客户端也许同时连接到服务器,定义在XMPP地址的每个资源是不同的
  3. (比如<node@domain/home>和<node@domain/work>)建议服务器和客户端采用的端中是5222。

网关

  1. 它的主要功能是将XMPP协议转换成外部消息(non-XMPP)系统使用的协议,也将返回的数据转换成XMPP。
  2. 这些通信是基于网关和服务器,基于网关和外部消息系统之间的。

XMPP消息格式

  Jabber/XMPP系统使用XML流在不同实体之间相互传输数据。

  在两个实体的连接期间,XML流将从一个实体传送到另一个实体。在实体间,有三个顶层的XML元素:<message/>,<presence/>和<iq/>。每一个都包含属性和子节点。

  下面将分别描述这些元素。

消息(message)元素

  1. 一个即时消息系统最基本的功能就是能够在两个用户之间实时交换消息,<message/>元素就提供了这个功能。
  2. 每条消息都有一个或多个属性和子元素。
  3. 属性“from”和“to”分别表示了消息发送者和接收者的地址。
  4. <message/>也可以包含一个“type”属性,这给接收者一个提示,这个消息是什么样的消息。
  5. <message/>中也可以包含“id”属性,用来唯一的标识一个输出消息的响应。

状态(presence)元素

  1. <presence/>元素用来传递一个用户的存在状态的感知信息。
  2. 用户可以是“available”,要么是“unavailable”,“Hide”等。
  3. 当用户连接到即时消息服务器后,好友发给他的消息就立即被传递。
  4. 如果用户没有连接到服务器,好友发给他的消息将被服务器存储起来直到用户连接到服务器。
  5. 用户通过即时消息客户端自己控制可用性。但是,如果用户断开了同服务器的连接,服务器将发送给订阅了这个用户的存在信息的用户通知他们用户已经不可用。
  6. <presence/>还包含了两个子元素:<show/>和<status/>。<status>包含了一个对<show/>的文本描述。

IQ(Info<Query)元素

  1. IQ元素是Jabber/XMPP消息协议的第三个顶层元素。
  2. IQ代表"Info/Query",用来发送和获取实体之间的信息。
  3. IQ消息是通过“请求/响应”机制在实体间进行交换的。
  4. IQ元素用于不同的目的,它们之间通过不同的命名空间来加以区分。
  5. 在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取得联系,这一步包含了鉴权,登录等等。

  第二步Romeo获取了他的联系人列表,通过向服务器montague.lit发送<iq/>字段请求,按照下面的协议。

<iq type=‘get’from=‘romeo@montague.lit/pda’>
<query xmlns=‘jabber:iq:roster’/>
</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>

  以文档的观点来看

  1. 客户端或服务器发送的所有XML文本连缀在一起,从<stream>到</stream>构成了一个完整的XML文档。
  2. 其中的stream标签就是所谓的XML Stream。
  3. 在<stream>与</stream>中间的那些<message>...</message>这样的XML元素就是所谓的XML Stanza(XML节)。
  4. XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。
  5. 服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。
  6. 但是这个过程并不是一问一答的,任何时候都有可能从一个方发信给另外一方。
  7. 通信的最后阶段是</stream>关闭流,关闭TCP/IP连接。

  XML:

  

【XMPP】XMPP协议之原理篇的更多相关文章

  1. 架构-虚拟路由器冗余协议【原理篇】VRRP详解

    转自:http://zhaoyuqiang.blog.51cto.com/6328846/1166840/ 为什么要使用VRRP技术 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前常用的 ...

  2. (转)虚拟路由器冗余协议【原理篇】VRRP详解

    原文:http://blog.51cto.com/zhaoyuqiang/1166840 为什么要使用VRRP技术 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前常用的指定路由方法有两种 ...

  3. XMPP协议实现原理介绍

    本文介绍XMPP协议原理及相关信息. XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...

  4. XMPP协议实现原理介绍(转)

    XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messagi ...

  5. 【如何快速的开发一个完整的iOS直播app】(原理篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...

  6. iOS:app直播---原理篇

    [如何快速的开发一个完整的iOS直播app](原理篇) 转载自简书@袁峥Seemygo:http://www.jianshu.com/p/7b2f1df74420   一.个人见解(直播难与易) 直播 ...

  7. 如何快速的开发一个完整的iOS直播app(原理篇)

    目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的iOS直播app](采集篇) 前言 大半年没写博客了,但 ...

  8. TCP协议设计原理

    TCP协议设计原理 最近去了解TCP协议,发现这是一个特别值得深思的协议.在本篇博客中,不会长篇大论的给大家介绍TCP协议特点.包头格式以及TCP的连接和断开等基本原理,而是会带大家深入理解为什么要这 ...

  9. 分布式一致性协议Raft原理与实例

    分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...

随机推荐

  1. sharc dsp 学习记录1---2014-07-30

    从今天开始记录学习sharc dsp过程中的点点滴滴吧.   DPI:Digital Peripheral Interface DAI:Digital Audio Interface   SHARC ...

  2. 中间人攻击工具mitmf(另类的XSS注入攻击)

    中间人攻击工具mitmf(另类的XSS注入攻击) (一)简介 (二)安装 (三)结合beef使用 (一)简介 Mitmf 是一款用来进行中间人攻击的工具.它可以结合 beef 一起来使用,并利用 be ...

  3. RecylerView动画组件RecylerViewAnimators

    RecylerView动画组件RecylerViewAnimators   RecyclerView是比ListView和GridView更为强大的布局视图,可以用于展现大量的数据.RecylerVi ...

  4. 在Windows下食用Linux工作环境(WSL+cmder)

    在Windows下食用Linux工作环境(WSL+cmder) 为什么要这么瞎搞呢?因为最近换了个硬盘,搞了个双系统,然后习惯性地按下 Ctrl+Alt+T 发现什么都没有召唤出来,然后忽然想起换了系 ...

  5. c#textBox控件限制只允许输入数字及小数点

    在textboxd的事件中的 KeyPress 事件,这样双击进入代码:输入以下代码 即可 //判断按键是不是要输入的类型. || () && ( && () e.Ha ...

  6. BZOJ.2453.维护队列([模板]带修改莫队)

    题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是 ...

  7. 洛谷.4114.Qtree1(树链剖分)

    题目链接 模板题都错了这么多次.. //边权赋到点上 树剖模板 //注意LCA.链的顶端不能统计到答案! #include <cstdio> #include <cctype> ...

  8. 【NOIP2014模拟赛No.1】我要的幸福

    OJ题号:ZHOJ1297 思路:搜索. 先预处理注定不能走的路径,然后dfs可以走的路径. #pragma GCC optimize ("O2") #include<cst ...

  9. bzoj 2013 上升计数

    题意: 给一个数集和一个数d,问满足下列要求的排列数(相同的数要区分):  a[i]+d>=a[i+1] ( i in [1,n) ) 因为数的给出顺序不重要,所以先排序,假如我们已经解决了前i ...

  10. Javascript:自己写模板引擎

    背景 因为JS没有提供“字符串插入”和“多行字符串”特性,传统的拼凑字符串容易出错.性能不高和不容易理解代码,为了应对这些问题,很多个人和团队开发了模板引擎,现在主流的JS框架几乎都提供此类功能了. ...