RFC6122

来自Jabber/XMPP中文翻译计划
(版本间的差异)
跳转到: 导航, 搜索
(Stringprep的重用)
(地址欺骗)
第153行: 第153行:
  
 
===地址欺骗===
 
===地址欺骗===
 +
 +
有两种形式的地址欺骗: 锻造和模仿.
 +
 
====地址锻造====
 
====地址锻造====
 
====地址模仿====
 
====地址模仿====

2013年1月22日 (二) 10:13的版本


"本文的英文原文来自RFC 6122

互联网工程任务组(IETF) P. Saint-Andre
申请讨论: 6122 Cisco
更新: 3920 2011年3月
类别: 标准跟踪
ISSN: 2070-1721
可扩展的消息和出席信息协议 (XMPP): 地址格式

摘要

本文定义了可扩展的消息和出席信息协议(XMPP)中使用的地址的格式, 包括支持非ASCII的字符串. 本文更新了 RFC 3920.

本文的状态

这是一个互联网标准跟踪文档.
本文是互联网工程工作组(IETF)的一个成果. 它代表了IETF社区的一致意见. 它已经公开审核并由互联网工程控制组(IESG)批准发布了. 更多关于互联网标准的信息请参见RFC 5741第2章.
关于本文当前状态的信息, 任何错误, 以及如何对它提出反馈,请到 http://www.rfc-editor.org/info/rfc6122 .

版权通知

Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.

目录

序论

概述

可扩展的消息和出席信息协议(XMPP)是一个 XML 应用规范,用于在任意两个或多个网络实体之间接近实时的传输XML数据流. XMPP实体的地址格式在1999年就已经 由Jabber开源社区开发出来, 第一次出现在 XEP‑0029 中是2002年, 规范化定义是2004年的 RFC3920 .

正如RFC 3920中所定义的, XMPP地址格式重用了 "stringprep" 技术来预备非ASCII字符串 STRINGPREP , 包括用于国际化域名的名字空间规范,定义于 NAMEPREPIDNA2003 ,对应于两个XMPP特有的用于 localpart(本地部分) 和resourcepart(资源部分)的规范.

由于RFC 3920的发布, IDNA2003被IDNA2008取代 (见 IDNA‑PROTO , 它不是基于stringprep的. 随着IDNA社区的倡导, 其他使用stringprep的技术社区开始讨论从stringprep迁移到更"现代的"方法. XMPP社区(主要是 PRECIS 工作组)为了寻找RFC3920中定义的stringprep中的Nodeprep和Resourceprep的替代品,参与了那些讨论. 因为XMPP修订文档的所有其他问题都合并到 XMPP 了, XMPP工作组决定暂时分离出XMPP地址格式到一个独立的文档,这样不会延迟改进的XMPP文档的发布. 一旦新的国际化地址的预备和比较方法被完成,预期本文将被废弃.

所以, 本协议提供更正过的XMPP地址格式文档,使用2004年可用的国际化技术(当时RFC 3920发布了). 尽管本文主要参考了 IDNA2003NAMEPREP , 但是鼓励XMPP软件开发者开始迁移到IDNA2008 (见 IDNA‑PROTO 以及相关文档) ,因为将来取代本协议的新协议将使用IDNA2008而不是IDNA2003.

本文更新了RFC 3920.

术语

本文使用的很多重要术语定义于 IDNA2003 , [RFC6122#STRINGPREP|STRINGPREP]] , UNICODE , 和XMPP .

本文的关键字 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 和 "OPTIONAL" 的解释参见 RFC 2119 关键字 .

地址

基础

一个XMPP实体就是任何可网址化并能使用XMPP通讯的东西. 由于历史原因, 一个XMPP实体的本地地址叫Jabber身份或JID. 一个合法的JID就是一个 UNICODE 代码所代表的字符串, 使用 UTF‑8 编码, 结构顺序是 localpart(本地部分), domainpart(域部分), 和resourcepart (资源部分)(这里前两个部分使用 '@' 字符分割, 而后两个部分使用 '/' 字符分割).

JID的语法定义如下,使用增强巴科斯-诺尔范式(ABNF).

   jid           = [ 本地部分 "@" ] 域部分 [ "/" 资源部分 ]
   本地部分        = 1*(节点)
                   ;
                   ; 一个 "节点" 就是一个UTF-8编码的Unicode代码点
                   ; 这个点满足 stringprep 中的 Nodeprep 范例
                   ;
   域部分         = IP文字 / IPv4地址 / 合法域名ifqdn
                   ;
                   ; "IPv4地址" 和 "IP文字" 规则 定义于 RFC 3986,
                   ; 匹配过程应用 RFC 3986 定义的
                   ; 先到先得匹配(又名 "贪婪的") 机制
                   ;
                   ; 注意从RFC 3986中对于 IP文字规则的重用
                   ; 意味着 IPv6地址由方括号包住
                   ; (也就是, 用 '[' 开始用 ']' 结束), 
                   ; 这个 RFC 3920 不管了
                   ;
   ifqdn         = 1*(名字点)
                   ;
                   ; 一个 "名字点" 就是一个UTF-8编码的Unicode码点,
                   ; 符合 stringprep 的 Nameprep 规范
                   ;
   resourcepart  = 1*(资源点)
                   ;
                   ; 一个 "资源点" 就是一个UTF-8编码的Unicode码,
                   ; 符合 stringprep 的 Resourceprep 规范
                   ;

所有JID都是基于上述结构.

一个JID的每个允许的部分 (本地部分, 域部分, 和资源部分) 的字节数必须不(MUST NOT)为零并且必须不(MUST NOT)大于1023, 也就是总的最大字节数 (包含 '@' 和 '/' 分割符) 为3071.

为了达到通过一个XMPP网络(例如, 一个XMPP节的 'to' 或 'from' 地址)来通讯的目的, 实体的地址必须(MUST)展现为一个JID, 而不是统一资源标识符 URI 或 国际化资源标识符 IRI . 一个 XMPP‑URI 本质上是一个JID带上一个 'xmpp:' 前缀; 无论如何, 用于XMPP的本地地址格式仅仅是一个不带URI方案的JID. XMPP‑URI 仅被用于XMPP自身的上下文在外部的标识和交互, 例如当从一个web页面连接到一个JID. XMPP‑URI 描述了这个如何安全的从一个XMPP URI 或 IRI 提取出一个JID的过程.

实现备注: 当把一个JID分解成它的各个部分时, 一个应用在使用任何转换机制之前需要匹配分隔符 '@' 和 '/' , 因为转换可能导致把特定的Unicode码点分解成分隔符(例如, U+FE6B SMALL COMMERCIAL AT 可能分解成 U+0040 COMMERCIAL AT).

域部分

一个JID的域部分就是 '@' 符号(如果有这个符号)后面和 '/' 符号(如果有)前面的部分; 它是一个主要的标识符并且是一个JID唯一必需的(REQUIRED)元素(仅仅是域部分就可以成为一个合法的JID). 一个典型的域部分标识了客户端连接的 "家" 服务器,它用来做XML路由和数据管理功能. 无论如何, 一个XMPP域部分不一定就是标识一个提供核心XMPP服务功能的实体 (例如, 一个域部分可能标识其他实体,例如一个多用户聊天服务, 一个发行-订阅服务, 或一个用户目录).

每个XMPP服务的域部分必须(MUST)是一个完全规范的域名(FQDN; 见 DNS ), IPv4地址, IPv6地址, 或自定义的主机名(也就是说, 一个文本标签,可在本地网络解析).

互操作性备注: 域部分是IP地址,可能无法被其他服务接受来进行服务器到服务器的通讯, 域部分是自定义的主机名不能用于公共网络,因为它只能被本地网络解析.

如果域部分的最后一个字符被认为是 IDNA2003DNS 中的分隔标签 (点) , 在使用JID的域部分来路由一个XML节,和另一个JID做比较,或构建一个 XMPP‑URI 之前,必须把这个字符从域部分剥离出来. 特别是, 在进行任何其他规范化步骤 (例如应用 STRINGPREPNAMEPREP 范本,或完成 IDNA2003 描述的转化成ASCII的操作)之前,这个字符必须剥离出来.

包含完全合格域名的域部分必须是一个IDNA2003定义的"国际化的域名"; 就是说, 它必须是"一个每个标签都是国际化标签的域名"并且必须遵循IDNA2003定义的国际化域名构造规则. 当准备一个文本标签(包括一系列的UTF-8编码的Unicode代码点)用于在构造XMPP域部分或比较两个XMPP域部分的过程中展示一个国际化标签, 应用必须确保每个文本标签可能应用于设置UseSTD3ASCIIRules标志(从而禁止除了字母,数字,和连字符的ASCII代码点)而不会出现IDNA2003定义的失败的ToASCII操作. 如果该ToASCII操作能被应用而不失败, 那么该标签是一个国际化标签. (注意: 该ToASCII操作包括STRINGPREPNAMEPREP范本的应用并且编码使用PUNYCODE定义的机制; 详细信息参见IDNA2003.) 尽管XMPP应用通讯在线上的输出不会超出ToASCII操作(所谓一个"ACE标签"), 它必须有可能应用那个操作而不会导致每个国际化标签的失败. 如果一个XMPP应用接收ACE标签输入, 它应该在把该标签包含进一个将在一个XMPP网络上进行线上通讯的XMPP域部分之前使用ToUnicode操作(见IDNA2003)把那个ACE标签转化为一个国际化标签(无论如何, 除了转换标签, 有合理的理由一个应用可以拒绝输入并返回一个错误给提供这些唐突数据的实体).

域部分的长度不能(MUST NOT)为零并且不能(MUST NOT)超过1023个字节. 在从stringprep的Nameprep范本的应用得到任何映射或正规结果之后,这个规则是强制的. 很自然, DNS的长度限制也适用, 并且本文中的解释没有覆写更多的根本限制.

在 IDNA2008 IDNA‑DEFS的术语中, JID的域部分是一个"域名插槽".

本地部分

JID的本地部分是一个可选的标识符,放在域部分的前面并且用'@'字符分隔开. 一个典型的本地部分唯一性地标识由服务器提供的请求和使用网络访问的实体(即, 一个本地帐号), 尽管它也代表其他种类的实体(例如, 一个和多用户聊天服务相关的聊天室). 由一个XMPP本地部分代表的实体的寻址则要看具体的域上下文(即, <localpart@domainpart>).

一个本地部分必须被格式化,使得STRINGPREP的Nodeprep范本能被应用而不失败(见 附录A). 在比较两个本地部分之前, 应用必须首先确保Nodeprep范本被应用于每一个标识符(该范本不需要每次做比较的时候应用, 因为在比较之前它已经被应用了).

本地部分的长度不能(MUST NOT)为零并且不能(MUST NOT)超过1023个字节. 在从stringprep的Nodeprep范本的应用得到任何映射或正规结果之后,这个规则是强制的. (例如, 在Nodeprep中,一些字符串可能被映射为空, 这可能产生一个长度为零的字符).

资源部分

JID的资源部分是一个可选的标识符,放在域部分的后面,以'/'符号分隔. 一个资源部分能改变<localpart@domainpart>地址或纯<domainpart>地址. 典型的一个资源部分唯一性地标识一个属于某域的某个本地部分相关实体的特定连接(例如, 一个设备或地点)或对象(例如, 一个多用户聊天室中的某个房客)(即, <localpart@domainpart/resourcepart>).

一个资源部分必须被格式化,使得STRINGPREP的Resourceprep范本能被应用而不失败(见 附录B). 在比较两个资源部分之前, 应用必须首先确保Resourceprep范本被应用于每一个标识符(该范本不需要每次做比较的时候应用, 因为在比较之前它已经被应用了).

资源部分的长度不能(MUST NOT)为零并且不能(MUST NOT)超过1023个字节. 在从stringprep的Resourceprep范本的应用得到任何映射或正规结果之后,这个规则是强制的. (例如, 在Resourceprep,一些字符串可能被映射为空, 这可能产生一个长度为零的字符).

信息备注: 由于历史原因, 术语 "资源标识符" 在XMPP中经常被用于代表一个XMPP地址的可选部分,跟随在域部分之后的"/"分隔符后面; 为了帮助防止混淆XMPP "资源标识符" 和 URI的的章节1.1中的"资源" 的含义以及 "标识符"的含义, 本协议使用术语"资源部分"来替代之前的"资源标识符" (在RFC 3920中).

XMPP实体应该把资源部分当成不透明的字符串并且不应该(SHOULD NOT)推诿含义给任何给定的资源部分. 特别是:

  • 在域部分和资源部分之间使用'/'符号作为分隔符不代表XMPP地址是以那种方式分层的, 也就是说像HTTP地址那样分层; 所以,举例来说,一个格式为<localpart@domainpart/foo/bar>的XMPP地址不代表一个资源"bar"在一个和实体"localpart@domain"相关的资源层级中位于一个资源"foo"之下.
  • '@'符号被允许出现在资源部分并且经常在XMPP聊天室中被用于显示"昵称". 例如, JID <room@chat.example.com/user@host> 描述了一个实体,它是房间<room@chat.example.com>的房客,(声称的)昵称为<user@host>. 无论如何, 聊天室服务不必要怎对该房客的真实JID来检查这样一个被声称的昵称.

国际化事项

XMPP服务器必须, XMPP客户端应该, 对域部分支持IDNA2003(包括STRINGPREPNAMEPREP范本), 对本地部分支持STRINGPREPNodeprep范本, 以及对资源部分支持STRINGPREPResourceprep范本; 这使得XMPP地址能包含各种超出US-ASCII范围的字符串. XMPP地址的强制性规则在XMPP中提供.

安全事项

Stringprep的重用

STRINGPREP中描述的安全性事项适用于本文中定义的XMPP本地部分和资源部分的NodeprepResourceprep范本. STRINGPREPNAMEPREP中描述的适用于Nameprep范本的安全性事项在这里被重用于XMPP域部分.

Unicode的重用

UNICODE‑SEC中描述的安全性事项适用于在XMPP地址中使用Unicode字符串.

地址欺骗

有两种形式的地址欺骗: 锻造和模仿.

地址锻造

地址模仿

个人工具