域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息,每个站点(如大学中的系,校园,公司或者公司中的部分)保留它自己的信息数据库,并运行一个服务器程序供Internet上的其他系统(客户程序查询)。DNS提供了无条件允许服务器和客户端相互通信的协议。
从应用的角度上叫,对DNS的访问是通过一个地址解析器(resolver,也叫名字解析器)来完成的,在unix的主机中,该解析器主要是通过两个库函数gethostbyname和gethostbyaddr来访问的,前者接收主机的名字的返回IP地址,而后者接收IP来寻找主机名字。
域名

下面举一些3字符长的普通域的例子:(域,描述)
- com,商业组织
- edu, 教育机构
- gov,政府部门
- int, 国际组织
- mil, 军事组织
- net,网络
- 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(邮件交换器)。

- 本地 DNS 服务器发现没有 www.google.com 域名对应的 IP 地址,就会向根域名服务器发出查询任务。根域名服务器说,我只知道 .com 这个 TLD 服务器的 DNS 信息,你去问他把,并且返回 .com 服务器的地址。
- .com 服务器说我不知道,但是知道这个域名由谷歌自己维护(Domain-Level 服务器 )的,你去问他把,并且返回谷歌 NS 服务器的 IP 地址,由它来告诉调用者。
- 本地 DNS 服务器联系上 Google 的 NS 服务器后,NS 这台机器上的 DNS 软件说,这是我维护的,然后把具体的 IP 地址告诉了本地 DNS 服务器。本地 DNS 服务器会缓存这一结果,然后告诉客户端(比如浏览器)。
dig指令

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