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
- <stream:stream to='example.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
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 假设server须要 TLS 交涉.
Client: client发送 STARTTLS 到server.
- <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
Server: server返回消息显示 TLS 已被同意:
- <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
或者 TLS失败了:
- <failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> </stream:stream>
在失败的情况下, server会关闭 TCP 连接.
Client: 假设 TLS 已被server正确处理, client发送请求一个新的 session:
- <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>
Server: 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 client须要选择一个server上有效的认证方式来携带SASL交涉数据, 上面的情况, “DIGEST-MD5“, “PLAIN” 和 “EXTERNAL” 是一些可选项.
“PLAIN” 认证模式是三者之中最简单的了. 它是这样工作的:
Client: client依照自己选择的认证模式发送一个将username和password以base64编码的 stream. username和password按这样的格式组织:
- “\0UserName\0Password”.
比如我想以username为“mbed@ceit.org”登录, password是“mirror”. 那么, 在进行base64编码之前, username和password依照上面的格式组织为一个新的字符串,“\0mbed\0mirror”, 再进行base64编码, 得到字符串“AG1iZWQAbWlycm9y”.
然后, client发送下列 stream 到server.
- <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AG1iZWQAbWlycm9y</auth>
Server: 假设server接受了认证信息, server会发回 带 “success” 标签的 stream.
- <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
或者:
Server: 假设password和username不匹配, 或者上面的base64编码有错误, server发回错误信息的 stream.
- <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
“DIGEST-MD5” 认证模式的详细方法能够在这里找到: http://www.ietf.org/rfc/rfc2831.txt.
第三步: 资源绑定(可选)
Client: client要求server绑定一个资源(能够理解为client的类型, 比方电脑, 手机, Web应用等):
- <iq type='set' id='bind_1'>
- <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
- </iq>
或者
Client: client自己绑定一个资源:
- <iq type='set' id='bind_2'>
- <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
- <resource>someresource</resource>
- </bind>
- </iq>
Server: 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 交涉完毕之后或者可选资源绑定之后, client必须建立一个 session 来開始即时消息发送和接收.
Client: client向server发送请求:
- <iq to='example.com' type='set' id='sess_1'>
- <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
- </iq>
Server: server发回一个<iq> 片段表明 session 是否成功创建.
创建成功的消息类似于:
- <iq from='example.com' type='result' id='sess_1'/>
假设server未能创建 session, server将会回复一个例如以下消息或者其它类型的错误消息.
- <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>
第五步: client和server交换 XMPP 片段
假设以上步骤均成功完毕, 那么client就能够发送 XMPP 片段到server和接收 XML stream了.
client能够发送 <iq> 片段来向server请求 roster 或者其它信息. 并能够使用 <presence> 片段来改变client的 presence 状态(比方在线, 离开等)
即时消息和其它的负载能够通过发送 <message> 片段来完毕.
第六步: 关闭 stream
最后, 假设client想要结束聊天和关闭 XMPP session, client须要发送一个关闭 stream的片段到server.
- <presence type='unavailable'/>
- /stream:stream>
然后, server将会改变client的 presence 状态为 “Offline” , 而且关闭 和client的 TCP 连接.
XMPP 协议工作流程具体解释的更多相关文章
- ARP协议工作流程
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机, ...
- HTTPS协议工作流程
被问到了,复习一下HTTPS的工作流程 提到https,不得不提SSL SSL 1. 安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全 ...
- DHCP(动态主机配置协议)工作流程
一.DHCP的作用 我们先来看一下什么是DHCP,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)它可以为客户机自动分配IP地址.子网掩码以及缺省网 ...
- SSL/TLS协议工作流程
我看了CloudFlare的说明(这里和这里),突然意识到这是绝好的例子,可以用来说明SSL/TLS协议的运行机制.它配有插图,很容易看懂. 下面,我就用这些图片作为例子,配合我半年前写的<SS ...
- XMPP协议实现原理介绍
本文介绍XMPP协议原理及相关信息. XMPP协议简介 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...
- XMPP协议实现原理介绍(转)
XMPP协议简介 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messagi ...
- (转)XMPP协议原理
本文介绍XMPP协议原理及相关信息. XMPP协议简介 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...
- XMPP协议介绍
一.xmpp协议工作原理 二.XMPP地址模式 三.xmpp消息格式 xmpp xml包括三个元素,message,presence,iq,也翻译做三种节. 在'jabber:client'和'jab ...
- SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
原文地址:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段:1)客户端向服务器发送一个 ...
随机推荐
- python gdal 数组生成图片
cols = array.shape[1]rows = array.shape[0]originX = rasterOrigin[0]originY = rasterOrigin[1]driver = ...
- 删除过期备份报错RMAN-06207 RMAN-06208解决方案
RMAN备份日志中出现了警告 日志文件目录如下: [root@erpdbs rmanback]# ll total 88 -rw-r--r-- 1 oraprod dba 81011 Sep 7 22 ...
- Ajax——异步基础知识(二)
XML数据格式 首行必须是版本号和格式等信息 <?xml version="1.0" encoding="utf-8" ?> 最外层需要一个根节点进 ...
- url中含有中文路径时访问出现404问题
/** * URL中文字符编码转换 * @param url 含中文字符的URL * @return */ public static String getChineseURICode(String ...
- Python 之pytesseract模块读取知乎验证码案例
import pytesseract from PIL import Image import requests import time # 获取只会验证码图片并保存为本地 def get_data_ ...
- Django - 基于orm实现用户增删改查
1.基于orm实现用户新增 user_info.html中,增加代码: views.py中,在原user_info函数中,增加判断代码: 备注:最后一句,可以通过return redirect 实现, ...
- 洛谷——P2342 叠积木
P2342 叠积木 题目大意: 给你一堆积木,排成一行,初始时每对积木都只有一个,支持两种操作 第一种是移动操作,格式为“移动X到Y的上面”.X和Y代表两块积木的编号,意思是将X所的那堆积 ...
- Google Cloud SSH 连接配置
设置当前用户及root用户的密码 sudo passwd xx-user # 输入新密码 sudo passwd root # 输入新密码(建议保持一样) 在本地生成私钥和公钥 cd ~/.ssh s ...
- Charles 下载-破解-安装-配置
我当前使用版本为V4.2.7 最新版本下载地址 Charles 在线破解工具 下载完之后,先进行安装,安装完之后,根据破解链接中的步骤来就ok了. 比较费劲配置在下面,不过跟着一步步来就一定能好的 点 ...
- 29. 误拼写时的fuzzy模糊搜索技术
搜索的时候,可能输入的搜索文本会出现误拼写的情况,这时就需要es为我们进行智能纠错 比如有两个文档: doc1: hello world doc2: hello java 现在要搜索:hall ...
