这是一篇介绍 DNS(Domain Name System ) 皮毛的文章。
一、什么是 DNS
DNS = Domain Name System
我们平时访问网页,通常都是输入一个网站的域名
(eg: https://google.com ),然后游览器会返回相应的网页给我们。
游览器拿到我们输入的域名
,然后通过网络
,最终找到相应的服务器
拿到了我们要的网页,再返回给游览器。
在万维网中,服务器地址通常是用 IP 进行表示的。那么,我们的输入的域名
,是怎么变成服务器的 IP 地址呢?
这个转换的过程,就是DNS 要做的。
二、演变
雏形
互联网早期,只有几百台主机。所以当时的 DNS 系统,就是一个简单的 HOSTS.TXT文件,然后坐了两件事:记录和同步。
HOSTS.TXT 里简单的记录了主机域名和 IP 地址的对应关系。这个文件存放在一台主机上,然后分发到整个网络。当大家通过域名访问的时候,都会HOSTS.TXT获取到域名对应的 IP 地址,然后再去访问实际的主机。
如果 HOSTS.TXT 内对应关系发生变化了,更新手段也是很原始,通过电子邮件通知网络的备份,让备份重新拉去 HOSTS.TXT 进行更新。
DNS
后来互联网主机数量局增,维护和更新策略都发生了变化。
现代的 DNS 系统被设计成了自动更新和维护。
三、DNS服务器结构
域名的结构是…d.c.b.a 这个形式。比如www.google.com 这个域名,.com
是顶级域名,.google.com
是.com
的下一级子域名,.www.google.com
又是.google.com
下一层级的子域名,以此类推。
DNS的域名服务器是一个倒树形,根节点是根域名服务器
,下边的第一层树,负责各个顶级域名(eg: .com、.org、.net等等),再下层则是上一层的子域名。
四、一个简单的DNS请求过程
比如我需要请求google.com
这个页面,在输入url 后,回车。
- 首先会查找游览器本身的DNS缓存,存在则直接返回,不存在则进入步骤2;
- 去附近的 DNS 缓存服务器查询(是怎么知道这个 DNS 缓存服务器地址呢,这个一般是由运营商配置地址的,存在则直接返回,不存在则进入步骤3;
- 去
根域名服务器
查到,一层一层向下查询(分为递归和迭代),直到查到域名所对应的记录为止,然后返回。 - 返回途中,DNS缓存更新,游览器拿到 IP 地址进行访问。
五、DNS 记录都记写什么
之前说到从 DNS缓存或者 DNS服务器里查询相应记录,那记录
到底都记了些什么呢?
记录是一条一条的,每条记录分成4个字段:Name、Value、Type、TTL 四个字段。
TTL(Time To Live),一个时间字段。用于标记这条记录的存活期,但超过存活期,记录就需要被更新。
Type 是记录的类型,决定了 Name 和 Value 的组成。
Type的常用类型有:
A记录,Address
A 记录就是地址记录,Name 是域名,Value 是 IP 地址。因为有的域名或有多个服务器提供服务,所以会存在一个域名对应多个 IP 地址的情况。
一对多的例子:
Name | Value |
---|---|
isalucard.com | 192.30.252.154 |
isalucard.com | 185.199.109.153 |
CNAME 记录
CNAME是别名记录的意思。依然可以存在一个域名对应多个 IP 的 A 记录,那当然也可以为一个 IP 地址设置多个域名。比如我把博客部署在了192.30.252.154
这台服务器上,配置了一个默认的域名jinxm.github.io
,但是我嫌弃这个域名不好看,于是我就给他增加了一个别名isalucard.com
。所以,192.30.252.154
这个 IP 就对呀了两个域名。
Name | Value |
---|---|
jinxm.github.io | 192.30.252.154 |
isalucard.com | jinxm.github.io |
NS 记录,Name Server
域名服务器记录,用以记录这个域名由哪个域名服务器来解析,一对多关系。
eg: com 域名的解析服务器
// dig ns com 命令查询
com. 156404 IN NS c.gtld-servers.net.
com. 156404 IN NS b.gtld-servers.net.
com. 156404 IN NS i.gtld-servers.net.
com. 156404 IN NS e.gtld-servers.net.
com. 156404 IN NS f.gtld-servers.net.
com. 156404 IN NS d.gtld-servers.net.
com. 156404 IN NS m.gtld-servers.net.
com. 156404 IN NS g.gtld-servers.net.
com. 156404 IN NS a.gtld-servers.net.
com. 156404 IN NS l.gtld-servers.net.
com. 156404 IN NS h.gtld-servers.net.
com. 156404 IN NS j.gtld-servers.net.
com. 156404 IN NS k.gtld-servers.net.