君の名前は?——漫谈域名

| Views: | Total Words: 9.2k | Reading Time: 8 mins.

前言

在百忙之中抽空更新!

这篇博客主要来总结分享一下关于“域名”这个东西的一些概念和机制。起因其实是承接着我给博客搬家的那个故事,在搬家日记那篇博客中,我提到了我新买了几个域名,并且把它指到了不同的站点。

作为普通的互联网用户,我们用到域名时一般需要接触以下过程:

  • 在注册商那里购买域名。
  • 配置 DNS 解析,如果在国内的话可能还有备案等问题。
  • 如果把域名解析到了自己的服务器上,可能还要配置服务器上反向代理服务器(比如 Nginx)针对不同域名的分发。

下面我们来一步步科普这个过程中的知识。


IP 地址

在讲域名之前,一定绕不过的一个话题就是 IP 地址。IP 地址相当于互联网中的”身份证“,在互联网协议中给每个设备规定了一个唯一地址。这种唯一标识符在网络通信中是必要的(不然你怎么指代你想要发送的地方呢)。

IP 地址不论是 V4 还是 V6,都是一串用点号分隔无规律数字,例如常见的路由器管理界面的本地 IP 地址:

1
192.168.1.1

但这并不方便我们去记忆它们,因此我们需要给他们起一些有意义的名称,这种手法在计算机科学中其实很常见的,最简单的例子就是枚举类型(Enum),使用有意义的符号来指代 0,1,… 等数字。

我们为了额外加上一层”有意义的名字“,要做的关键的事情其实就在于建立好”有意义名字“到”无意义代号“的映射,在枚举类型中这个映射是平凡的。而在网络中,我们也需要域名到 IP 地址的映射,因为真正用来在网络层进行寻址的是 IP 地址。这个映射过程被称作域名解析


域名

域名结构

域名本身是一段由字母和点构成的字符串。比如:

1
www.baidu.com

这就是一段域名。而这种

1
http://www.baidu.com

一般称为统一资源定位(Uniform Resource Locator,URL),即比域名更大的概念。一个 URL 除了域名以外,还包含:

  • 开头的协议部分

  • 主机名+端口号(localhost:8000),或者域名,或者IP地址

  • 虚拟路径,即第一个 / 开始的部分,这部分的语法和文件系统的目录路径是一致的,在语义上也相当于去访问相对于这个地址的“根”的相对路径。

  • URL参数,即用 ? 开头,若干 key=value 形式的串。比如 ?tag=xxx,得到的就是经过 tag=xxx 过滤后的结果。

这里我们不展开讲 URL 了,我们着重还是讲域名部分。

对于一个域名 www.baidu.com,我们发现它按点号被分为三段;但有的域名也不出现 www。这究竟是怎么回事呢?其实,这些域名按照从后往前的顺序,逐渐“降级”。让我们先从 .com 开始。

顶级域名

我们常见的“后缀”其实也是域名,比如 com 本身,不过这些域名一般不用来解析到具体的页面。

这其实很合理,试想在域名刚提出的时候,由于它是一个“名字”,自然不需要引入什么分隔符——一个字符串本身就是名字啊。因此这些域名被称作顶级域名(Top-Level Domain,TLD)

域名的管理由“互联网名称与数字地址分配机构(ICANN)”负责。一开始,ICANN 并不对外开放顶级域的注册,用户只能在现有的顶级域下(如 .com)申请自己的一级域名(有的地方叫做二级域名,而把顶级域名称作一级,不重要)。

不过在 2012 年 5 月,ICANN 开放了顶级域名的申请。但是这个申请的成本很高,而且我怀疑申请的审核也有一些门槛,导致基本上现在只有一些公司申请了自己的顶级域名,比如 .google.bing 等。(冷知识, www.bing 是可以访问的,它会被重定向到必应首页)。这其实一定程度上也是件好事,毕竟如果顶级域名太过泛滥,那么抢注现象肯定会非常严重。

子域名

说完了顶级域名,我们来讲子域名。众所周知,一根链由它的头部(head)和“下一个指针”(next)构成。对域名来说,头部就是上文说的顶级域名,而“next”则是这个子域名的概念,通常我们用 . 符号来分隔子域名和父域名。

我们上面提到过,普通用户一般申请不到顶级域名,取而代之的是不同顶级域名下的一级域名,即:

1
<一级域名>.<顶级域名>

比如我现在想要注册一个个人站,那么根据这个特点,我可能偏向选择 .me 顶级域名作为后缀,然后对于一级域名部分,我会偏向加上带有自己特色的字符串,比如直接用自己的 ID。那么我就会去注册 siriusneo.me

而在一级域名之下,我们还会有二级域名,三级域名等等。太多级就没啥意义了,不过二级域名相对于一级域名,还是很有意义的——它能标识不同的功能,比如说:

  • 我会把博客放在 blog.siriusneo.me 下;
  • 然后把自己部署的网盘放在 pan.siriusneo.me 下;

(不过实际上,我并没有买 .me,而是买了 .top。一个原因当然是便宜,不过另一个原因是这个域名的寓意也好。)

WWW

大家经常上网时,会发现自己输入域名的时候常常会要在前面加上 www.。其实,这也是一种子域名——按照格式来看就知道了。

那么为什么需要特地加一个这个呢?这里其实是一个命名习惯。上面说过,我们会用不同的子域名代表不同的功能,比如 blog. 代表博客,mail. 代表邮箱。这些功能很多其实并不是给浏览器访问的(也就是说没有“网页”),而只有少数域名是有一个面向浏览器的页面。对于这个“网页”,按照i管理我们就会将其命名为 www. 。所以这里的 www. 其实就是表示,这是一个网站服务器的域名。如果你不喜欢,也可以用 page. 或者 site. ,但是这是一个“大多数人”的惯例。

关于这个惯例到底是怎么来的呢?我们都知道,WWW 全称是 World Wide Web,即万维网。万维网指的就是通过浏览器和 HTML 网页建立起的网络——注意,这也就是说,万维网只是因特网提供的一项服务。提供了什么服务呢?说直白点,就是“网上冲浪”。而对于像 mail.xxx.com 这种邮箱服务器,我们直接用浏览器打开是没有意义的(这个服务器并不理会 HTTP 的 GET 和 POST 指令),这也就不在万维网的服务范畴里。

我小时候就经常搞混因特网和万维网,其实现在就非常清楚了。因特网是 Internet 的音译,即互联网,它提出了计算机网络的概念并把全世界的计算机连在一起。万维网是基于互联网建立起的一种服务,它让人们可以通过浏览器来访问各种网页。所以 www. 确实就是一个指代某种功能的二级域名。

不过现在大家都习惯不加 www. 了,因为默认的网站就是给人看的。作为一种兼容,大家都会把 www. 指向不带 www. 的域名。

根域名

这里补充一个小知识。一般来说,我们会把顶级域名当成最开始的一级域名。但其实,还有一层在其之上的最高层域名,我们一般叫做根域名。我们上述写的任何域名其实都要在后面加一个 .root。这一层在 DNS 分级解析的时候会体现出来。


域名解析

DNS

域名解析说到底,只需要维护一个从域名到 IP 地址的 Map 就可以了。这里 Map 里的每一条数据被称为一条记录

那么这个 Map 应该放在哪里呢?在实践中,我们用一个(或者说一类)服务器专门来做这件事,它们被称为域名系统(Domain Name System,DNS)。当然实际 DNS 有很多级缓存:高速缓存,浏览器缓存,操作系统缓存等等。

在真实世界里,有专门的服务商提供域名解析的服务,我们只需要给它们提供的域名服务器发请求就可以了,这种域名解析服务有免费的,也有付费的。

DNS 记录

上面为了好理解,简单地把记录定义为一个 Map 的 KV 键值对。不过实际上,一条记录还需要记很多格外信息,比如:

  • TTL:生存周期
  • Class:协议类型
  • Type:记录类型

等等。

关于记录类型,常用的有这么几种:

  • A:Address,将域名解析到一个 IPv4 的 IP 地址。
  • AAAA:同上,不过是 IPv6。
  • NS:Name Server,域名服务器记录,用于指定域名应该由什么 DNS 服务器解析。
  • MX:Mail eXchange,专为邮件设计的解析类型,返回接受邮件的服务器地址。
  • CNAME:Canonical Name,用于将一个域名跳转到另一个域名。
  • PTR:Pointer Record,逆向查询,即从 IP 地址查域名。

DNS 分级查询

这里多提一句关于 DNS 查询的机制,虽然对我们用户来说可能不用太关心,但还是蛮经典的一个知识,即 DNS 查询域名是分级进行的。

比如有如下域名:

1
aaa.bbb.ccc

它总共有四级,每一级(即 .cccbbb.cccaaa.bbb.ccc,当然还有一个 .root)都有自己的 NS 记录,这个记录指向这一级域名的域名服务器。而当前这级的服务器需要知道下一级域名的各种记录。

比如这个域名的解析过程是这样的:

  • 解析器获取根域名的 13 条 NS 记录。
  • 向所有根域名服务器查询顶级域名 .ccc 的 NS 记录。
  • 向这些顶级域名服务器发送请求,寻找 bbb.ccc 的 NS 记录。
  • 向上一步得到的 NS 记录里发请求,最后查询到可行的 A 记录。

关于根服务器

上面说了,任何 DNS 一开始都是从 13 条根域名的 NS 记录出发的,也即只有 13 个不同的 IP 地址用来查询根服务器网络(注意,并不是只有 13 台根服务器!)。

这 13 个地址一般都被写死在了任何一个 DNS 解析器的代码里。大概是长这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
NS	m.root-servers.net.
NS a.root-servers.net.
NS b.root-servers.net.
NS c.root-servers.net.
NS d.root-servers.net.
NS e.root-servers.net.
NS f.root-servers.net.
NS g.root-servers.net.
NS h.root-servers.net.
NS i.root-servers.net.
NS j.root-servers.net.
NS k.root-servers.net.
NS l.root-servers.net.

域名选购

域名注册服务商

我们在购买域名时,都需要从域名注册服务商处购买,这些服务商会帮我们完成注册域名的过程,往往还会配套提供解析服务。由于它们也要赚钱,所以这个注册服务也是要一定手续费用的,这导致不同平台的域名售价可能会不一样。几个比较出名的注册商有:

  • Godaddy,这是世界上最大的域名注册服务商。
  • Namecheap,价格相对比较便宜

博主的域名几乎都是在腾讯云买的,之前也是不懂事入了坑,后面后悔了也没办法了(只能等域名过期了再到别处买了)。国内的这些服务商也有好处,就是他们往往一整套服务都有提供,从域名购买到解析服务,再到 SSL 证书等等。最大的坏处就是需要把域名注册在国内,这确实会有一些麻烦。

关于价格

不同域名的价格波动很大。一般来说,越短越贵,有些有特殊含义的域名甚至具备一定的投资价值。

对于我们这些普通用户来说,如果一级域名比较生僻(比如我的 ID siriusneo,基本不会重名),那么价格当然也会很低。这样的话主要价格差异其实就取决于你选择的顶级域名了。像 .com 是很贵的,而 .me.top 这种的就相对便宜很多。


以上就是本篇博文的全部内容啦,希望对你有帮助!