XMPP协议原理

一、定义

XMPPExtensible Messaging and Presence Protocol,前称Jabber)是一种以XML为基础的开放式实时通信协定,是经由互联网工程工作小组(IETF)通过的互联网标准。


二、结构

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


三、传输内容

传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行苻的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。


四、系统特点

1)客户机/服务器通信模式;(2)分布式网络;(3)简单的客户端;(4)XML的数据格式。


五、消息格式

XMPP中定义了       3个顶层XML元素: Message、Presence、IQ,下面针对这三种元素进行介绍。

 

<Message>

用于在两个jabber用户之间发送信息。Jsm(jabber会话管理器)负责满足所有的消息,不管目标用户的状态如何。如果用户在线jsm立即提交;否则jsm就存储。

To :标识消息的接收方。

from : 指发送方的名字或标示(id)o

Text: 此元素包含了要提交给目标用户的信息。

结构如下所示:

 

<message to= ‘lily@jabber.org/contact’ type =’chat’>

<body> 你好,在忙吗</body>

</message>

 

 <Presence>

用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.结构如下所示:

<presence>

From =‘lily @ jabber.com/contact’

To = ‘yaoman @ jabber.com/contact'

<status> Online </status>

</presence>

<presence>元素可以取下面几种值:

Probe :用于向接受消息方法发送特殊的请求

subscribe:当接受方状态改变时,自动向发送方发送presence信息。

 

 

< IQ >

一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应.例如,client在stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果.

<iq > 主要的属性是type。包括:

Get :获取当前域值。

Set :设置或替换get查询的值。

Result :说明成功的响应了先前的查询。

Error: 查询和响应中出现的错误。

结构如下所示:

<iq from =‘lily @ jabber.com/contact’id=’1364564666’ Type=’result’>


六、工作机制

例如:一个终端名字是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’/>

第五步RomeoJuliet开始交换信息,进行聊天。

<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 StanzaXML节)。XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一个方发信给另外一方。通信的最后阶段是</stream>关闭流,关闭TCP/IP连接。



所以这种方式和传统的http不一样了!
传统的http是请求之后,去服务器回去数据

而xmpp是,服务器给客户端数据!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值