文档章节

XMPP协议工作流程

-_-一条狗
 -_-一条狗
发布于 2016/03/01 08:57
字数 1322
阅读 95
收藏 0
点赞 1
评论 0

XMPP 核心协议 http://xmpp.org/rfcs/rfc3920.html


XMPP 要点.

  • 1. 客户端(C) 和服务器端(S) 通过TCP连接5222端口进行全双工通信.
  • 2. XMPP 信息均包含在 XML streams中.一个XMPP会话, 开始于<stream> 标签, 并结束于</stream>标签.所有其他的信息都位于这俩标签之间.
  • 3. 出于安全目的考虑, 开始<stream>之后, 后续的内容会被适度的使用 Transpor Layer Security (TLS) 协商传输 和强制性的 Simple Authentication 和 Security Layer (SASL) 协商传输.
  • 4. SASL协商完成后, 一个新的 stream 将会被迅速打开, 它将会更加安全和保密.

第一步: 打开 stream

Client: 客户端发送打开 stream 的片段到服务器, 请求一个新的 session.

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



这里 “example.com” 是客户端试图连接的服务器的域名.

Server: Server 返回 XML stream, 以<stream:freatures> 开头, 包含要求 TLS 或者 SASL 协商谈判之一, 或者2个都要求.

<stream:features>  
    <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>  
        <required/>  
    </starttls>  
    <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>  
        <mechanism>DIGEST-MD5</mechanism>  
        <mechanism>PLAIN</mechanism>  
        <mechanism>EXTERNAL</mechanism>  
    </mechanisms>  
</stream:features>




第二步: 加密和认证.

2.1 如果服务器需要 TLS 交涉.


Client: 客户端发送 STARTTLS 到服务器.

<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>



  

Server: 服务器返回消息显示 TLS 已被允许:

<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>





或者 TLS失败了:
<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> </stream:stream>




在失败的情况下, 服务器会关闭 TCP 连接.

Client: 如果 TLS 已被服务器正确处理, 客户端发送请求一个新的 session:

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




Server: 服务器响应一个 XML stream, 指示是否需要 SASL 交涉.

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' id='c2s_234' version='1.0'>  
<stream:features>  
    <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>  
        <mechanism>DIGEST-MD5</mechanism>  
        <mechanism>PLAIN</mechanism>  
        <mechanism>EXTERNAL</mechanism>  
    </mechanisms>  
</stream:features>




2.2 SASL 交涉

Client 客户端需要选择一个服务器上有效的认证方式来携带SASL交涉数据, 上面的情况, “DIGEST-MD5“, “PLAIN” 和 “EXTERNAL” 是一些可选项.

“PLAIN” 认证模式是三者之中最简单的了. 它是这样工作的:

Client: 客户端按照自己选择的认证模式发送一个将用户名和密码以base64编码的 stream. 用户名和密码按这种格式组织:

“\0UserName\0Password”.



 

例如我想以用户名为“mbed@ceit.org”登录, 密码是“mirror”. 那么, 在进行base64编码之前, 用户名和密码按照上面的格式组织为一个新的字符串,“\0mbed\0mirror”, 再进行base64编码, 得到字符串“AG1iZWQAbWlycm9y”.


然后, 客户端发送下列 stream 到服务器.

<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AG1iZWQAbWlycm9y</auth>





Server: 如果服务器接受了认证信息, 服务器会发回 带 “success” 标签的 stream.

<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>



 
或者:

Server: 如果密码和用户名不匹配, 或者上面的base64编码有错误, 服务器发回错误信息的 stream.

<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>



  

“DIGEST-MD5” 认证模式的具体方法可以在这里找到: http://www.ietf.org/rfc/rfc2831.txt.

第三步: 资源绑定(可选)


Client: 客户端要求服务器绑定一个资源(可以理解为客户端的类型, 比如电脑, 手机, Web应用等):
<iq type='set' id='bind_1'>  
    <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>  
</iq>





或者
Client: 客户端自己绑定一个资源:

<iq type='set' id='bind_2'>  
    <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>  
        <resource>someresource</resource>  
    </bind>  
</iq>





Server: 服务器发回另外一个<iq>片段, 如果“type” 标签的内容是“result”, 说明绑定是成功的, 否则说明绑定失败.

<iq type='result' id='bind_2'>  
    <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>  
        <jid>somenode@example.com/someresource</jid>  
    </bind>  
</iq>




第四步: 请求一个新的session


在 SASL 交涉完成之后或者可选资源绑定之后, 客户端必须建立一个 session 来开始即时消息发送和接收.

Client: 客户端向服务器发送请求:

<iq to='example.com' type='set' id='sess_1'>  
    <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>  
</iq>



 
Server: 服务器发回一个<iq> 片段表明 session 是否成功创建.

创建成功的消息类似于:

<iq from='example.com' type='result' id='sess_1'/>





如果服务器未能创建 session, 服务器将会回复一个如下消息或者其他类型的错误消息.

<iq from='example.com' type='error' id='sess_1'>  
    <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>  
    <error type='auth'>  
        <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>  
    </error>  
</iq>




第五步: 客户端和服务器交换 XMPP 片段


如果以上步骤均成功完成, 那么客户端就可以发送 XMPP 片段到服务器和接收 XML stream了.

客户端可以发送 <iq> 片段来向服务器请求 roster 或者其他信息. 并可以使用 <presence> 片段来改变客户端的 presence 状态(比如在线, 离开等)

即时消息和其他的负载可以通过发送 <message> 片段来完成.


第六步: 关闭 stream


最后, 如果客户端想要结束聊天和关闭 XMPP session, 客户端需要发送一个关闭 stream的片段到服务器.

<presence type='unavailable'/>  
/stream:stream>



  

然后, 服务器将会改变客户端的 presence 状态为 “Offline” , 并且关闭 和客户端的 TCP 连接.

(完)

本文转载自:http://blog.csdn.net/huyoo/article/details/24353105

共有 人打赏支持
-_-一条狗
粉丝 9
博文 26
码字总数 17063
作品 0
通过XMPP协议实现即时通讯介绍

四种即时通讯协议 概述 目前IM有四种协议:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)以及XMPP。PRIM与XMPP、 SIMPLE类似,...

崔同亮
2014/01/22
0
0
Openfire与XMPP协议

什么是OpenFire Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。   您可以使用它轻易的构建高效率的即时通信服务器。Openfire安装和使用都非常简单,并利用W...

postdep
2013/12/25
0
0
XMPP之Smack 介绍

XMPP简介 原理 概述 XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。它在促进服务器之间的准即时操作。这个协议可能最终允许因特...

乐小文
2017/03/06
0
0
XMPP 协议适合用来做移动 IM 么

XMPP 协议是什么 XMPP(Extensible Messaging and Presence Protocol,前称Jabber)是一种以 XML 为基础的开放式实时通信协议,关于它的协议细节,网上已经有太多分析文章,我这里就不再赘述...

都比zunxi
2014/09/03
7.4K
6
Google 放弃 XMPP 协议

在上周的Google I/O大会上,Google推出统一跨平台聊天应用Hangouts取代Google Talk。Google Hangouts与Google+更好的整合,但目前只有Android、iOS平台应用以及Chrome浏览器扩展。不幸的是,...

oschina
2013/05/21
11.5K
43
Android asmack使用介绍

XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继...

让代码飞一会
2015/07/10
0
0
XMPP/Jingle Vs SIP/SIMPLE 的简单介绍

过去一年多,一直关注这方面的技术和发展,这里有一个简单的介绍,我觉得比较简洁明了。我做了一点翻译,还有我的一些评估。 徐建锋 SIP vs XMPP (Jabber) SIP and XMPP are application la...

杨子江
2014/01/21
0
0
Android Push 开源方案解析

在 Android 上,因为 Google 自己实现的 Android 标配的 GCM (Google Cloud Messaging,原来叫 C2DM) 在国内基本不可用,所以,对于开发者来说,如果需要 Push功能,怎么样选择成为了一个问题...

极光推送
2012/11/30
5.3K
85
OpenFire、Spark、Smack介绍

OpenFire 是采用Java开发的基于XMPP(Jabber)协议,开源实时协作(RTC)服务器。 Smack 是用 Java编 写的XMPP客户端代码库,是 spark 的核心 开源界总是有许多有趣的东东,这三个合起来就是...

长平狐
2013/01/06
1K
0
XMPP协议及实践

一、XMPP协议 XMPP (Extensible Messaging and Presence Protocol可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。XMPP的前身是Jabbe...

xn4545945
2014/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计神器 - 摹客设计系统上线了 | 晒出你的设计规范,赢iPad Pro!

在国内,设计规范也许还是个不太常用的概念,但是如果你正好有参与互联网公司的产品设计,你应该早就已经体会到设计规范的重要性了。UI设计师总是要花费大量的时间和精力向开发描述一大堆设计...

mo311
9分钟前
0
0
Thymeleaf 使用过程中的一些记录

Thymeleaf格式化时间: th:value="${#dates.format(gw.regDT,'yyyy-MM-ddHH:mm:ss')}" Thymeleaf select反选: <select id="status" name="status" th:field="${gw.status}" th:value="${gw.......

惊尘大人
11分钟前
0
0
istio源码分析之pilot-discovery模块分析

本文分析的istio代码版本为0.8.0,commit为0cd8d67,commit时间为2018年6月18日。 本文为Service Mesh深度学习系列之一: Service Mesh深度学习系列part1—istio源码分析之pilot-agent模块分...

xiaomin0322
17分钟前
0
0
数据库基本操作:增删改查及联表操作

所用软件:SQL Server Management Studio 首先第一步,建立一个表。在这里命名为T1。并在里面填入几条数据。如图: T1 一.查询 查询所有:select * from T1; 按条件查询:select * from T1 ...

小_橙_子
21分钟前
0
0
Crontab作业时间设置

今天,遇到这么一个题目,周一到周五的9:00-16:59之间,每隔两分钟将某个命令运行一次。给的答案是: */2 9-16 * * 1-5 /usr/sbin/somecommand dosomething 乍一看,这个答案不对,应...

大别阿郎
25分钟前
0
0
ES17-JAVA API文档管理

1.保存文档 可以通过json工具把java对象转换成json字符串进行保存,也可以通过内置的帮助类直接构建json格式 /** * 获取客户端 * * @return */public static TransportClie...

贾峰uk
26分钟前
0
0
Python代码规范和命名规范

前言 Python 学习之旅,先来看看 Python 的代码规范,让自己先有个意识,而且在往后的学习中慢慢养成习惯 一、简明概述 1、编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头...

blackfoxya
29分钟前
0
0
联动滑动之一:NestScrollChild和NestedScrollingParent

NestScrollChild和NestedScrollingParent 吐槽一下开源中国竟然标题字数有限制 由于项目中使用了CoordinateLayout来解决联动以及实现炫酷的UI效果,那么必须就要研究一波源码了,毕竟知其然知...

JerryLin123
46分钟前
1
0
cloudera spark2.2 读写hbase

cloudera spark2.2 读写hbase 例子 host = 'bigdata-03,bigdata-05,bigdata-04'conf = { "hbase.zookeeper.quorum": host, "hbase.mapreduce.inputtable": "student1"}k......

osenlin
51分钟前
0
0
数据库规范化

转载自 一个小时学会MySQL数据库 地址:http://www.cnblogs.com/best/p/6517755.html 截取其中 1.4 部分 用于自己学习使用 感谢作者:张果 1.4、数据库规范化 经过一系列的步骤,我们现在终于...

十万猛虎下画山
51分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部