Leon2012-07-05Jabber/XMPP简介一、XMPP概述XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。二、XMPP历史XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。JeremieMiller于1998年开始了这个项目。第一个公开版本于2000年5月发行。Jabber已经由IETFXMPP协议(RFC3920)标准化。并与IMPP、PRIM、SIP(SIMPLE)合称四大IM协议主流,在此4大协议中,XMPP是最灵活的。三、XMPP特点1.XMPP协议是公开的,由JSF开源社区组织开发的。2.XMPP协议具有良好的扩展性。XMPP中传输的信息都是基于XML的结构化信息,使数据以极高的效率传送给最合适的资源。XMPP除了可用在即时通信的应用程序,还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等。3.分布式的网络架构。XMPP协议都是基于C/S架构,网络的架构和电子邮件十分相似,但没有结合任何特定的网络架构,适用范围非常广泛。4.安全性。XMPP在C-to-S通信,和S-to-S通信中都使用TLS(TransportLayerSecurity)协议作为通信通道的加密方法,保证通信的安全。任何XMPP服务器可以独立于公众XMPP网络,而使用SASL及TLS等技术更加增强了通信的安全性。四、XMPP缺点数据负载太重:随着超过70%的XMPP协议服务器的数据流量的存在和近60%的被重复转发,XMPP协议目前拥有一个大型的空中数据网络。新的议定书正在研究,以减轻这一问题。无法进行二进制数据的传输:XMPP协议的消息被编码为一个单一的长的XML文件,其核心部分没有包含对二进制数据传输的支持,因此是得XMPP的基本数据限制在文本文件的范围内。五、XMPP体系架构XMPP的基本网络结构,xmpp定义了3个角色ClientServerGateway通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。五、XMPP体系架构XMPPserver:以Openfire为例。功能:1.会话管理器:负责客户端会话认证,在线状态,用户联系表等2.数据存储器(XDB):连接数据库系统,保持用户信息、通信日志等3.连接器管理器:管理与客户端之间的连接4.服务器连接器:管理xmpp服务器之间的连接5.传输器:建立xmpp服务器与非xmpp服务器通信五、XMPP体系架构XMPPclient:以spark为例。功能:1.通过TCP套接字与XMPP服务器进行通信;2.解析组织好的XML信息包;3.理解消息数据类型。XMPP将复杂性从客户端转移到服务器端。这使得客户端编写变得非常容易,更新系统功能也同样变得容易。五、XMPP体系架构XMPPgateway:XMPP突出的特点是可以和其他即时通信系统交换信息和用户在线状况。由于协议不同,XMPP和其他系统交换信息必须通过协议的转换来实现,实现这个特殊功能的服务端在XMPP架构里叫做网关(gateway)。目前,XMPP实现了和AIM、ICQ、IRC、MSN、RSS0.9和YahooMassager等的协议转换。由于网关的存在,XMPP架构事实上兼容所有其他即时通信网络,这无疑大大提高了XMPP的灵活性和可扩展性。XMPPClientXMPPClientXMPPServerDNSServerXMPPServerOtherServerOtherClientXMPPClient六、XMPP工作原理图Xml流ProtocolGatewayXMPP工作原理说明所有从一个client到另一个client的jabber消息和数据都要通过xmppserver。1.client连接到server2.server利用本地目录系统的证书对其认证3.client制定目标地址,让server告知目标状态4.server查找,连接并进行相互认证5.client间进行交互七、XMPP地址模式统一的JID(jabberidentifier)JID=[node”@”]domain[“/”resource]eg:cyber@cyberobject.com/resdomain:服务器域名node:用户名resource:属于用户的位置或设备一个用户可以同时以多种资源与同一个XMPP服务器连接八、XMPPXML消息格式定义xmppxml包括3个元素:简单示例:streampresencestatus//prensencemessagebody//messageiqquery//iq/streamXMPPXML消息格式定义-PRESENCEpresence-此元素确定用户的状态presencefrom=cyber1@jabber.org/contactto=cyber2@jabber.org/contactstatusonline/status/presenceXMPPXML消息格式定义-MESSAGEmessage-用于两个用户之间发送信息messagefrom=cyber1@jabber.org/chatto=cyber2@jabber.org/chatType=“chat”bodyHello/body/messageXMPPXML消息格式定义-IQiq-信息/请求,是一个请求-响应机制,管理xmpp服务器上两个用户的转换,允许他们通过相应的xml格式的查询和响应iqfrom=cyber1@jabber.org/contactId=“id1”Type=“result”/iqIq的主要属性:type,包括:Get:获取当前域值Set:设置或替换get查询的值Result:说明成功的响应了先前的查询Error:查询和响应中出现的错误九、XMPP的安全机制XMPPSASLTLSTCPXMPP协议簇SimpleAuthenticationandSecurityLayerTransportLayerSecurityXMPP登录身份认证协议XMPP采用SASL作为身份认证协议SASL(SimpleAuthenticationandSecurityLayer)简单验证和安全层:是一个用于网络通信协议的安全验证框架,它可以使网络协议在互相验证的阶段可以有多种验证方式可以选择。服务端给出选择,客户端选一个,然后根据验证方式不同进行验证流程,由于SASL仅仅是个框架,具体怎么实现是由协议决定的。XMPPTLSXMPP采用TLS的“START-TLS”扩展来为通信双方提供加密性和数据完整性服务。TLS记录协议(TLSRecord)记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用MAC、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。TLS握手协议(TLSHandshake)TLS握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。1.改变密码规格协议2.警惕协议3.握手协议十、SPARK登录XMPP服务器过程示例(一)C—clientS—server步骤:1.client初始流给serverC:stream:streamto=“example.com”xmlns=“jabber:client”xmlns:stream=“”version=“1.0”2.server使用一个流标记作为响应发给clientS:stream:streamfrom=‘cyber'xmlns='jabber:client'xmlns:stream='='a7747277-ad62-4813-b739-63504d6e1246'version='1.0'xml:lang='zh-cn‘SPARK登录XMPP服务器过程示例(二)3.Server发送STARTTLS给client,并带有认证机制与任何其他流特征S:stream:featuresxmlns==urn:ietf:params:xml:ns:xmpp-tls/mechanismsxmlns=urn:ietf:params:xml:ns:xmpp-saslmechanismPLAIN/mechanismmechanismDIGEST-MD5/mechanism/mechanismscompressionxmlns===:featuresSPARK登录XMPP服务器过程示例(三)4.Client发送STARTTLS命令给ServerC:starttlsxmlns=urn:ietf:params:xml:ns:xmpp-tls/5.Server通知Client它被允许处理S:proceedxmlns=urn:ietf:params:xml:ns:xmpp-tls/Note:client与serverTLS协商失败,server通知clientTLS协商失败,并关闭流与TCP连接failurexmlns=“urn:ietf:params:xml:ns:xmpp-tls”//stream:streamSPARK登录XMPP服务器过程示例(四)6.如果TLS协商成功,client初始化一个新流给serverC:stream:streamto=example.comxmlns=jabber:clientxmlns:stream==1.0SPARK登录XMPP服务器过程示例(五)7.Server靠发送带有任何可利用流特征的流头作为响应S:stream:streamfrom=‘cyber'xmlns='jabber:client'xmlns:stream='='a7747277-ad62-4813-b739-63504d6e1246'version='1.0'xml:lang='zh-cn'stream:featuresxmlns==urn:ietf:params:xml:ns:xmpp-saslmechanismPLAIN/mechanismmechanismDIGEST-MD5/mechanism/mechanismscompressionxmlns=