域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息,每个站点(如大学中的系,校园,公司或者公司中的部分)保留它自己的信息数据库,并运行一个服务器程序供Internet上的其他系统(客户程序查询)。DNS提供了无条件允许服务器和客户端相互通信的协议。

从应用的角度上叫,对DNS的访问是通过一个地址解析器(resolver,也叫名字解析器)来完成的,在unix的主机中,该解析器主要是通过两个库函数gethostbyname和gethostbyaddr来访问的,前者接收主机的名字的返回IP地址,而后者接收IP来寻找主机名字。

域名

image.png

下面举一些3字符长的普通域的例子:(域,描述)

  1. com,商业组织
  2. edu, 教育机构
  3. gov,政府部门
  4. int, 国际组织
  5. mil, 军事组织
  6. net,网络
  7. org,其他网络

FQDN 叫做绝对域名名称,由主机名和域名组合而成,注意一个完整的 FQDN 末尾有一个点号。比如 www.google.com. 代表一个 FQDN。现在来说说 DNS 系统的层级数据库,DNS 最顶层是点号(.),叫做 ROOT 根域名。接下来是 TLDs,表示顶级域名,顶级域名分为两种类型:

  • .com,.org 这样的叫做一般通用顶级域(gTLDs)
  • .cn,.jp 这样的叫做国家顶级域(ccTLDs)

一个域名表示你拥有了互联网的一个资源,通过域名也能了解到一个组织的主人是谁,比如google.com表示谷歌这个组织拥有的一个互联网资源。

子域名,主要是企业为了规范自己的域名系统和服务,而在二级域名下面扩展出来的名称系统。比如说zji.com的域名是我的,每次开发一个项目就会新扩展一个子域名,比如说:http://www.rss.zji.com这个服务的子域名就是rss.zji.com。

其实对于 .com 域名来说,google.com 就是它的子域名,这体现了域名系统或者说 DNS 系统的层级性。

主机

通过域名,我们能够定义一个主机,比如大部分 WEB 服务,默认的主机名就是 WWW。google.com 其实隐藏了默认的主机名,实际上等同 www.google.com ,www 是 google.com 这个域名下定义的虚拟主机。 针对这个主机名字,我是存在疑问的?3w难道不是万维网吗?怎么就变成了主机名字?

实体DNS服务器

根域名服务器

根域名服务器由ICANN来管理,在全球有13个根服务器,每个根域名由多台机器。分布在全球各地,查询量非常大,所以分布在各地是有原因的,根域名服务器主要负责TLD服务器。

TLD服务器

TLD服务器负责解析Domain-Level服务器

Domain-Level 服务器

比如说www.google.com ,由负责管理google.com域名的服务器解析IP地址,这个层级的服务器叫做Domain-Level服务器。

通过上面来看,每个层级的域名服务器负责管理他管辖的域名,而且他也只能管理他下一级别的,不会跨级管理。原因是授权,这相当于一个公司,CEO管理总经理,总经理管理经理,经理管理具体的员工,一般不会跨级管理。

以上的服务器也被称为权威域名服务器,他们来负责维护具体的DNS信息。

资源记录

资源记录这块一定是《TCP/IP协议族》里面讲得最垃圾的一段了 ,看了半天我也没有理解到底要表达什么意思。

资源记录是用于答复DNS客户端请求的DNS数据库记录,每一个DNS服务器包含了它所管理的DNS命名空间的所有资源记录。资源记录包含和特定主机有关的信息,如IP地址、提供服务的类型等等。常见的资源记录类型有:SOA(起始授权结构)、A(主机),NS(名称服务器),CNAME(别名)和MX(邮件交换器)。

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2332713/1598667216249-92fbb661-2942-4545-b566-541062482702.png#align=left&display=inline&height=89&margin=%5Bobject%20Object%5D&name=image.png&originHeight=177&originWidth=500&size=43080&status=done&style=none&width=250)
  1. 本地 DNS 服务器发现没有 www.google.com 域名对应的 IP 地址,就会向根域名服务器发出查询任务。根域名服务器说,我只知道 .com 这个 TLD 服务器的 DNS 信息,你去问他把,并且返回 .com 服务器的地址。
  2. .com 服务器说我不知道,但是知道这个域名由谷歌自己维护(Domain-Level 服务器 )的,你去问他把,并且返回谷歌 NS 服务器的 IP 地址,由它来告诉调用者。
  3. 本地 DNS 服务器联系上 Google 的 NS 服务器后,NS 这台机器上的 DNS 软件说,这是我维护的,然后把具体的 IP 地址告诉了本地 DNS 服务器。本地 DNS 服务器会缓存这一结果,然后告诉客户端(比如浏览器)。

dig指令

image.png

  1. status: NOERROR 表示查询没有什么错误,Query time 表示查询完成时间
  2. SERVER: 8.8.8.8#53(8.8.8.8),表示本地 DNS 服务器地址和端口号。8.8.8.8是google的专用域名服务器,在我本地的配置里面,直接设置为8.8.8.8
  3. QUESTION SECTION 表示需要查询的内容,这里需要查询域名的 A 记录
  4. ANSWER SECTION 表示查询结果,返回 A 记录的 IP 地址。600 表示本次查询缓存时间,在 600 秒本地 DNS 服务器可以直接从缓存返回结果
  5. CNAME: a. 某个域名(A)可能会下线,但是这些域名可能还是被访问到,为了避免不友好的提示,可以将这个域名 cname 到另外个域名(B),这样访问 B 相当于返回 A。b. 很多公司项目可能有很多个域名,但是指定的 IP 地址可能每几个,一旦 IP 地址变化,可能要修改每个域名的 DNS 信息。假如这些域名 cname 到某个特定的域名,那么修改域名信息的时候就会非常方便。对于这两点,表示有疑惑,比如说我访问百度的cname, www.a.shifen.com, 浏览器上直接报错,这是为啥?


nslookup指令

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2332713/1598671158956-0c1ba48c-7af0-49b2-ba0e-08f744a22587.png#align=left&display=inline&height=166&margin=%5Bobject%20Object%5D&name=image.png&originHeight=332&originWidth=566&size=73861&status=done&style=none&width=283)<br />这个指令从字面意思看来非常简单,那就是往NS服务器上发送查询报错,获得A记录。

参考:
DNS(一)抽象理解DNS
DNS(二)通过dig命令理解DNS
DNS原理及其解析过程