域名里有哪些门道?

IP 协议的职责是“网际互连”,它在 MAC 层之上,使用 IP 地址把 MAC 编号转换成了四位数字,这就对物理网卡的 MAC 地址作了一层抽象,发展出了许多的“新玩法”。mysql

例如,分为 A、B、C、D、E 五种类型,公有地址和私有地址,掩码分割子网等。只要每一个小网络在 IP 地址这个概念上达成一致,无论它在 MAC 层有多大的差别,均可以接入 TCP/IP 协议栈,最终汇合进整个互联网。算法

但接入互联网的计算机愈来愈多,IP 地址的缺点也就暴露出来了,最主要的是它“对人不友好”,虽然比 MAC 的 16 进制数要好一点,但仍是难于记忆和输入。sql

怎么解决这个问题呢?数据库

那就“以其人之道还治其人之身”,在 IP 地址之上再来一次抽象,把数字形式的 IP 地址转换成更有意义更好记的名字,在字符串的层面上再增长“新玩法”。因而,DNS 域名系统就这么出现了。浏览器

域名的形式

在第 4 讲曾经说过,域名是一个有层次的结构,是一串用“.”分隔的多个单词,最右边的被称为“顶级域名”,而后是“二级域名”,层级关系向左依次下降。缓存

最左边的是主机名,一般用来代表主机的用途,好比“www”表示提供万维网服务、“mail”表示提供邮件服务,不过这也不是绝对的,名字的关键是要让咱们容易记忆。服务器

看一下极客时间的域名“time.geekbang.org”,这里的“org”就是顶级域名,“geekbang”是二级域名,“time”则是主机名。使用这个域名,DNS 就会把它转换成相应的 IP 地址,你就能够访问极客时间的网站了。网络

域名不只可以代替 IP 地址,还有许多其余的用途。架构

在 Apache、Nginx 这样的 Web 服务器里,域名能够用来标识虚拟主机,决定由哪一个虚拟主机来对外提供服务,好比在 Nginx 里就会使用“server_name”指令:app

 
 
 
 
复制代码
server {
listen 80; # 监听 80 端口
server_name time.geekbang.org; # 主机名是 time.geekbang.org
...
}
复制代码

域名本质上仍是个名字空间系统,使用多级域名就能够划分出不一样的国家、地区、组织、公司、部门,每一个域名都是独一无二的,能够做为一种身份的标识。

举个例子吧,假设 A 公司里有个小明,B 公司里有个小强,因而他们就能够分别说是“小明.A 公司”,“小强.B 公司”,即便 B 公司里也有个小明也不怕,能够标记为“小明.B 公司”,很好地解决了重名问题。

由于这个特性,域名也被扩展到了其余应用领域,好比 Java 的包机制就采用域名做为命名空间,只是它使用了反序。若是极客时间要开发 Java 应用,那么它的包名可能就是“org.geekbang.time”。

而 XML 里使用 URI 做为名字空间,也是间接使用了域名。

域名的解析

就像 IP 地址必须转换成 MAC 地址才能访问主机同样,域名也必需要转换成 IP 地址,这个过程就是“域名解析”。

目前全世界有几亿个站点,有几十亿网民,而天天网络上发生的 HTTP 流量更是天文数字。这些请求绝大多数都是基于域名来访问网站的,因此 DNS 就成了互联网的重要基础设施,必需要保证域名解析稳定可靠、快速高效。

DNS 的核心系统是一个三层的树状、分布式服务,基本对应域名的结构:

  1. 根域名服务器(Root DNS Server):管理顶级域名服务器,返回“com”“net”“cn”等顶级域名服务器的 IP 地址;
  2. 顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,好比 com 顶级域名服务器能够返回 apple.com 域名服务器的 IP 地址;
  3. 权威域名服务器(Authoritative DNS Server):管理本身域名下主机的 IP 地址,好比 apple.com 权威域名服务器能够返回 www.apple.com 的 IP 地址。

在这里根域名服务器是关键,它必须是众所周知的,不然下面的各级服务器就无从谈起了。目前全世界共有 13 组根域名服务器,又有数百台的镜像,保证必定可以被访问到。

有了这个系统之后,任何一个域名均可以在这个树形结构里从顶至下进行查询,就好像是把域名从右到左顺序走了一遍,最终就得到了域名对应的 IP 地址。

例如,你要访问“www.apple.com”,就要进行下面的三次查询:

  1. 访问根域名服务器,它会告诉你“com”顶级域名服务器的地址;
  2. 访问“com”顶级域名服务器,它再告诉你“apple.com”域名服务器的地址;
  3. 最后访问“apple.com”域名服务器,就获得了“www.apple.com”的地址。

虽然核心的 DNS 系统遍及全球,服务能力很强也很稳定,但若是全世界的网民都往这个系统里挤,即便不挤瘫痪了,访问速度也会很慢。

因此在核心 DNS 系统以外,还有两种手段用来减轻域名解析的压力,而且可以更快地获取结果,基本思路就是“缓存”。

首先,许多大公司、网络运行商都会创建本身的 DNS 服务器,做为用户 DNS 查询的代理,代替用户访问核心 DNS 系统。这些“野生”服务器被称为“非权威域名服务器”,能够缓存以前的查询结果,若是已经有了记录,就无需再向根服务器发起查询,直接返回对应的 IP 地址。

这些 DNS 服务器的数量要比核心系统的服务器多不少,并且大多部署在离用户很近的地方。比较知名的 DNS 有 Google 的“8.8.8.8”,Microsoft 的“4.2.2.1”,还有 CloudFlare 的“1.1.1.1”等等。

其次,操做系统里也会对 DNS 解析结果作缓存,若是你以前访问过“www.apple.com”,那么下一次在浏览器里再输入这个网址的时候就不会再跑到 DNS 那里去问了,直接在操做系统里就能够拿到 IP 地址。

另外,操做系统里还有一个特殊的“主机映射”文件,一般是一个可编辑的文本,在 Linux 里是“/etc/hosts”,在 Windows 里是“C:\WINDOWS\system32\drivers\etc\hosts”,若是操做系统在缓存里找不到 DNS 记录,就会找这个文件。

有了上面的“野生”DNS 服务器、操做系统缓存和 hosts 文件后,不少域名解析的工做就都不用“跋山涉水”了,直接在本地或本机就能解决,不只方便了用户,也减轻了各级 DNS 服务器的压力,效率就大大提高了。

下面的这张图比较完整地表示了如今的 DNS 架构。

在 Nginx 里有这么一条配置指令“resolver”,它就是用来配置 DNS 服务器的,若是没有它,那么 Nginx 就没法查询域名对应的 IP,也就没法反向代理到外部的网站。

 
 
 
 
复制代码
resolver 8.8.8.8 valid=30s; # 指定 Google 的 DNS,缓存 30 秒
复制代码

域名的“新玩法”

有了域名,又有了能够稳定工做的解析系统,因而咱们就能够实现比 IP 地址更多的“新玩法”了。

第一种,也是最简单的,“重定向”。由于域名代替了 IP 地址,因此可让对外服务的域名不变,而主机的 IP 地址任意变更。当主机有状况须要下线、迁移时,能够更改 DNS 记录,让域名指向其余的机器。

好比,你有一台“buy.tv”的服务器要临时停机维护,那你就能够通知 DNS 服务器:“我这个 buy.tv 域名的地址变了啊,原先是 1.2.3.4,如今是 5.6.7.8,麻烦你改一下。”DNS 因而就修改内部的 IP 地址映射关系,以后再有访问 buy.tv 的请求就不走 1.2.3.4 这台主机,改由 5.6.7.8 来处理,这样就能够保证业务服务不中断。

第二种,由于域名是一个名字空间,因此可使用 bind9 等开源软件搭建一个在内部使用的 DNS,做为名字服务器。这样咱们开发的各类内部服务就都用域名来标记,好比数据库服务都用域名“mysql.inner.app”,商品服务都用“goods.inner.app”,发起网络通讯时也就没必要再使用写死的 IP 地址了,能够直接用域名,并且这种方式也兼具了第一种“玩法”的优点。

第三种“玩法”包含了前两种,也就是基于域名实现的负载均衡。

这种“玩法”也有两种方式,两种方式能够混用。

第一种方式,由于域名解析能够返回多个 IP 地址,因此一个域名能够对应多台主机,客户端收到多个 IP 地址后,就能够本身使用轮询算法依次向服务器发起请求,实现负载均衡。

第二种方式,域名解析能够配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,这样在 DNS 端把请求分发到不一样的服务器,实现负载均衡。

前面咱们说的都是可信的 DNS,若是有一些不怀好意的 DNS,那么它也能够在域名这方面“作手脚”,弄一些比较“恶意”的“玩法”,举两个例子:

  • “域名屏蔽”,对域名直接不解析,返回错误,让你没法拿到 IP 地址,也就没法访问网站;
  • “域名劫持”,也叫“域名污染”,你要访问 A 网站,但 DNS 给了你 B 网站。

好在互联网上仍是好人多,并且 DNS 又是互联网的基础设施,这些“恶意 DNS”并很少见,你上网的时候不须要太过担忧。

小结

此次咱们学习了与 HTTP 协议有重要关系的域名和 DNS,在这里简单小结一下今天的内容:

  1. 域名使用字符串来代替 IP 地址,方便用户记忆,本质上一个名字空间系统;
  2. DNS 就像是咱们现实世界里的电话本、查号台,统管着互联网世界里的全部网站,是一个“超级大管家”;
  3. DNS 是一个树状的分布式查询系统,但为了提升查询效率,外围有多级的缓存;
  4. 使用 DNS 能够实现基于域名的负载均衡,既能够在内网,也能够在外网。

课下做业

  1. 在浏览器地址栏里随便输入一个不存在的域名,好比就叫“www. 不存在.com”,试着解释一下它的 DNS 解析过程。
  2. 若是由于某些缘由,DNS 失效或者出错了,会出现什么后果?

欢迎你把本身的答案写在留言区,与我和其余同窗一块儿讨论。若是你以为有所收获,也欢迎把文章分享给你的朋友。

//转载 time.geekbang.org/column/arti…

相关文章
相关标签/搜索