首页 > 其他分享 >XMPP协议介绍

XMPP协议介绍

时间:2022-12-27 10:36:08浏览次数:55  
标签:协议 http XMPP 介绍 server client org jabber


XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,XMPP的前身是一个开源组织制定的网络通信协议——Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段。 
XMPP的基本网络结构 ,xmpp定义了3个角色
Client
Server
Gateway

通信能够在这三者的任意两个之间双向发生。

服务器同时承担了客户端信息记录,连接管理和信息的路由功能。

网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。 
客户端利用xmpp(基于TCP/IP)访问server,传输的是XML 
Client--------Server----Client
    TCP            TCP      TCP

XMPP server:其内核是一个XMPP路由器,完成基本组件间的数据包交换和路由。
功能:
1.会话管理器:负责客户端会话认证,在线状态,用户联系表等
2.数据存储器(XDB):连接数据库系统,保持用户信息、通信日志等
3.连接器管理器:管理与客户端之间的连接
4.服务器连接器:管理xmpp服务器之间的连接
5.传输器:建立xmpp服务器与非xmpp服务器通信

所有从一个client到另一个client的jabber消息和数据都要通过xmpp server。
1.client连接到server
2.server利用本地目录系统的证书对其认证
3.client制定目标地址,让server告知目标状态
4.server查找,连接并进行相互认证
5.client间进行交互

统一的JID(jabber identifier)
JID=[ node”@” ] domain [ “/” resource ]
eg: ​​[email protected]/res​​ domain:服务器域名
node: 用户名
resource:属于用户的位置或设备
一个用户可以同时以多种资源与同一个XMPP服务器连接

xmpp xml包括3个元素:简单示例:
<stram>
   <presence>
      <status/>
   </prensence>
   <message>
        <body/>
    </message>
    <iq>
    <bind/>
    </iq>
</stream>

<presence>-此元素确定用户的状态
<presence ​​[email protected]/contact​​ 
​​[email protected]/contact​​>
  <status>online</status>
</presence>

<message>-用于两个用户之间发送信息
<message ​​[email protected]/contact​​ 
​​[email protected]/contact​​ Type=“chat”>
  <body>Hello</body>
</message>


<iq>-信息/请求,是一个请求-响应机制,管理xmpp服务器上两个用户的转换,允许他们通过相应的xml格式的查询和响应
<iq
​​[email protected]/contact​​ 
Id=“id1” Type=“result”>  
</iq>

Iq的主要属性:type,包括:
Get:获取当前域值
Set:设置或替换get查询的值
Result:说明成功的响应了先前的查询
Error:查询和响应中出现的错误

XMPP 协议族基于TCP

XMPP采用SASL作为身份认证协议
SASL包含的信息:
<服务名>:XMPP
<初始序列>
<交换序列>
<安全层协商>
顺序:[TCP]?[TLS]?[SASL]?[XMPP]

 XMPP采用TLS的“START-TLS”扩展来为通信双方提供加密性和数据完整性服务

登录xmpp服务器过程示例 :

C—client      S—server
步骤:
1.client初始流给server
  C:
<stream:stream to="example.com" xmlns="jabber:client" xmlns:stream="​​​http://etherx.jabber.org/streams​​​" version="1.0“ > 
2.server使用一个流标记作为响应发给client
  S:
<stream:stream from=‘cyber' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='a7747277-ad62-4813-b739-63504d6e1246' version='1.0' xml:lang='zh-cn‘ >

3.Server发送STARTTLS扩展给client,并带有认证机制与任何其他流特征
 ?S:
<stream:features xmlns="​​​http://etherx.jabber.org/streams​​​">
 <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls" />
  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
       <mechanism>PLAIN</mechanism>
       <mechanism>DIGEST-MD5</mechanism>
         </mechanisms>
         <compression xmlns="​​​http://jabber.org/features/compress​​​">
       <method>zlib</method>
         </compression>
  <auth xmlns="​​​http://jabber.org/features/iq-auth​​​" />
  <register xmlns="​​​http://jabber.org/features/iq-register​​​" />
</stream:features>

4. Client发送STARTTLS命令给Server
C:
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>

5.Server通知Client它被允许处理 
S:
<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls" />
Note:client与server TLS协商失败,server通知client TLS协商失败,并关闭流与TCP连接
<failure xmlns=“urn:ietf:params:xml:ns:xmpp-tls” />
</stream:stream>

6. 如果TLS协商成功,client初始化一个新流给server
 C:
<stream:stream to="example.com" xmlns="jabber:client" xmlns:stream="​​​http://etherx.jabber.org/streams​​" version="1.0">

7.Server靠发送带有任何可利用流特征的流头作为响应
S:
<stream:stream from=‘cyber' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='a7747277-ad62-4813-b739-63504d6e1246' version='1.0' xml:lang='zh-cn'> <stream:features xmlns="​​​http://etherx.jabber.org/streams​​​">
      <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
   <mechanism>PLAIN</mechanism>
               <mechanism>DIGEST-MD5</mechanism>
          </mechanisms>
          <compression xmlns="​​​http://jabber.org/features/compress​​​">
               <method>zlib</method>
          </compression>
          <auth xmlns="​​​http://jabber.org/features/iq-auth​​​" />
          <register xmlns="​​​http://jabber.org/features/iq-register​​​" />
</stream:features>

8.Client选择一个认证机制
C:
<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">AGh4dwAx</auth>

9.Server通知client认证成功
S:<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />
Note:如果认证不成功,server通知client认证失败,并关闭流
<failure xmlns=“urn:ietf:params:xml:ns:xmpp-tls” >
 <temporary-auth-failure/>
</failure>

10.如果认证成功,client初始化一个新流给server
C:
<stream:stream to=“example" xmlns="jabber:client" xmlns:stream="​​​http://etherx.jabber.org/streams​​" version="1.0">

</stream:stream>

11.Server依靠流头来响应client,并伴随有另外的特征
S:
<stream:stream from=’cyber' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='a7747277-ad62-4813-b739-63504d6e1246' version='1.0' xml:lang='zh-cn'> <stream:features xmlns="​​​http://etherx.jabber.org/streams​​​">
<compression xmlns="​​​http://jabber.org/features/compress​​​">
<method>zlib</method>
</compression>
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind" />
<session xmlns="urn:ietf:params:xml:ns:xmpp-session" />
</stream:features>

12.资源绑定:client发送一个类型为set的iq,并包含所需绑定的资源节点<resource/>
C:
<iq id="O193v-0" type="set">
 <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
  <resource>spark</resource>
 </bind>
</iq>

13.如果server为client产生了一个资源标识符或是接受了由客户端提供的资源标识符,它必须返回一个类型为result的iq节点给client,并必须包含<jid/>子节点,来为server决定的已连接资源指定全JID
S:
<iq xmlns="jabber:client" id="O193v-0"  type="result">
 <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
  <resource>spark</resource>
  <jid>username@cyber/spark</jid>
 </bind>
</iq>

14.Client向server请求session
C:<iq id="O193v-1" type="set">
 <session xmlns="urn:ietf:params:xml:ns:xmpp- session"/>
</iq>

15.Server告知client,session已建立
S:<iq xmlns="jabber:client" id="O193v-1" type="result">
<session xmlns="urn:ietf:params:xml:ns:xmpp-session" />
</iq>

标签:协议,http,XMPP,介绍,server,client,org,jabber
From: https://blog.51cto.com/u_15923385/5971484

相关文章

  • XMPP(Jabber)
    现在比较流行的开放IM协议包括SIP、SIMPLE和XMPP(jabber)。对XMPP做一个简单介绍。目前XMPP协议的使用的案例还相对较少,主要是Google的gtalk和Nokia新推出的Ovi。XMPP设计......
  • 远距离串口服务器模块PS304 多种数字接口物理层协议转发器
     PS304(PortsServerchannel4)是多种数字接口物理层协议转发器,可实现UART转换I2C、SPI、1Wire远距离通讯,内嵌磁隔离双电源及辅助增强电源电路、自适应线缆算法、......
  • $.inArray()方法介绍
    $.inArray()方法介绍$.inArray()函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回-1;$.inArray(value,array)--value是要查找的值,array是被......
  • 两个系统介绍shell脚本的网站,啥都有
    Shellifelse语句(详解版)(biancheng.net)Shell判断是否为目录-Shell判断文件是否是目录-嗨客网(haicoder.net)......
  • 比较系统介绍shell脚本的一系列文章
     点进这个博主的标签分类,可以看到一系列文章(4条消息)Shell脚本入门01:格式与基础使用_NaisuXu的博客-CSDN博客_shell脚本格式(4条消息)Linux相关_NaisuXu的博客-C......
  • k8s核心资源Pod介绍
    百度网盘链接:https://pan.baidu.com/s/15t_TSH5RRpCFXV-93JHpNw?pwd=8od3 提取码:8od32k8s核心资源Pod介绍2.1Pod是什么K8s官方文档:https://kubernetes.io/K8s中文......
  • 命名空间介绍
    百度网盘链接:https://pan.baidu.com/s/15t_TSH5RRpCFXV-93JHpNw?pwd=8od3 提取码:8od33命名空间3.1什么是命名空间?Kubernetes支持多个虚拟集群,它们底层依赖于同一个......
  • 为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍
        基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题。对于c++语系的程序员来说,一般来说有QT/MFC两种考虑。QT的确功能强大,特别是QML......
  • 安卓逆向 -- AndroidKiller介绍
    别在别人心中修行自己别在自己心中强求别人。。。                                      ......
  • CPU 缓存一致性 MESI 协议
    为什么需要缓存一致目前主流电脑的CPU都是多核心的,多核心的有点就是在不能提升CPU主频后,通过增加核心来提升CPU吞吐量。每个核心都有自己的L1Cache和L2Cache,只......