xmpp介绍与RFC3920学习

1,概述
xmpp(Extensible Messageing and Presence Protocol)可扩展消息与存在协议
IM(instant messaging)即时消息
xmpp是一个基于开放的可扩展标记语言协议的一个接近实时的消息与存在状态的请求应答协议。
1999年有Jabber开源社区开发。通常基于c/s架构。
C1---S1---S2---C2
      |
     G1
Server的功能:管理客户端的连接,数据的存贮,处理和转发。
Client的功能:通过TCP连接服务器,利用服务器提供的服务。每个认证的客户端可能有多个资源同时连接服务器并分配资源标识。推荐端口是5222
Gateway:特定目的的Server端的服务,主要是xmpp和其他消息协议的相互转换。

2,Addressing Scheme(寻址方案)
使用XMPP通信,必须是有统一的寻址方案,且符合RFC2396[URI](统一资源标识),由于历史原因,xmpp实体地址叫做JID(Jabber标识),由三部分组成:域标识符,节点标识符,资源标识符。
   JID用于标识即时消息用户,和用户连接的资源,例
user@host/resource 。也可以是其它,例如服务器上多个用户的聊天室 room@service,'room' 是聊天室,'service'是主机名。
   JID的每一部分不超过1023个字节,总共不超过3071个字节(包括@和/)
   域标识符是唯一必须的,通常代表网关或主服务器。域标识符必须是定义在[IDNA]的国际化域名。
   节点标识符是一个可选的以
'@' 分割放在域标识符之前。它通常是一个使用网络服务的一个实体(例如一个客户端),或其他类型的实体(提供多个用户服务的聊天室)。
资源标识符是一个可选的标识符,放在域标识符之后,并以'/'分割。通常代表一个特定会话或连接。

   xmpp介绍与RFC3920学习(2)
1 XML Streams
两个基本定义
a, XML streams(XML流) : 是在网络上两个实体交换XML元素的容器。以XML开始标签<stream>开始,以XML结束标签<stream>终止。在流 的生命周期里,实体可以发送大量的XML元素。包括用于协商流的元素或XML stanzas 。
b, XML Stanza(XML节): 是一个在XML流上从一个实体发往另一个实体的不连续的语意单元。XML节是根节点<stream/>的直接子节点。仅有的XML节是 <message/> <presence/> <iq/>
    考虑一个客户端和服务器会话的例子,为了连接服务器,客户端必须通过发送一个开始标签<stream>初始化XML流,可选的XML版本声明 和字符编码支持。服务器端应当响应一个XML流到客户端。一旦客户端完成SASL协商,客户端可以在流上发送大量的XML节,要关闭流,只需发送关闭标签 </stream>,客户端和服务器将终止下层的TCP连接。
    XML流可以当作是所有XML节的信封。可以示例如下:
   |--------------------|
   | <stream>           |
   |--------------------|
   | <presence>         |
   |   <show/>          |
   | </presence>        |
   |--------------------|
   | <message to='foo'> |
   |   <body/>          |
   | </message>         |
   |--------------------|
   | <iq to='bar'>      |
   |   <query/>         |
   | </iq>              |
   |--------------------|
   | ...                |
   |--------------------|
   | </stream>          |
   |--------------------|
2 Binding to TCP(绑定到TCP)
     在客户端与服务器的通讯中,服务器必须允许客户端共享一个连接,这个连接可以从客户端到服务器发送XML节,也可以从服务器到客户端发送XML节。在服务器之间通讯中,必须有两个TCP连接
3 Stream Attributes(流属性)
initiating entity(开始实体):会话发起的实体,通常是client.
receiving entity(接受实体):会话的另一方,通常是Server.
    流节点有下列属性:
   a,to: 应当仅用于在(initiating entity)开始实体到(receiving entity)接受实体XML流的头部,必须是接受实体的主机名。在接受实体到开始实体的流头部,to属性不应当设置,如果包括to属性,开始实体应当默默忽略。
   b,from: 应当仅用于从"receiving entity"到"initiation entity"实体的XML流的头部。必须设置为接受实体的主机名。在开始实体到接受实体的流头部,from属性不应当设置,如果包括from属性,接受 实体应当默默忽略。
   c,id: 应当仅使用于"receiving entity"到"initiating entity"的XML流的头部,这个属性是接受实体创建的一个session关键字,必须在接受实体应用程序一方(通常是服务器)是唯一的。流ID是临 界安全的,所以必须是不可重复和不可预料的。在开始实体到接受实体的流头部,id属性不应当设置,如果包括id属性,接受实体应当默默忽略。
   d,xml:lang: 应当包含在开始实体的初始化流头部,来指定在流上的默认语言。如果指定了这个值,接受实体应当记住这个值,并作为初始化流和响应流的默认值。如果没有包括 这个属性,接受实体应当为两个流使用配置的默认值,必须包含在响应流的头部。如果开始实体包括'xml:lang'属性,接受实体不能修改或删除它。
   f, version: 最少为"1.0"
总结如下:
            | initiating to receiving | receiving to initiating
   ---------+---------------------------+-----------------------
   to       | hostname of receiver     | silently ignored
   from     | silently ignored         | hostname of receiver
   id       | silently ignored         | session key
   xml:lang | default language         | default language
   version | signals XMPP 1.0 support | signals XMPP 1.0 support

        xmpp介绍与RFC3920学习(3)
1, Namespace Declarations(命名空间声明)
    流元素必须拥有流命名空间声明和默认命名空间声明.
    XMPP是一个简单的为了交换结构化信息而流化XML单元的专用协议,由于XML不需要解析任意和完全的XML文档,所以XMPP不需要支持下列XML特性。
a, comments(注释)
b, processing instructions(处理指令)
c, internal or external DTD subsets (内部或外部DTD子集)
d, internal or external entity references (内部或外部实体引用)
e, character data or attribute values containing unescaped characters
(字符数据或属性包含保留的字符)
2,XML Namespace Names and Prefixes(XML命名空间名称和前缀)
命名空间的基本功能是区分混在一起的词汇的词义。也就是分割为不同的词汇表。
a, Streams Namespace(流命名空间)
流命名空间声名必须在XML流头,流命名空间的名称一定是'http://etherx.jabber.org/streams'. <stream/>和它的字节点<features/><error/>必须符合流命名空间前缀,
b, Default Namespace(默认命名空间)
默认命名空间声明是必须的,使用于根流节点的第一级的子元素。在初始化流和响应流之间,命名空间声明必须相同,默认命名空间声明应用在流和流上的所有的节。
一个服务器实现必须支持下列两个默认命名空间:
o jabber:client -- 当在客户端和服务器通信时,这个默认命名空间被流使用。
o jabber:server -- 当在服务器之间通信时,这个默认命名空间被流使用。
一个客户端的实现必须支持'jabber:client'默认命名空间,

3,Stream Errors(流错误)
规则:a,假定所有的流级别的错误都是不可重现的,因此在流级别的错误发生时,实体发现错误时,必须发送给对方一个流错误。发送一个关闭</stream>标签。然后终止下层的TCP连接。
      b,如果错误发生在流建立的时候。接受实体必须发送开始标签<stream>,并包含<error/>子元素还有关闭标签</stream>,然后终止下层的TCP连接。
4, Simplified Stream Examples(简单的流示例)
C:客户端 S:服务器端
一个正确例子,
A basic "session":
C: <?xml version='1.0'?>
<stream:stream to='example.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
S: <?xml version='1.0'?> <stream:stream from='example.com' id='someid' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
... encryption, authentication, and resource binding ...
C: <message from='juliet@example.com' to='romeo@example.net' xml:lang='en'>
C: <body>Art thou not Romeo, and a Montague?</body>
C: </message>
S: <message from='romeo@example.net' to='juliet@example.com' xml:lang='en'>
S: <body>Neither, fair saint, if either thee dislike.</body>
S: </message>
C: </stream:stream>
S: </stream:stream>

5 一个发生错误的例子(缺少关闭标签)
A "session" gone bad:
C: <?xml version='1.0'?>
<stream:stream to='example.com' xmlns='jabber:client' xmlns:stream=' http://etherx.jabber.org/streams'
S: <?xml version='1.0'?> <stream:stream from='example.com' id='someid' xmlns='jabber:client' xmlns:stream=' http://etherx.jabber.org/streams' version='1.0'>
... encryption, authentication, and resource binding ...
C: <message xml:lang='en'> <body>Bad XML, no closing body tag! </message>
S: <stream:error> <xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
</stream:error>
S: </stream:stream>
version='1.0'>
                      2006.1.21 litzhang
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值