Openfire分析之一:Openfire与XMPP协议

Posted Fordestiny

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Openfire分析之一:Openfire与XMPP协议相关的知识,希望对你有一定的参考价值。

  引言

  上帝说,要有光,于是就有了光。

  有点玄。

  如果将时光回溯无数岁月,到几百万年的蛮荒时代,人类史上第一次发生信息交换,会是什么样子?是转一下脑袋,还是眨一下眼?

  但不管是什么形式,于是有了信息,有了通信。而后几百万年的时代变迁物种生灭,以及后来古文明时代、封建社会、再到如今的互联网时代,不管是峰烟战火,还是市井喧嚣,都充斥着各式各样的信息,每个角落都无时无刻的发生着信息交换。信息交换的载体,从以前可能挥下手势、到如今全球高速网络信道….

  信息在这个世界里,扮演着一个什么样的角色,是人在控制信息?还是信息在控制着人?

  有点玄,但好在这些都不是我们接下去所要讨论的问题,所以留着给哲学家去思考。

  我们今天所要讲的内容,其实是计算机世界里,即时通信的信息交换,准确的来说,是其中一种。

  信息能完成交换,需要的先决条件是什么?自然是双方要能”懂”,就是所谓的协议。协议一致双方才能互相get到点。

  目前互联网产品使用的即时通信协议有这几种:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)以及XMPP。PRIM与XMPP、SIMPLE类似,但已经不再使用了。

  本次要讲的是XMPP,由Openfire实现,OK,废话说了不少,开始吧。

  1、Openfire与XMPP

  Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(RFC-3920),并在此基础上实现了XMPP-IM(RFC-3921),扩展了IM功能,对实施协作的各种场景做较全面的考虑,如用户在线状态切换、消息订阅、通知等等,因此可以用来搭建即时通信服务器,其搭建的方法也很简易。

  RFC-3920与RFC-3921的说明:

  (1)RFC-3920:XMPP的核心。定义了XMPP协议框架下应用的网络架构,引入了XMLStream(XML流)与XMLStanza(XML节),并规定XMPP协议在通信过程中使用的XML标签。使用XML标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全方面,把TLS 安全传输机制与SASL 认证机制引入到内核,与XMPP进行无缝的连接,为协议的安全性、可靠性奠定了基础。Core文档还规定了错误的定义及处理、XML 的使用规范、JID(Jabber Identifier,Jabber 标识符)的定义、命名规范等等。所以这是所有基于XMPP协议的应用都必需支持的文档。

  (2)RFC-3921:用户成功登陆到服务器之后,发布更新自己的在线好友管理、发送即时聊天消息等业务。所有的这些业务都是通过三种基本的XML 节来完成的:IQ Stanza(IQ 节), Presence Stanza(Presence 节), Message Stanza(Message 节)。RFC3921 还对阻塞策略进行了定义,定义是多种阻塞方式。可以说,RFC3921 是RFC3920的充分补充。两个文档结合起来,就形成了一个基本的即时通信协议平台,在这个平台上可以开发出各种各样的应用。

  2、Openfire的特点:

 (1)超强的扩展能力

  XMPP协议,继承了在XML灵活的扩展性,通过扩展发送扩展信息、或者在原有的信息中增加扩展节点来处理用户需求。另外,Openfire本身也支持插件开发,开发者可以根据需求,以插件的形式添加所需要的功能,例如好友列表、群成员列表等,而不需要去修改核心的源代码。

(2)并发能力

  Openfire的通信处理基于Apache MINA框架实现,单机可支持上万的并发,同时也支持集群。

(3)安全性:

  XMPP在C2S通信,和S2S通信中都使用TLS协议作为通信通道的加密方法,保证通信的安全

(3)对Web的支持:

  Openfire采用内置的jetty作web服务器,可以方便的在上面增加WEB功能。jetty服务器是随AdminConsolePlugin插件时启动,通过调用startup()方法。9090为其明文端口,9091为其加密端口。

  3、通信机制

  1、帐号体系

  (1)XMPP服务器的帐号基础,是域(Domain),例如:org.example.com,它在服务器配置时的时候设置,也是服务器能被访问到的域名或IP地址。客户端连接的时候,用这个域去寻找服务器。

  (2)JID:XMPP中,任何一个可能进行通信的实体,包括一个用户、或者一个聊天室,都需要一个JID。

  用户的JID格式为:[email protected],如:[email protected]

  聊天室的JID为:[email protected], 如[email protected]

  一般情况,JID后面还会附带一个资源名(resource),指代这个客户端的来源,比如:[email protected]/pc-abc,表示这个JID在一台名为pc-abc的设备上登录。这是同一个帐号能够在多个设备中登录的基础。

  2、通信端口

  C-S连接的端口是5222 ,S-S连接的端口为5269,这些端口已经在IANA注册。

  3、通信机制

  当客户端连接上XMPP服务器创建会话时,首先是建立一个TCP长连接,并在这个连接上收发XML流进行协商,协商通过后,服务端与客户端,可以通过Message、Presence、IQ这三种格式进行数据交换。

  这三种数据交换格式,下面逐个做介绍:

  (1)Message:用于在两个客户端之前发送信息。

  结构如下:

<message from=‘[email protected]to=‘[email protected]xml:lang=‘en‘>
    <body>Are you OK?</body>
</message>

  其中:

  To : 消息接收方JID。

  from : 消息发送方JID

  body: 所要发送的消息。

  (2)Presence:用来表明用户的状态,当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.

  结构如下:

<presence from=‘[email protected]to=‘[email protected]>
    <status> Online </status>
</presence>

  (3)IQ:一种请求/响应机制,类似于Http的get请求。

  结构如下:(以客户端请求服务器绑定资源为例)

<iq type=‘set‘ id=‘bind_1‘>
     <bind xmlns=‘urn:ietf:params:xml:ns:xmpp-bind‘/>
</iq>

  iq消息中,type是主要属性,值包括:

Get :获取当前域值。
Set :设置或替换get查询的值。
Result :说明成功的响应了先前的查询。
Error: 查询和响应中出现的错误。

 

  4、通信示例

  下面以一个简单的例子,说明客户端与服务的交互过程:

  (1) 客户端发起请求连接

<?xml version=‘1.0‘?>
  <stream:stream to=‘example.com‘ xmlns=‘jabber:client‘ xmlns:stream=‘http://etherx.jabber.org/streams‘ version=‘1.0‘>

  (2) 服务端进行验证、资源绑定等

<?xml version=‘1.0‘?>
  <stream:stream from=‘example.com‘ id=‘someid‘ xmlns=‘jabber:client‘ xmlns:stream=‘http://etherx.jabber.org/streams‘ version=‘1.0‘>
        ...  encryption, authentication, and resource binding ...

  (3)客户端开始发送消息

<message from=‘[email protected]to=‘[email protected]xml:lang=‘en‘>
        <body>Art thou OK?</body>
</message>

  (4) 服务端响应
  这里其实是省略了一个客户端。完整来看,应是服务器与romeo进行一次交换之后,再将数据返回给juliet,但为了说明通信流程,将中间另一端省略掉。

 <message from=‘[email protected]to=‘[email protected]xml:lang=‘en‘>
        <body>I‘m fine!</body>
</message>

  (5)客户端通信结束

</stream:stream>

  (6)服务端通信结束

</stream:stream>

  可以看到,一次完整的通信,需要经过六个步聚。

  关于XMPP的其他信息,可以网上查阅资源了解,这里不再赘述。

  

  后面的章节,将一步步的从Openfire的源代码入手,分析整套系统的运行机制,望对读者有帮助。


  over!

 

以上是关于Openfire分析之一:Openfire与XMPP协议的主要内容,如果未能解决你的问题,请参考以下文章

(转)OpenFire源码学习之一:XMPP基础知识

Openfire分析之三:ConnectionManager 连接管理

如何使用 XMPP 与 PHP 进行聊天过程

Openfire分析之二:主干程序分析

Openfire即时通讯服务搭建与Smack访问

XMPPPY 与 Openfire