zoukankan      html  css  js  c++  java
  • XMPP协议简介

    XMPP(息处理现场协议)是基于可扩展标记语言(XML)的协议。它用于即时消息(IM)以及在线现场探測。XMPP协议採用的是client-server架构,全部从一个client发到还有一个client的消息和数据都必须经过XMPPserver转发,并且支持server间DNS的路由,也就是说能够构建server集群,XMPP的前身是一个开源组织制定的网络通信协议——Jabber。XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段。

     
    XMPP的基本网络结构 ,xmpp定义了3个角色
    Client
    Server
    Gateway

    通信可以在这三者的随意两个之间双向发生。

    server同一时候承担了client信息记录,连接管理和信息的路由功能。

    网关承担着与异构即时通信系统的互联互通。异构系统能够包含SMS(短信)。MSN,ICQ等。

    主要的网络形式是单client通过TCP/IP连接到单server,然后在之上传输XML。

     
    client利用xmpp(基于TCP/IP)訪问server。传输的是XML 
    Client--------Server----Client
        TCP            TCP      TCP

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

    全部从一个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: cyber@cyberobject.com/res
    domain:server域名
    node: username
    resource:属于用户的位置或设备
    一个用户能够同一时候以多种资源与同一个XMPPserver连接

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

    <presence>-此元素确定用户的状态
    <presence from=cyber1@jabber.org/contact 
    to=cyber2@jabber.org/contact>
      <status>online</status>
    </presence>

    <message>-用于两个用户之间发送信息
    <message from=cyber1@jabber.org/contact 
    to=cyber2@jabber.org/contact
    Type=“chat”>
      <body>Hello</body>
    </message>


    <iq>-信息/请求,是一个请求-响应机制,管理xmppserver上两个用户的转换,同意他们通过对应的xml格式的查询和响应
    <iq
    from=cyber1@jabber.org/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”扩展来为通信两方提供加密性和数据完整性服务

    登录xmppserver过程演示样例 :

    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>

  • 相关阅读:
    __declspec关键字详细用法
    【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...
    【转载】理解C语言中的关键字extern
    Linux应用环境实战
    【转载】深入解析连接点
    【转载】COM多线程原理与应用
    【转载】COM的多线程模型
    【转载】COM 连接点
    【转载】COM:IUnknown、IClassFactory、IDispatch
    101. Symmetric Tree
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5049362.html
Copyright © 2011-2022 走看看