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>

XMPP协议简介的更多相关文章

  1. XMPP协议实现原理介绍

    本文介绍XMPP协议原理及相关信息. XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...

  2. 【XMPP】XMPP协议之原理篇

    XMPP协议简介 XMPP协议(Extensible Messaging and Presence Protocol,可扩展消息处理现场协议)是一种基于XML的协议. 目的是为了解决及时通信标准而提出 ...

  3. XMPP协议实现原理介绍(转)

    XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messagi ...

  4. (转)XMPP协议原理

    本文介绍XMPP协议原理及相关信息. XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...

  5. 即时聊天IM之一 XMPP协议简述

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com  综述: ...

  6. 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较

    一.先看下相关国外的专业数据对四大协议的比较: Protocol                                    CoAP                         XMP ...

  7. XMPP协议的基本理解

    即时通讯技术简介 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容.大多数常用的即时通讯发送程序都会提 ...

  8. Fiddler--一、HTTP协议简介

    在学习Fiddler之前,最好先学习一下HTTP协议. HTTP协议简介 什么是HTTP协议 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...

  9. 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com smack ...

随机推荐

  1. Codeforces Round #270 A~D

    Codeforces Round #270 A. Design Tutorial: Learn from Math time limit per test 1 second memory limit ...

  2. ARMv8 Linux内核源代码分析:__flush_dcache_all()

    1.1 /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ EN ...

  3. Join的实现步骤 以及连接的概念

    Join的实现步骤  以及连接的概念 我们常说连接有三种,即 交叉连接.内连接.外连接,这三者的概念很容易模糊,现在我们先放下概念,搞清楚完整连接实现的步骤: 一个完整的连接有三个步骤:.做笛卡儿积: ...

  4. hdu2489 Minimal Ratio Tree

    hdu2489 Minimal Ratio Tree 题意:一个 至多  n=15 的 完全图 ,求 含有 m 个节点的树 使 边权和 除 点权和 最小 题解:枚举 m 个 点 ,然后 求 最小生成树 ...

  5. PS大头照的背景

    给同事ps一个大头照,只是修改一下背景颜色,以前没有做过,这次算是小练习了一把,与大家分享一下.修改大头照背景重要的是如何选中背景的区域,如果用魔棒选择的话,头与背景的边处理的不好,说说我的处理方法吧 ...

  6. Swift - 使用NSURLSession加载数据、下载、上传文件

    NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的sharedSession()和dataTaskWithR ...

  7. ASP.NET - 出错页

    配置Web.config,配置customError区域. <system.web> <customErrors mode ="RemoteOnly" defau ...

  8. h和.cpp文件的区别

    关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有 ...

  9. POJ 3481 &amp; HDU 1908 Double Queue (map运用)

    题目链接: PKU:http://poj.org/problem?id=3481 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1908 Descript ...

  10. JSP的学习(6)——九大隐式对象及其out对象

    本篇将介绍JSP中的九大隐式对象,并重点介绍其中的out对象. 我们在之前的博客<JSP的学习(1)——基础知识与底层原理>一文中已经知道,JSP最终要被翻译和转换成Servlet,在转换 ...