XMPP 协议工作流程详解

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.

[html] view
plain
copy

  1. <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个都要求.

[html] view
plain
copy

  1. <stream:features>
  2. <starttls xmlns=‘urn:ietf:params:xml:ns:xmpp-tls‘>
  3. <required/>
  4. </starttls>
  5. <mechanisms xmlns=‘urn:ietf:params:xml:ns:xmpp-sasl‘>
  6. <mechanism>DIGEST-MD5</mechanism>
  7. <mechanism>PLAIN</mechanism>
  8. <mechanism>EXTERNAL</mechanism>
  9. </mechanisms>
  10. </stream:features>

第二步: 加密和认证.

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

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

[html] view
plain
copy

  1. <starttls xmlns=‘urn:ietf:params:xml:ns:xmpp-tls‘/>

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

[html] view
plain
copy

  1. <proceed xmlns=‘urn:ietf:params:xml:ns:xmpp-tls‘/>

或者 TLS失败了:

[html] view
plain
copy

  1. <failure xmlns=‘urn:ietf:params:xml:ns:xmpp-tls‘/> </stream:stream>

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

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

[html] view
plain
copy

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

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

[html] view
plain
copy

  1. <stream:stream xmlns=‘jabber:client‘ xmlns:stream=‘http://etherx.jabber.org/streams‘ from=‘example.com‘ id=‘c2s_234‘ version=‘1.0‘>
  2. <stream:features>
  3. <mechanisms xmlns=‘urn:ietf:params:xml:ns:xmpp-sasl‘>
  4. <mechanism>DIGEST-MD5</mechanism>
  5. <mechanism>PLAIN</mechanism>
  6. <mechanism>EXTERNAL</mechanism>
  7. </mechanisms>
  8. </stream:features>

2.2 SASL 交涉

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

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

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

[html] view
plain
copy

  1. “\0UserName\0Password”.

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

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

[html] view
plain
copy

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

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

[html] view
plain
copy

  1. <success xmlns=‘urn:ietf:params:xml:ns:xmpp-sasl‘/>

或者:

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

[html] view
plain
copy

  1. <failure xmlns=‘urn:ietf:params:xml:ns:xmpp-sasl‘/>

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

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

Client: 客户端要求服务器绑定一个资源(可以理解为客户端的类型, 比如电脑, 手机, Web应用等):

[html] view
plain
copy

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

或者

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

[html] view
plain
copy

  1. <iq type=‘set‘ id=‘bind_2‘>
  2. <bind xmlns=‘urn:ietf:params:xml:ns:xmpp-bind‘>
  3. <resource>someresource</resource>
  4. </bind>
  5. </iq>

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

[html] view
plain
copy

  1. <iq type=‘result‘ id=‘bind_2‘>
  2. <bind xmlns=‘urn:ietf:params:xml:ns:xmpp-bind‘>
  3. <jid>[email protected]/someresource</jid>
  4. </bind>
  5. </iq>

第四步: 请求一个新的session

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

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

[html] view
plain
copy

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

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

创建成功的消息类似于:

[html] view
plain
copy

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

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

[html] view
plain
copy

  1. <iq from=‘example.com‘ type=‘error‘ id=‘sess_1‘>
  2. <session xmlns=‘urn:ietf:params:xml:ns:xmpp-session‘/>
  3. <error type=‘auth‘>
  4. <forbidden xmlns=‘urn:ietf:params:xml:ns:xmpp-stanzas‘/>
  5. </error>
  6. </iq>

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

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

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

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

第六步: 关闭 stream

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

[html] view
plain
copy

  1. <presence type=‘unavailable‘/>
  2. /stream:stream>

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

XMPP 协议工作流程详解

时间: 2024-11-08 14:20:07

XMPP 协议工作流程详解的相关文章

ssl协议工作流程详解

SSL 协议 (HTTPS) 握手.工作流程详解 (双向 HTTPS 流程 )SSL 协议的工作流程:服务器认证阶段: 1)客户端向服务器发送一个开始信息"Hello"以便开始一个新的会话连接; 2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的"Hello"信息时将包含生成主密钥所需的信息; 3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器; 4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信

git概念及工作流程详解

git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别及理解git几个重要概念. 至于什么是git,git的发展历史,网上已经有很多资料,可以自行google或百度. 关于git与svn的区别 这里不针对git与svn的区别详细深究,以便对双方的优缺点了解更多些. 1) 最核心的区别Git是分布式的,而Svn不是分布的. 能理解这点,上手会很容易,声明

SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)

SSL协议的工作流程: 服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接:2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息:3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器:4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器.      用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证

SSL协议握手工作流程详解(双向HTTPS流程)

参考学习文档:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段: 1)客户端向服务器发送一个开始信息"Hello"以便开始一个新的会话连接: 2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的"Hello"信息时将包含生成主密钥所需的信息: 3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器

SpringMVC框架及基本工作流程详解

传统原生的JSP+Servlet在开发上过程上虽然简单明了,JSP页面传递数据到Servlet,Servlet整理数据(逻辑开发)或者从数据库提取数据接着再转发到JSP页面上,但是其似乎只能止步于此,我们都知道我们request和response都依赖于url,当我们想要通过针对围绕url进行编程的话单纯的JSP+Servlet在实现上只有过滤器Filter在抵达相对应的Servlet之前起作用,但是如果我们想要在Servlet转发或者重定向之后再进行一些工作呢?一个url对应一个Servlet

sip协议呼叫流程详解

1.SIP业务基本知识 1.1 业务介绍会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和终结一个或多个参与者之间的会话.SIP的业务模式是一个点对点协议,其中有两个要素——SIP用户代理和SIP网络服务器.用户代理是呼叫的终端系统元素,而SIP服务器是处理与多个呼叫相关联信令的网络设备.用户代理本身具有一客户机元素(用户代理客户机UAC)和一服务器元素(用户代理服务器UAS).客户机元素

看完你也能独立负责项目!产品经理做APP从头到尾的所有工作流程详解!

(一)项目启动前 从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是以为做项目管理跟踪项目进度,有的是做竞品分析给老板看.实际上,这些都不是产品经理的核心和重点.在较为成熟的企业,因为产品的壮大和人员的增多,为了便于协作和沟通,岗位会细化的很清楚,如产品经理.交互设计师.UI设计师.用户体验分析师.数据分析师.运营等等.但是创业型公司中产品经理往往都是身兼数职,创业公司

XMPP 协议工作流程具体解释

XMPP 要点. 1. client(C) 和server端(S) 通过TCP连接5222port进行全双工通信. 2. XMPP 信息均包括在 XML streams中.一个XMPP会话, 開始于<stream> 标签, 并结束于</stream>标签.全部其它的信息都位于这俩标签之间. 3. 出于安全目的考虑, 開始<stream>之后, 兴许的内容会被适度的使用 Transpor Layer Security (TLS) 协商传输 和强制性的 Simple Aut

CentOS 5,6 系统启动流程详解

一.linux 组成介绍 1.linux 组成: Linux: kernel+rootfs(根文件系统) kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs: 程序和glibc 库:函数集合, function, 调用接口(头文件负责描述) 过程调用: procedure,无返回值 函数调用: function 程序:二进制执行文件 2.内核设计流派: 单内核(monolithic kernel): Linux 把所有功能集成于同一个程序 微内核(micro