XMPP - 可扩展通讯和表示协议

xmpp

XMPP(Extensible Messageing and Presence Protocol:可扩展通讯和表示协议)
http://xmpp.org/

协议

协议官方文档:

RFC6120 - XMPP: Core
RFC6120 - XMPP: 核心协议
RFC6121 - XMPP:Instant Messaging and Presence
RFC6121 - XMPP: 即时消息和出席信息
REF6122 - XMPP: Address Format
RFC6122 - XMPP: 地址格式

标准化的核心结果分为两部分

  • 核心协议是规范的通信协议,定义了XML流传输协议
  • 扩展协议中定义了数据的传输,基于XML流传输的即时通讯扩展应用

XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规范的平台上。借助于XML易于解析和阅读的特性,使得XMPP的协议能够非常漂亮。 XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定义的,与其他业已得到广泛使用的即时通讯协议,诸如AIM,QQ等有功能完整,完善等先进性。

XMPP协议分析

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

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

XMPP中的地址

XML流

XMPP消息格式

Jabber/XMPP系统使用XML流在不同实体之间相互传输数据。在两个实体的连接期间,XML流将从一个实体传送到另一个实体。在实体间,有三个顶层的XML元素:<message/><presence/><iq/>。每一个都包含属性和子节点。下面将分别描述这些元素。

  • 消息(message)元素:
    一个即时消息系统最基本的功能就是能够在两个用户之间实时交换消息,<message/>元素就提供了这个功能。每条消息都有一个或多个属性和子元素。属性“from”和“to”分别表示了消息发送者和接收者的地址。也可以包含一个“type”属性,这给接收者一个提示,这个消息是什么样的消息。表3-1给出了“type”属性的可能取值。<message/>中也可以包含“id”属性,用来唯一的标识一个输出消息的响应。
  • 状态(presence)元素:
    <presence/>元素用来传递一个用户的存在状态的感知信息。用户可以是“available”,要么是“unavailable”,“Hide”等。当用户连接到即时消息服务器后,好友发给他的消息就立即被传递。如果用户没有连接到服务器,好友发给他的消息将被服务器存储起来直到用户连接到服务器。用户通过即时消息客户端自己控制可用性。但是,如果用户断开了同服务器的连接,服务器将发送给订阅了这个用户的存在信息的用户通知他们用户已经不可用。<presence/>还包含了两个子元素:<show/><status/><status>包含了一个对<show/>的文本描述。
  • IQ(Info/Query)元素
    IQ元素是XMPP消息协议的第三个顶层元素。IQ代表”Info/Query”,用来发送和获取实体之间的信息。IQ消息是通过“请求/响应”机制在实体间进行交换的。IQ元素用于不同的目的,它们之间通过不同的命名空间来加以区分。在Jabber/XMPP消息协议里有许多的命名空间,但最常用的命名空间是:jabber:iq:register,jabber:iq:auth,jabber:iq:roster

上面描述了XMPP协议的三个顶层节点。通过这种格式XMPP消息不仅可以是简单的文本(text),而且可以携带复杂的数据和各种格式的文件,也就是说XMPP不仅可以用在人与人之间的交流,而且可以实现软件与软件或软件与人之间的交流。XMPP的这种功能大大扩展了即时通信的应用范围。

服务器配置,客户端配置

数据压缩

客户离线,上线后的处理?

服务器

XMPP Protocol 有很多的开源Implement。

- Openfire

xmpp

http://www.igniterealtime.org/projects/openfire/

开源, Java

- ejabberd

xmpp

http://www.process-one.net/en/ejabberd/

开源 erlang Mobile支持的更好一些。

- Tigase

xmpp

http://www.tigase.org/

Tigase Server 是一个轻量级的可伸缩的 Jabber/XMPP 服务器。无需其他第三方库支持,可以处理非常高的复杂和大量的用户数,可以根据需要进行水平扩展。

FAQ::

REF::

XMPP wikipedia
Telegram apps
【iOS XMPP】使用XMPPFramewok
Android Push 开源方案解析