英语原文共 6 页,剩余内容已隐藏,支付完成后下载完整资料
可扩展消息和存在协议
摘要 - 可扩展消息和呈现协议(XMPP)是基于XML的即时消息传递协议套件。 XMPP是开放协议,它的根在开放的即时消息软件Jabber上。 在本文中,我们介绍了在两个rfc文档中定义的基本XMPP功能,即rfc 3920和rfc 3921。
索引术语 - 即时消息,可扩展消息传送和呈现协议XMPP
历史
Jabber - 第一步
Jeremie Miller于1999年1月发布了Jabber。这是一个在开发阶段即时消息和存在的开放技术。大约一年后(2000年2月),IETF的IMPP工作组(Instant Messaging and Presence Protocol)发布了其工作结果:RFC 2778和RFC 2779.第一个包含一个即时消息和存在系统的模型[1],第二个是一组对此类系统的要求[2]。
由于观点不同,IMPP工作组从未制定过任何真正的协议。 Jabber社区制作了一个记录Jabber协议的互联网草案,。 不连贯的Jabber社区从未更新过草稿,因此已过期。即使如此,Jabber仍然在快速开发,并且在2000年10月发布了jabberd 1.2版(Jabber服务器)。 XMPP历史的时间线如图1所示。[3]
组织
Jabber软件基金会(JSF)成立于2001年8月,负责协调Jabber中使用的基于XML(可扩展标记语言)协议的开发和文档。 随着更强大和更一致的组织,Jabber软件基金会最终成功地和IETF一起使Jabber协议更加官方。
2002年2月,JSF向IETF提交了关于Jabber的Internet草案。 结果是很有希望的,并于2002年6月又提交了另外三份互联网草案。 在这些草案中,JSF为Jabber协议套件发布了新的中性名称:可扩展消息传送和呈现协议,XMPP。 很快XMPP工作组章程提交给IESG(互联网工程指导组),并于2002年10月批准了XMPP工作组。
XMPP工作组对草案进行了一些安全性和内部化增强。同时,JSF还使用了几个JEEP(Jabber增强方案),它们基本上是对XMPP的扩展。
2004年10月,IETF和XMPP工作组发布了四个RFC。 RFC 3920涵盖了核心XMPP。即时消息和状态支持在RFC 3921中进行了描述。另外两个RFC(RFC 3922,RFC 3923)涵盖了XMPP到CPIM的映射(即时消息的通用配置文件,RFC 3860) XMPP的端到端签名和目标加密。
介绍
架构
通常XMPP用于普通的客户机-服务器体系结构,但这不是必须的。 例如也可以使用直接客户端-客户端XMPP通信。通常XMPP在TCP之上使用,但也可以与其他协议一起使用。
图2给出了XMPP即时消息网络的一个示例。网络可以有多个XMPP客户端和服务器。还有一个XMPP网关,允许其他IM网络的用户与XMPP用户通信。服务器在XMPP中的主要角色是管理到客户端和其他服务器的连接和XML流。服务器还在XMPP网络中的XML流中路由XML节。在我们的示例(图2)中,XMPP服务器1正在路由发送到XMPP客户端2的所有节。因特网分配号码管理局(IANA)已为xmpp服务器到服务器连接注册了tcp端口5269[4]。
客户端正在启动与服务器或其他客户端的连接。 IANA为XMPP客户端连接注册了TCP端口5222,并且通常使用TCP进行连接,但也有其他方法。 例如,如果其他主机支持,则可以使用HTTP轮询。
寻址和JID
统一资源标识符(URI)是一种紧凑的字符串,用于标识资源。[5]。 XMPP网络中的每个Entinty(例如客户端)都具有符合URI的地址,该地址由于历史原因而被称为JID(Jabber ID)。 用户的连接资源(客户端)具有lt;user @ host / resourcegt;的JID形式,其中资源是可选的。 还有其他形式,例如lt;chatroom @ servicegt;或lt;chatroom @ service / nicknamegt;。 前者可用于解决特定服务的聊天室问题,后者则用于解决特定服务的聊天室中的昵称问题。
Jabber ID可以由三部分组成:节点,域和资源(nodersquo;@rsquo;domainrsquo;/rsquo;resource)。 JID部分的长度有一些限制,但限制并不令人不安。 任何部分的最大长度为1023字节,因此JID的最大大小(包括分隔符#39;@#39;和#39;/#39;)为3071个字节。
JID的唯一必需部分是域,其他两个是可选的。 域标识符可以是IP地址,但建议使用完全限定的域名(FQDN)。节点标识符是可选的,通常代表客户端,但它也可以用来表示多用户服务的聊天室。 资源标识符通常代表会话,连接或对象。
流和节
所有XMPP通信都是在XML流内完成的。当客户端建立与服务器(或与其他客户端)的连接时,它将打开一个XML流。 然后另一台主机将另一个流打开回原始主机,因此每个正在运行的XMPP连接都有两个XML流,每个方向一个。
XML流是允许在网络中的两台主机之间交换XML元素的容器。 流就像普通的XML文档,它具有整个会话的大小。 在流内发送的所有消息都在构建文档,因此流在关闭之前不是完整的XML文档。 XML流的根元素是lt;stream /gt;。 流用于将节从一个主机发送到另一个主机。 节是第一级子元素,并且有三个核心节类型:lt;message /gt;,lt;presence /gt;和lt;iq /gt;。
一个简化的XMPP流的示例:
lt;streamgt;
lt;message to=rsquo;somebodyrsquo;gt;
lt;bodygt;Hello!lt;/bodygt;
lt;/messagegt;
...
lt;/streamgt;
稍后有更详细的这些节的描述。
流协商
让我们假设客户端已经建立到服务器的TCP连接。然后,客户端通过发送XML版本元素(如lt;?xml version =#39;1.0#39;?gt;和打开的lt;streamgt;元素)开始流协商。服务器响应lt;?xml version =#39;1.0#39;?gt;并使用其自己的lt;streamgt;元素打开流向相反的方向。实际上,lt;streamgt;元素需要名称空间声明,所以在lt;streamgt;元素中有stream:前缀,而完整的元素名称是lt;stream:streamgt;。
流属性在lt;streamgt;元素中定义。属性包括名称空间和版本信息。当服务器使用lt;streamgt;元素进行响应时,它会向lt;stream:featuresgt;元素内的客户端发送STARTTLS请求。
成功的TLS协商客户端启动到服务器的新流之后。服务器像以前一样响应,但不再提供TLS。请求启动SASL协商包含在服务器响应中,有点像之前描述的TLS请求。如果TLS协商失败,服务器只需关闭TCP连接。
TLS
TLS协议(传输层安全性)在RFC 2246中进行了规定。它提供加密并防止客户端 - 服务器通信内的数据篡改[6]。 TLS的细节超出了本文的范围,但我们描述了如何在XMPP中协商TLS握手。 XMPP的序列TLS协商如图3所示。
- 启动实体(例如XMPP客户端应用程序)打开与接收实体(XMPP服务器)的TCP连接,并通过发送lt;stream:streamgt;元素启动XML流。
- 接收实体(XMPP服务器)打开TCP连接,发送XML流头和lt;stream:featuresgt;元素以及支持的流特征列表,包括STARTTLS扩展名。 如果TLS被配置为接收实体的必需特性,则它应该包含lt;required /gt;作为lt;starttlsgt;元素的子元素。 lt;stream:featuresgt;元素的一个例子:
lt;stream:featuresgt;
lt;starttls xmlns=
rsquo;urn:ietf:params:xml:ns:xmpp-tlsrsquo;gt;
lt;required/gt;
lt;/starttlsgt;
...
3)启动实体,然后通过发送
lt;STARTTLS xmlns=
lsquo;urn:IETF:params:xml:NS:XMPP-TLSrsquo;/gt;
来发出STARTTLS命令,到接收实体
4)接收实体以
lt;proceed xmlns=
rsquo;urn:ietf:params:xml:ns:xmpp-tlsrsquo;/gt;
元素答复。 如果发生故障(在starttls阶段),接收实体应答lt;failure /gt;元素并终止TCP连接。
5)在lt;proceed /gt;元素发送后,双方停止发送XML元素,并通过现有的TCP连接启动TLS协商。
6)如果TLS协商不成功(A)接收实体终止TCP连接。 否则(B)初始实体向接收实体打开新的XML流,就像在第一步一样,但是使用现有的TCP连接。
7)接收实体通过在第二步发送新的流标题来回复,但省略了STARTTLS部分。
下一步启动实体继续进行SASL协商。
SASL
简单认证和安全层(SASL)在RFC 2222中定义。它可以用来为基于连接的协议添加认证[7]。 就像TLS一样,SASL的细节超出了本文的范围,但我们提供了XMPP的SASL协商的简要说明。 以下SASL协商序列如图4所示。
- SASL协商开始于成功设置TLS时打开的新XML流的XML流标头。 第一个启动实体发送版本号为1.0的流元素。
lt;stream:stream
...
version=rsquo;1.0rsquo;gt;
2)接收实体用流标题和流特征来响应。
lt;stream:stream
...
version=rsquo;1.0rsquo;gt;
lt;stream:featuresgt;
lt;mechanisms xmlns=
rsquo;urn:ietf:params:xml:ns:xmpp-saslrsquo;gt;
lt;mechanismgt;
DIGEST-MD5
lt;/mechanismgt;
lt;mechanismgt;
EXTERNAL
lt;/mechanismgt;
lt;/mechanismsgt;
lt;/stream:featuresgt;
3)发起实体选择认证机制并将其发送给接收实体
lt;auth xmlns=
rsquo;urn:ietf:params:xml:ns:xmpp-saslrsquo;
mechanism=rsquo;DIGEST-MD5rsquo;/gt;
4)接收实体发送base 64编码(仅使用US-ASCII字符[8]传输数据的方法)询问
lt;challenge xmlns=
rsquo;urn:ietf:params:xml:ns:xmpp-saslrsquo;gt;
...
lt;/challengegt;
- 初始实体发送base64编码响应
lt;response xmlns=
rsquo;urn:ietf:params:xml:ns:xmpp-saslrsquo;gt;
...
- lt;/responsegt;
- 在必要时交换更多的询问/响应。
所需询问/响应对的数量取决于所使用的身份验证机制。身份验证的结果可以是lt;Success/gt;、lt;ABORT/gt;(由发起实体发送)或lt;Failure/gt;(由接收实体发送)。在失败的情况下,有一个原因代码包括在子元素中,例如lt;NOTENALATED/gt;。在SASL谈判失败或中止期间,应该可以进行合理数量的重试(例如,从输入密码错误中恢复),但如果身份验证失败,接收实体必须终止TCP连接。
如果认证成功,则接收实体向发起实体发送lt;success /gt;元素。当接收实体发送lt;success /gt;元素时,它认为现有的XML流关闭,并等待新流的流头。因此,另一个XML流在接收到lt;success /gt;元素时由发起实体打开,并将相应的流头发送给接收实体。接收实体响应流头和特征列表(可能为空),这次没有STARTTLS的信息扩展或SASL。
节
流成功打开后,包括SASL协商和可能的TLS协商,可以通过流发送XML节。节可以与命令或操作相比较。有三个为jabber定义的基本节:client和jabber:服务器空间名称 lt;message /gt;,lt;iq /gt;和lt;presence /gt;。
这三个节有五个共同的属性。 Allattributes并不总是存在。
1)to指定节的接收者。
2)from指定节的发送者。 当服务器收到一个节时,它应该检查#39;from#39;属性的有效性。服务器可以在
全文共14237字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[13263],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。