XMPP 协议工作流程具体解释

XMPP 要点.

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

第一步: 打开 stream

Client: client发送打开 stream 的片段到server, 请求一个新的 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” 是client试图连接的server的域名.

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 假设server须要 TLS 交涉.

Client: client发送 STARTTLS 到server.

[html] view
plain
copy

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

Server: 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>

在失败的情况下, server会关闭 TCP 连接.

Client: 假设 TLS 已被server正确处理, client发送请求一个新的 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: 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 client须要选择一个server上有效的认证方式来携带SASL交涉数据, 上面的情况, “DIGEST-MD5“, “PLAIN” 和 “EXTERNAL” 是一些可选项.

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

Client: client依照自己选择的认证模式发送一个将username和password以base64编码的 stream. username和password按这样的格式组织:

[html] view
plain
copy

  1. “\0UserName\0Password”.

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

然后, client发送下列 stream 到server.

[html] view
plain
copy

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

Server: 假设server接受了认证信息, server会发回 带 “success” 标签的 stream.

[html] view
plain
copy

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

或者:

Server: 假设password和username不匹配, 或者上面的base64编码有错误, server发回错误信息的 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: client要求server绑定一个资源(能够理解为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: 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: 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 交涉完毕之后或者可选资源绑定之后, client必须建立一个 session 来開始即时消息发送和接收.

Client: client向server发送请求:

[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: server发回一个<iq> 片段表明 session 是否成功创建.

创建成功的消息类似于:

[html] view
plain
copy

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

假设server未能创建 session, server将会回复一个例如以下消息或者其它类型的错误消息.

[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>

第五步: client和server交换 XMPP 片段

假设以上步骤均成功完毕, 那么client就能够发送 XMPP 片段到server和接收 XML stream了.

client能够发送 <iq> 片段来向server请求 roster 或者其它信息. 并能够使用 <presence> 片段来改变client的 presence 状态(比方在线, 离开等)

即时消息和其它的负载能够通过发送 <message> 片段来完毕.

第六步: 关闭 stream

最后, 假设client想要结束聊天和关闭 XMPP session, client须要发送一个关闭 stream的片段到server.

[html] view
plain
copy

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

然后, server将会改变client的 presence 状态为 “Offline” , 而且关闭 和client的 TCP 连接.

时间: 2024-12-28 16:20:07

XMPP 协议工作流程具体解释的相关文章

XMPP 协议工作流程详解

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

ssl协议工作流程详解

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

ARP协议工作流程

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址:收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源.地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记

HTTPS协议工作流程

被问到了,复习一下HTTPS的工作流程 提到https,不得不提SSL SSL 1.        安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议. 2.    SSL协议的三个特性 Ø  保密:在握手协议中定义了会话密钥后,所有的消息都被加密. Ø  鉴别:可选的客户端认证,和强制的服务器端认证. Ø  完整性:传送的消息包括消息完整性检查(使用MAC). 3.    SSL的位置 客户端在使用HTTPS方式与Web服务器通信

XMPP协议实现原理介绍

本文介绍XMPP协议原理及相关信息. XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messaging,即时消息)协议之一,其他三种分别为:即时信息和空间协议(IMPP).空间和即时信息协议(PRIM).针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE). 在这四种协议中,XMPP是最灵活的.XMPP是一种基于XML的协议,它继承了在XML环境中

STRUTS基本工作流程

这一篇我们介绍一下Struts执行的基本流程. 假设现在有以下情景: 用户正在浏览一个用STRUTS的技术构建的网站主页,主页上有个登陆表单,用户填好登陆名和密码,单击"登陆"按钮,就激活了以下一系列过程: (1)用户的请求以HTTP方式传输到服务器上,接受请求的是ActionServlet. (2)ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操作.如果没有,则返回一个用户请求无效的出错

HTTP协议概念及工作流程

HTTP协议:简单点就是客户端怎么问,服务器怎样答. 重要性:webservice 还是rest做大型架构都离不开对http协议的认识,甚至可以简化的说webservice =  http + XML:Rest = HTTP + json:各种API,也是用http+ xml/json来实现. 做小偷站,采集,ajax也都需要对http协议了解. 工作流程: 1)首先客户机与服务器需要建立连接.只要单击某个超级链接,HTTP的工作开始. 2)建立连接后,客户机发送一个请求给服务器,请求方式的格式

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)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器