前言
在百忙之中抽空更新!
这篇博客主要来总结分享一下关于“域名”这个东西的一些概念和机制。起因其实是承接着我给博客搬家的那个故事,在搬家日记那篇博客中,我提到了我新买了几个域名,并且把它指到了不同的站点。
作为普通的互联网用户,我们用到域名时一般需要接触以下过程:
- 在注册商那里购买域名。
- 配置 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 |
它总共有四级,每一级(即 .ccc
,bbb.ccc
,aaa.bbb.ccc
,当然还有一个 .root
)都有自己的 NS 记录,这个记录指向这一级域名的域名服务器。而当前这级的服务器需要知道下一级域名的各种记录。
比如这个域名的解析过程是这样的:
- 解析器获取根域名的 13 条 NS 记录。
- 向所有根域名服务器查询顶级域名
.ccc
的 NS 记录。 - 向这些顶级域名服务器发送请求,寻找
bbb.ccc
的 NS 记录。 - 向上一步得到的 NS 记录里发请求,最后查询到可行的 A 记录。
关于根服务器
上面说了,任何 DNS 一开始都是从 13 条根域名的 NS 记录出发的,也即只有 13 个不同的 IP 地址用来查询根服务器网络(注意,并不是只有 13 台根服务器!)。
这 13 个地址一般都被写死在了任何一个 DNS 解析器的代码里。大概是长这样的:
1 | NS m.root-servers.net. |
域名选购
域名注册服务商
我们在购买域名时,都需要从域名注册服务商处购买,这些服务商会帮我们完成注册域名的过程,往往还会配套提供解析服务。由于它们也要赚钱,所以这个注册服务也是要一定手续费用的,这导致不同平台的域名售价可能会不一样。几个比较出名的注册商有:
- Godaddy,这是世界上最大的域名注册服务商。
- Namecheap,价格相对比较便宜
博主的域名几乎都是在腾讯云买的,之前也是不懂事入了坑,后面后悔了也没办法了(只能等域名过期了再到别处买了)。国内的这些服务商也有好处,就是他们往往一整套服务都有提供,从域名购买到解析服务,再到 SSL 证书等等。最大的坏处就是需要把域名注册在国内,这确实会有一些麻烦。
关于价格
不同域名的价格波动很大。一般来说,越短越贵,有些有特殊含义的域名甚至具备一定的投资价值。
对于我们这些普通用户来说,如果一级域名比较生僻(比如我的 ID siriusneo
,基本不会重名),那么价格当然也会很低。这样的话主要价格差异其实就取决于你选择的顶级域名了。像 .com
是很贵的,而 .me
,.top
这种的就相对便宜很多。
以上就是本篇博文的全部内容啦,希望对你有帮助!