关于中文域名

文章来源:
http://www.cnblogs.com/mvperic/archive/2013/02/21/2921019.html

在发现我国 CNNIC ROOT 根证书已经悄无声息混进微软 Windows 操作系统受信任的根证书颁发机构和 Firefox 火狐浏览器受信任证书列表中的事实之后(敏感话题,不再过多谈及,只是希望某机构不要做出 MITM 的劣行),我逛了逛 CNNIC 的网站,发现他们在忙着推广”英文/数字.中国”域名的推广。这令我又想起了中文域名这个话题,以及当年 3721 和 CNNIC 的一些变故。当然,那些年的那些破事儿不值得一提,值得一提的一个话题是浏览器对国际域名(IDN)的支持,和其中涉及到的技术。

在看了一些”.中国”域名的例子后,发现新华网(http://www.xinhuanet.com)已经注册并使用了中文域名”新华网.中国”。于是我使用 IE10 浏览器访问了 http://新华网.中国

IE10 浏览器在检测到国际域名后,会在地址栏的右侧显示一个”字/A”的图标,点击该图标后,我们可以看到该国际域名的详细信息:

由上图可见,当前使用的字符集为哈尼,该国际域名的国家为中国,母语的域名为”新华网.中国”,编码后的域名为”xn--xkrr14bows.xn--fiqs8s”. 我们能在地址栏中正常显示母语地址,是因为我的系统安装了中文语言。

通过上面的简述解释,不难会意出,国际域名指的是浏览器地址栏中以非 ASCII 字符集或字母显示的 Web 地址。这允许各个国家的网站使用本地语言和字符集显示其地址。其实微软从 IE7 开始,就已经能够由浏览器处理国际域名了。所谓”处理”,就是指浏览器将用户输入的非英文的域名转换为编码后的英文格式。好,这里就涉及到一个问题,为什么要编码转换

我们知道,域名是访问网站的捷径,因为网站的 IP 地址太难于记忆,而简短且富有语义的域名字符,更加便于记忆和使用。可是要访问到具体的网站,还是得知道该网站的 IP 地址,那么就需要一个中间机构,能将域名转换为对应的 IP 地址。这个中间结构就是 DNS 域名服务器,而转换的过程我们称之为”解析”。域名服务器上记录了注册的域名和网站 IP 地址的对应关系,所以,访问网站时,键入的是域名,可域名服务器已经通过查询自己记录的域名-IP映射关系,对用户透明地将域名转化为了 IP 地址,于是用户最终访问到了这个网站。(实际的中间过程会比这里简述的复杂,可以解释得更为详细)

DNS最早于1983年由 Paul Mockapetris 发明,原始的技术规范在 RFC 882 中发布。1987年发布的第1034和1035号草案修正了DNS技术规范,并废除了之前的第882和883号草案。在此之后对因特网标准草案的修改基本上没有涉及到DNS技术规范部分的改动。互联网域名一开始就是以英文 ACSII 字符(的子集)命名和提供注册的,2008年,ICANN(一个国际互联网组织,负责 IP 地址空间分配、协议标识符指派、通用顶级域名及国家和地区顶级域名系统管理、根服务器系统管理)通过一项决议,允许使用其它语言作为互联网顶级域名的字符。但是通用标准的 DNS 域名解析系统从设计到今天,都不能解析非英文 ASCII 字符,这就是为什么要在国际域名开放注册和投入使用后,要将国际域名编码转换为 ASCII 字符的原因。简言之,就是为了与 DNS 系统兼容。(其实还有一个重要原因,是为了防范IDN homograph attack, 即国际域名同形异义字欺骗攻击,又称 IDN 欺骗,本文不赘述。)

既然国际域名已经开始使用,浏览器提供这种编码转换功能,将国际域名中各个国家不同文字形成的域名转换成特定的用一些 ASCII 英文字符表示的域名,是理所应当的,这样,用户便不再需要安装一些加载项和工具栏来进行转换,就能直接访问国际域名。世界上有这么多的国家和语言文字系统,将他们各自语言文字的域名转换为英文后,还得确保都是唯一的,就得运用同一种编码规则,而且这种编码既然是用于互联网的域名解析系统的,就得使转换后的编码不至于太长,且能够抵御 IDN 欺骗。现在,这种统一的编码已经存在,它就是 Punycode.

Punycode 是一个根据 RFC 3492 制定的编码系统,主要用于把域名从地方语言所采用的 Unicode 编码转换成为可用于 DNS 系统的编码。该编码根据由 IANA 提供的域名相异字表制定,它可以在 Unicode 序列和 ASCII 字符串之间进行唯一和可逆的转换,转换过程中,Unicode 序列中的 ASCII 字符保持不变,国际化字符则用字母和数字表示。它可以防止 IDN 欺骗。

简单地看看 Punycode 的一个例子,新华网.cn 的 Punycode 就是 xn--xkrr14bows.cn, “新华网”三个字从中文转化为 xn--xkrr14bows,而分隔符”.”不变,英文字母”cn”也不变。如果后缀不是”.cn”, 而是”.中国”,那么分隔符”.”仍不变,”中国”编码为 xn--fiqs8s。既然 DNS 处理的仍旧是不包含国际字符的 Punycode,国际字符是通过浏览器转换成 Punycode 的,那我们访问 http://xn--xkrr14bows.xn--fiqs8s 等同于访问 http://新华网.中国。注意,国际字符命名的域名和转换后的 Punycode 这两者是一回事儿,是同一个域名,而新华网的英文域名http://www.xinhuanet.com 是另一个注册的域名,只不过这两个域名都指向新华网网站服务器。根据 Punycode 编码规则,英文和数字不变,因此新华网的英文网址经过 Punycode 编码后,仍是它本身。

可能有聪明的朋友会问到,为什么不升级 DNS 服务器的 DNS 程序,让它能直接处理不同语言文字的国际域名呢?其实这不是一个技术问题,而是现实生活中,有太多的域名服务器,他们都同时在支持国际互联网这个超级大的生产环境,如果要升级,就得同时升级所有的 DNS 服务器,才能确保直接解析国际域名的功能可用,如果升级了一部分,就会导致新的服务问题。就像是 Windows 操作系统的新版本始终得保留一些对旧有系统中程序的兼容性。要彻底淘汰一个东西,可能需要通过很多版本对某一功能进行演化之后,让这个功能与多年前大不同,并且几乎没有人再用多年前的那套东西后,才能淘汰。这样的例子还有很多,例如虽然现有的 IPv4 地址都已经分配完了,没有新地址空间了,但是大家都迁移到 IPv6 还需要很长的时间,没有人能确切地说,什么时候才能彻底淘汰 IPv4 的应用。因此,发明 Punycode 并且让浏览器来讲国际域名转换为 Punycode 是成本低且高度兼容的做法,因此被实施。

好了,说到这里,您应该知道了,国际域名其实还是转换为了 ASCII 字符中的一些英文字母、数字和部分符号。国际域名的使用同样需要向域名注册机构申请注册,其实域名注册机构那里和 DNS 系统中保存的不是国际字符,而是 Punycode。现代浏览器大多都支持将国际字符按照规则转化为 Punycode 后再发送给 DNS 服务器查询。而域名中的”.”点分隔符只是起到分隔符的作用,如果您键入的是中文分隔符句号”。”,一样不影响。如果您可以正常访问http://新华网.中国,或者http://新华网。中国,说明您的浏览器至少是支持将中文转化为 Punycode 的,不妨试试~

发表评论

电子邮件地址不会被公开。 必填项已用*标注