首页 > 代码库 > Asmack开发系列之XMPP基础

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)子节点。

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












Asmack开发系列之XMPP基础