XMPP 协议分析-原理篇
议,目的是为了解决及时通信标准而提出来的,最早是在 Jabber 上实现的。它继承了在 XML 环境中灵活的发展性。因
此,基于 XMPP 的应用具有超强的可扩展性。并且 XML 很易穿过防火墙,所以用 XMPP 构建的应用不易受到防火墙的阻
碍。利用 XMPP 作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。
1 )所有XMPP 信息都是以 XML 为基础的,信息交换的事实标准,扩展性强
2 )XMPP 系统是一个分布式系统,每台服务器控制自己的资源,但是如果需要,它能与外在的系统进行通
信。XMPP 服务器利用开放的 XML 协议来进行 S2S(Serverto Server)通信,就像在 C2S(Client to Server)一样。相比之
下,大多数的 IM 系统使用了只是支持 C2S/S2C 通信的协议,因此 Jabber/XMPP 服务器具有更大的灵活性。
3 )XMPP 协议是公开的,程序则开放源代码。定义了客户端和服务器端的交互要经由 XML 流。普通消息类型
(message ),如改变状态(presence) ,传递消息内容或查询/更新(info/quey)应用则用每个指定的命名空间
(namespace)来建立。
4 )状态(Presence)在整个持久连接中。通过持久连接的有效维持,XMPP 协议一直有在网络中维持存在和可用信息
的能力。
5 )XMPP 允许建立并行的 TCP 套接字连接对所有连接上的客户端和服务器端。一旦建立连接,则只有当状态改变,
例如存在的改变,通过这个连接传输数据。既然这个连接是持久的,那么设置、认证、状态查找功能都不用每次都重复执
行。这种持久的套接字的连接使得 XMPP 能够更有效的支持高级的具有存在能力的应用在带宽和处理资源的使用中。
通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接 理和信息的路由功能。网关承担
着与异构即时通信系统的互联互通,异构系统可以包括SMS
(短信),MSN,ICQ等。基本的网络形式是单客户端通过 TCP/IP 连接到单服务器,然后在之上传输 XML。
XMPP 的基本网络结构如下 :
C1----S1---S2---C3
|
C2----+--G1===FN1===FC1
符号表示:C1,C2,C3=XMPP 客户端 ;S1,S2=XMPP ;服务端 G1=在 XMPP 和使用外部消息网络(非XMPP )的协议之
间转换的网 ;FN1=外部消息网络 ;FC1=外部消息网络的客户端。
(1 )服务器
服务系统是 XMPP 通信的智能提取层,它主要负责: 理来自其他个体的会话连接或者XML 流(streams )和来自客户
端、服务器、其他个体的认证发送在 XML 流实体之中的适当的 XML 地址节点。大多数 XMPP 服务都允许存储一些客户端
数据(比如联系人列表),在这种情况下,服务直接面向这个客户端处理 XML 数据,而不是其他个体。
(2 )客户端
大多数客户端是通过 TCP 直接连接,并且使用 XMPP 获得服务器提供全部-12-第2 章Jabber 协议原理及其应用功能和其
他服务。许多资源通过认证的客户端也许同时连接到服务器,定义在 XMPP 地址的每个资源是不同的(比如
<node@domain/home>和<node@domain/work>)建议服务器和客户端采用的端中是 5222。
(3 )网关
它的主要功能是将XMPP 协议转换成外部消息(non-XMPP)系统使用的协议,也将返回的数据转换成XMPP。这些通信是基
于网关和服务器,基于网关和外部消息系统之间的。
XMPP 消息格式
Jabber/XMPP 系统使用 XML 流在不同实体之间相互传输数据。在两个实体的连接期间,XML 流将从一个实体传送
到另一个实体。在实体间,有三个顶层的 XML 元素:<message/>,<presence/>和<iq/>。每一个都包含属性和子节
点。下面将分别描述这些元素。
1)消息(message)元素:
一个即时消息系统最基本的功能就是能够在两个用户之间实时交换消息,<message/>元素就提供了这个功能。每条消息
都有一个或多个属性和子元素。属性 “from”和 “to”分别表示了消息发送者和接收者的地址。<message/>也可以包含
一个 “type”属性,这给接收者一个提示,这个消息是什么样的消息。表3-1 给出了 “type”属性的可能取
值。<message/>中也可以包含“id”属性,用来唯一的标识一个输出消息的响应。
2)状态(presence)元素:
<presence/>元素用来传递一个用户的存在状态的感知信息。用户可以是 “available”,要么
是 “unavailable”, “Hide”等。当用户连接到即时消息服务器后,好友发给他的消息就立即被传递。如果用户没有连
接到服务器,好友发给他的消息将被服务器存储起来直到用户连接到服务器。用户通过即时消息客户端自己控制可用性。
但是,如果用户断开了同服务器的连接,服务器将发送给订阅了这个用户的存在信息的用户通知他们用户已经不
用。<presence/>还包含了两个子元素:<show/ >和<status/>。<status>包含了一个对<show/ >的文本描述。
3)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 给客户端。但是这个过程并不是一问一答的,任何时候都有
XMPP 协议简介
议,目的是为了解决及时通信标准而提出来的,最早是在 Jabber 上实现的。它继承了在 XML 环境中灵活的发展性。因
此,基于 XMPP 的应用具有超强的可扩展性。并且 XML 很易穿过防火墙,所以用 XMPP 构建的应用不易受到防火墙的阻
碍。利用 XMPP 作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。
1 )所有XMPP 信息都是以 XML 为基础的,信息交换的事实标准,扩展性强
2 )XMPP 系统是一个分布式系统,每台服务器控制自己的资源,但是如果需要,它能与外在的系统进行通
信。XMPP 服务器利用开放的 XML 协议来进行 S2S(Serverto Server)通信,就像在 C2S(Client to Server)一样。相比之
下,大多数的 IM 系统使用了只是支持 C2S/S2C 通信的协议,因此 Jabber/XMPP 服务器具有更大的灵活性。
3 )XMPP 协议是公开的,程序则开放源代码。定义了客户端和服务器端的交互要经由 XML 流。普通消息类型
(message ),如改变状态(presence) ,传递消息内容或查询/更新(info/quey)应用则用每个指定的命名空间
(namespace)来建立。
4 )状态(Presence)在整个持久连接中。通过持久连接的有效维持,XMPP 协议一直有在网络中维持存在和可用信息
的能力。
5 )XMPP 允许建立并行的 TCP 套接字连接对所有连接上的客户端和服务器端。一旦建立连接,则只有当状态改变,
例如存在的改变,通过这个连接传输数据。既然这个连接是持久的,那么设置、认证、状态查找功能都不用每次都重复执
行。这种持久的套接字的连接使得 XMPP 能够更有效的支持高级的具有存在能力的应用在带宽和处理资源的使用中。
6)Jabber/XMPP 系统是模块化的,而且 Jabber/XMPP 的设计强调如何实现伸缩性、安全性和可扩展性。
XMPP 协议分析
通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接 理和信息的路由功能。网关承担
着与异构即时通信系统的互联互通,异构系统可以包括SMS
(短信),MSN,ICQ等。基本的网络形式是单客户端通过 TCP/IP 连接到单服务器,然后在之上传输 XML。
XMPP 的基本网络结构如下 :
C1----S1---S2---C3
|
C2----+--G1===FN1===FC1
符号表示:C1,C2,C3=XMPP 客户端 ;S1,S2=XMPP ;服务端 G1=在 XMPP 和使用外部消息网络(非XMPP )的协议之
间转换的网 ;FN1=外部消息网络 ;FC1=外部消息网络的客户端。
(1 )服务器
服务系统是 XMPP 通信的智能提取层,它主要负责: 理来自其他个体的会话连接或者XML 流(streams )和来自客户
端、服务器、其他个体的认证发送在 XML 流实体之中的适当的 XML 地址节点。大多数 XMPP 服务都允许存储一些客户端
数据(比如联系人列表),在这种情况下,服务直接面向这个客户端处理 XML 数据,而不是其他个体。
(2 )客户端
大多数客户端是通过 TCP 直接连接,并且使用 XMPP 获得服务器提供全部-12-第2 章Jabber 协议原理及其应用功能和其
他服务。许多资源通过认证的客户端也许同时连接到服务器,定义在 XMPP 地址的每个资源是不同的(比如
<node@domain/home>和<node@domain/work>)建议服务器和客户端采用的端中是 5222。
(3 )网关
它的主要功能是将XMPP 协议转换成外部消息(non-XMPP)系统使用的协议,也将返回的数据转换成XMPP。这些通信是基
于网关和服务器,基于网关和外部消息系统之间的。
XMPP 消息格式
Jabber/XMPP 系统使用 XML 流在不同实体之间相互传输数据。在两个实体的连接期间,XML 流将从一个实体传送
到另一个实体。在实体间,有三个顶层的 XML 元素:<message/>,<presence/>和<iq/>。每一个都包含属性和子节
点。下面将分别描述这些元素。
1)消息(message)元素:
一个即时消息系统最基本的功能就是能够在两个用户之间实时交换消息,<message/>元素就提供了这个功能。每条消息
都有一个或多个属性和子元素。属性 “from”和 “to”分别表示了消息发送者和接收者的地址。<message/>也可以包含
一个 “type”属性,这给接收者一个提示,这个消息是什么样的消息。表3-1 给出了 “type”属性的可能取
值。<message/>中也可以包含“id”属性,用来唯一的标识一个输出消息的响应。
2)状态(presence)元素:
<presence/>元素用来传递一个用户的存在状态的感知信息。用户可以是 “available”,要么
是 “unavailable”, “Hide”等。当用户连接到即时消息服务器后,好友发给他的消息就立即被传递。如果用户没有连
接到服务器,好友发给他的消息将被服务器存储起来直到用户连接到服务器。用户通过即时消息客户端自己控制可用性。
但是,如果用户断开了同服务器的连接,服务器将发送给订阅了这个用户的存在信息的用户通知他们用户已经不
用。<presence/>还包含了两个子元素:<show/ >和<status/>。<status>包含了一个对<show/ >的文本描述。
3)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流: