【XMPP】XMPP协议之原理篇
XMPP协议简介
- XMPP协议(Extensible Messaging and Presence Protocol,可扩展消息处理现场协议)是一种基于XML的协议。
- 目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。
- 它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。
- 并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。
- 利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。
XMPP协议特点
- 所有XMPP信息都是以XML为基础的,信息交换的事实标准,扩展性强
- XMPP系统是一个分布式系统,每台服务器控制自己的资源,但是如果需要,它能与外在的系统进行通信。XMPP服务器利用开放的XML协议来进行S2S(Serverto Server)通信,就像在C2S(Client to Server)一样。相比之下,大多数的IM系统使用了只是支持C2S/S2C通信的协议,因此Jabber/XMPP服务器具有更大的灵活性。
- XMPP协议是公开的,程序则开放源代码。定义了客户端和服务器端的交互要经由XML流。普通消息类型(message),如改变状态(presence),传递消息内容或查询/更新(info/quey)应用则用每个指定的命名空间(namespace)来建立。
- 状态(Presence)在整个持久连接中。通过持久连接的有效维持,XMPP协议一直有在网络中维持存在和可用信息的能力。
- XMPP允许建立并行的TCP套接字连接对所有连接上的客户端和服务器端。一旦建立连接,则只有当状态改变,例如存在的改变,通过这个连接传输数据。既然这个连接是持久的,那么设置、认证、状态查找功能都不用每次都重复执行。这种持久的套接字的连接使得XMPP能够更有效的支持高级的具有存在能力的应用在带宽和处理资源的使用中。
- Jabber/XMPP系统是模块化的,而且Jabber/XMPP的设计强调如何实现可伸缩性、安全性和可扩展性。
XMPP协议分析
XMPP中定义了三个角色:客户端,服务器,网关。
通信能够在这三者的任意两个之间双向发生。
- 服务器同时承担了客户端信息记录,连接管理和信息的路由功能。
- 网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。
- 基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。
服务器
服务系统是XMPP通信的智能提取层,它主要负责:
- 管理来自其他个体的会话连接或者XML流(streams)和来自客户端、服务器、其他个体的认证发送在XML流实体之中的适当的XML地址节点。
- 大多数XMPP服务都允许存储一些客户端数据(比如联系人列表),在这种情况下,服务直接面向这个客户端处理XML数据,而不是其他个体。
客户端
- 大多数客户端是通过TCP直接连接,并且使用XMPP获得服务器提供其应用功能和其他服务。
- 许多资源通过认证的客户端也许同时连接到服务器,定义在XMPP地址的每个资源是不同的
- (比如<node@domain/home>和<node@domain/work>)建议服务器和客户端采用的端中是5222。
网关
- 它的主要功能是将XMPP协议转换成外部消息(non-XMPP)系统使用的协议,也将返回的数据转换成XMPP。
- 这些通信是基于网关和服务器,基于网关和外部消息系统之间的。
XMPP消息格式
Jabber/XMPP系统使用XML流在不同实体之间相互传输数据。
在两个实体的连接期间,XML流将从一个实体传送到另一个实体。在实体间,有三个顶层的XML元素:<message/>,<presence/>和<iq/>。每一个都包含属性和子节点。
下面将分别描述这些元素。
消息(message)元素
- 一个即时消息系统最基本的功能就是能够在两个用户之间实时交换消息,<message/>元素就提供了这个功能。
- 每条消息都有一个或多个属性和子元素。
- 属性“from”和“to”分别表示了消息发送者和接收者的地址。
- <message/>也可以包含一个“type”属性,这给接收者一个提示,这个消息是什么样的消息。
- <message/>中也可以包含“id”属性,用来唯一的标识一个输出消息的响应。
状态(presence)元素
- <presence/>元素用来传递一个用户的存在状态的感知信息。
- 用户可以是“available”,要么是“unavailable”,“Hide”等。
- 当用户连接到即时消息服务器后,好友发给他的消息就立即被传递。
- 如果用户没有连接到服务器,好友发给他的消息将被服务器存储起来直到用户连接到服务器。
- 用户通过即时消息客户端自己控制可用性。但是,如果用户断开了同服务器的连接,服务器将发送给订阅了这个用户的存在信息的用户通知他们用户已经不可用。
- <presence/>还包含了两个子元素:<show/>和<status/>。<status>包含了一个对<show/>的文本描述。
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取得联系,这一步包含了鉴权,登录等等。
第二步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>
以文档的观点来看
- 客户端或服务器发送的所有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流:
【XMPP】XMPP协议之原理篇的更多相关文章
- 架构-虚拟路由器冗余协议【原理篇】VRRP详解
转自:http://zhaoyuqiang.blog.51cto.com/6328846/1166840/ 为什么要使用VRRP技术 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前常用的 ...
- (转)虚拟路由器冗余协议【原理篇】VRRP详解
原文:http://blog.51cto.com/zhaoyuqiang/1166840 为什么要使用VRRP技术 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前常用的指定路由方法有两种 ...
- XMPP协议实现原理介绍
本文介绍XMPP协议原理及相关信息. XMPP协议简介 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...
- XMPP协议实现原理介绍(转)
XMPP协议简介 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messagi ...
- 【如何快速的开发一个完整的iOS直播app】(原理篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...
- iOS:app直播---原理篇
[如何快速的开发一个完整的iOS直播app](原理篇) 转载自简书@袁峥Seemygo:http://www.jianshu.com/p/7b2f1df74420 一.个人见解(直播难与易) 直播 ...
- 如何快速的开发一个完整的iOS直播app(原理篇)
目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的iOS直播app](采集篇) 前言 大半年没写博客了,但 ...
- TCP协议设计原理
TCP协议设计原理 最近去了解TCP协议,发现这是一个特别值得深思的协议.在本篇博客中,不会长篇大论的给大家介绍TCP协议特点.包头格式以及TCP的连接和断开等基本原理,而是会带大家深入理解为什么要这 ...
- 分布式一致性协议Raft原理与实例
分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...
随机推荐
- 树莓派(Raspbian系统)中使用pyinstaller封装Python代码为可执行程序
一.前言 将做好的Python软件运行在树莓派上时,不想公开源码,就需要对文件进行封装(或称打包),本文主要介绍使用pyinstaller封装Python代码为可执行程序. Python是一个脚本语言 ...
- H5即时通讯Websocket
/** * Created by admin on 2017/8/19. */ // import Vue from 'vue' // import axios from './HTTP.js' // ...
- 移动端html页面分享
开发APP应用比开发移动端网页挑战小,因为APP应用只需要适配不同手机即可,而移动端网页不仅需要适配不同手机,还要适配同一部手机的不同浏览器. 移动端页面分享是一个常用的功能,需要宿主环境,可以是某A ...
- 潭州课堂25班:Ph201805201 WEB 之 JS 第四课 (课堂笔记)
JS 引入方式 在 HTML 中写入 写在 的标签里 <script> </script>推荐 放在 </body> 结束之前 <!DOCTYPE html& ...
- 429. N叉树的层序遍历
429. N叉树的层序遍历 题意 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 解题思路 和二叉树的层次遍历的思想一样: 实现 class Solution(object) ...
- springboot中velocity tool中注入bean
在使用springboo的时候,遇到一个问题,想在tool类中注入一个bean,一直失败,翻了下源码,是因为工具类的初始化方法为反射class调用newInstance方法,详见 http://www ...
- mui 总结
出框框 js内容 mui(".mui-popover").popover('toggle'); 点击“弹出框框”就会弹出这个有class="mui-pop ...
- iOS 10.3下使用Fiddler抓取HTTPS请求
最近使用Fiddler抓取手机上的HTTPS请求时,遇到一个问题.设置完之后,访问HTTPS的页面,却得到一个错误 网络出错,轻触屏幕重新加载:-1202 (如下图所示) 我印象中,之前都好好的, ...
- Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航
一.问题描述 在Android典型界面设计一文中,实现典型滑动导航界面,其实使用ActionBar 也可以轻松实现这一效果,甚至也可实现类似Android典型界面设计(3)的双导航效果.可见Actio ...
- 回顾2018年最受欢迎的十四款NoSQL产品
虽然NoSQL的流行与火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动.尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟.稳定.不过现在也面临着一个严酷的事实:技术越 ...