Asmack开发系列之XMPP基础

简介:

今天,我们来说一下XMPP协议本身的一些东西。毕竟Asmack只是该协议的一个实现版本。所以,我们又必要了解XMPP协议本身。

1,架构

什么是架构,架构就是一系列实体如何组织、联系和交换信息。例如万维网,由成千上万的服务器,他们运行着Apache或者是新的Nginx,客户端由web浏览器,如IE,firefox和Chrome。他们之间交换的数据是HTML,他们之间交换数据的协议是HTTP。

类似的,对于即时通信,也有自己的架构。它的服务器端一般跑着像Openfire和ejabberd这样服务器软件,客户端一般有像Adium,Gajim,Pidgin等。XMPP是协议,但为了描述方便,我也会那它当做是我们整个这类软件,架构的代名词。xmpp是decentralized client-server architecture,去中心化的客户端-服务器架构。怎么理解?就是它有服务器,不是纯种的peer-to-peer那种架构,这样管理方便,更可靠。但它的服务器不是一个,不是单点,而是散耦合的,这样就鲁棒。这也就得支持服务器到服务器的通信。


但是,xmpp和www是有区别的,万维网的服务器是不会为你转发信息的,它很少支持域间通信。这么说吧,加入你访问的了迅雷的一个网页,但是这个网页有一个URL图片是指向优酷的,这个时候你的Chrome访问迅雷后,还得它自己去访问优酷来下载这个图片,迅雷是不会为你下的然后传给你。万维网的示意如下:


在服务器传递消息这方面,我们需要再说一下邮件系统,如下图所示。邮件系统是多步转发的。假如你用QQ邮箱给我的工作邮箱zengjinlong@xunlei.com发送一个邮件,首先你的邮箱客户端会把你的邮件上传到QQ邮箱,QQ邮箱就检索,看是不是能够直接投递给迅雷邮箱服务器,假如哈,假如没检索到,于是腾讯就把邮件转给了它觉得应该正确的下一步,比如说百度,百度邮箱收到之后一看,迅雷的邮件,有,于是直接转给迅雷邮箱服务器。迅雷邮箱服务器收到之后帮你存储,然后当你要的时候就推送给你。


xmpp呢,支持域间(服务器之间)通信,但是没有邮件系统那么复杂,它只支持单步转发。就好比刚才的邮件,如果腾讯没有找到迅雷,他就不会说再投给百度试一下,不会的。它会选择回复你一个不可达或者直接抛弃。如下图所示


总结一下万维网,邮件系统,xmpp系统的区别


2,地址

因为xmpp是一个网络协议,包含客户端和服务器,需要在网络上传输数据。所以,他们需要一个地址。xmpp并不是直接建立在IP上,它依赖DNS(domain Name System)(事实上其实没有域名也是可以的,至少我的系统没有域名,但是你需要指定host(IP)和一个假定的域名(虚拟的,随便填,但你要记得他))。xmpp的账号都是这样子的eg:micall@xunlei.com,后面跟的是完整的域名。这个和传统IM不太一样。对了,这个唯一标示用户的叫做JabberID(JID)。

一个JID包含三部分内容:

1)用户名。

2)域名。

3)资源(Resources)。资源是xmpp支持一个账号多终端登入的必要条件。还是这个账号micall@xunlei.com,加入你在PC上登入,那么一个完整的用户名就是micall@xunlei/PC,加入你在你的android手机登入,micall@xunlei.com/android,你在你的ipad登入,那么micall@xunlei/ipad。等等,这样的机制是为了支持多终端登入,而且可以设定他们接收数据的优先级。

3,XML流

XMPP,本质上就是一种传输XML流的技术。和HTTP不一样,HTTP是每次请求完之后,连接就断开,然后要新开连接,HTTP的一些其他技术都导致它不够实时。不能够满足一些例如即时通信的场合。xmpp不一样,你可以发送多个请求,它也不会阻塞住,xmpp需要注意的是你需要用异步的思维来考虑事情。后续章节会知道。在这里我给大家贴一个xml会话。

C: <stream:stream>
C: <presence/>
C: <iq type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
S: <iq type="result">
<query xmlns="jabber:iq:roster">
<item jid="alice@wonderland.lit"/>
<item jid="madhatter@wonderland.lit"/>
<item jid="whiterabbit@wonderland.lit"/>
</query>
</iq>
C: <message from="queen@wonderland.lit" 
to="madhatter@wonderland.lit">
<body>Off with his head!</body>
</message>
S: <message from="king@wonderland.lit"
to="party@conference.wonderland.lit">
<body>You are all pardoned.</body>
</message>
C: <presence type="unavailable"/>
C: </stream:stream>

4,通信洪流(Communication Primitives)

对于这个标题,我暂且这么翻译吧,请不要吐槽,如果你有更好的名字,请留言,我将不客气的更新这个名字。在xmpp中还有个字眼“stanzas"是非常常见的,翻译为”局“?”节“?。我把它翻译为”节“。它是个什么概念呢,其实,你可以理解为packet。就是一次传输的数据包。

节的意义需要从以下几个方面来确定:

(1)节元素的名称,例如message,presence,iq等。这几个不同的节,服务器对它的处理时不一样的,客户端对他们的处理也是不一样的。

(2)Type属性。

(3)子节点。

下一节,我们详细说明有哪些节以及他们的处理。












相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
dzq
|
消息中间件 XML 分布式计算
即时通讯(im)框架/系统开发思考(1)-通讯协议选型
文章分析了XMPP,MQTT,WebSocket,socket.io 各种协议的优缺点,最终选择了socket.io 作为即时通讯的通讯手段。
dzq
2753 0
|
XML API 数据安全/隐私保护
|
数据库
SIP业务基本知识
1、SIP业务基本知识 1.1 业务介绍会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始、管理和终止网络中的语音和视频会话,具体地说就是用来生成、修改和终结一个或多个参与者之间的会话。
1940 0
|
编解码 网络协议 数据库
简述移动端IM开发的那些坑:架构设计、通信协议和客户端
1、前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性、移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着大量的挑战。
3992 0
|
XML 数据格式
XMPP学习——3、XMPP协议学习补充
流基础 两个基本概念,使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换:XML流和XML节。这些术语的定义如下。 XML流的定义: XML流是一个容器,用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 "流头" (即, 一个包含了适当树形和命名空间声明的 XML &lt;stream&gt; 标签), 而这个XML流
1227 0
|
数据安全/隐私保护 安全
XMPP客户端库Smack 4.0.6版开发之四
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/41620825 XMPP客户端库Smack 4.0.6版开发之四 作者:chszs,转载需注明。
865 0
XMPP客户端库Smack 4.0.6版开发之五
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/41620843 XMPP客户端库Smack 4.0.6版开发之五 作者:chszs,转载需注明。
666 0
|
数据安全/隐私保护 安全 开发者
XMPP客户端库Smack 4.0.6版开发之三
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/41594855 XMPP客户端库Smack 4.0.6版开发之三 作者:chszs,转载需注明。
730 0