HTTP协议 - DNS解析

DNS域名系统

域名系统(英文:Domain Name System,缩写:DNS)是因特网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。如果要了解DNS,首先要了解一下几个概念:

根域

根域名服务器(英语:root name server)是互联网域名解析系统(DNS)中最高级别的域名服务器,负责返回顶级域名的权威域名服务器的地址。截至2014年10月,全球有504台根服务器,被编号为A到M共13个标号。编号相同的根服务器使用同一个IP,504台根服务器总共只使用13个IP。

中国大陆在北京有三台编号为L的镜像,编号为F、I、J的镜像各一台,共6台;香港有编号为D、J的镜像各2台,编号为A、F、I、L的镜像各一台,共8台;台湾则有编号为F、I、J各一台,共3台。

全球13组根域名服务器以英文字母A到M依序命名,域名格式为“字母.root-servers.org”。其中有11个是以任播技术在全球多个地点设立镜像站。

顶级域

根域下来就是顶级域或者叫一级域,一种互联网刚兴起时的按照行业性质划分的 .com .net 等通用顶级域,一种是按国家划分的如 .cn .jp 等国家和地区顶级域,每个域都会有域名服务器,也叫权威域名服务器。

目前正在使用的通用顶级域有:

.com - 供商业机构使用,但无限制
.info - 供资讯性网站使用,但无限制
.net - 原供网络服务供应商使用,现无限制
.org - 原供不属于其他通用顶级域类别的组织使用,现无限制
.biz - 供商业使用
.name - 供家庭及个人使用
.pro - 供部分专业使用
.aero - 供航空运输业使用
.asia - 供亚太地区的公司、组织及个人使用
.cat - 供加泰罗尼亚语/文化使用
.coop - 供联合会 (cooperatives)使用
.edu - 供教育机构使用
.gov - 供美国政府及其属下机构使用
.int - 供由条约而成立的国际性机构使用
.jobs - 供求职相关网站使用
.mil - 供美国军事机构使用
.mobi - 供手提电话等装置网站使用
.museum - 供博物馆使用
.post - 供邮政服务使用
.tel - 供连接电话网络与互联网的服务使用
.travel - 供旅行社、航空公司、酒店及旅游协会等机构使用
.xxx - 供色情网站使用

举例来说,baidu.com 就是一个顶级域名,但 www.baidu.com 却不是顶级域名,它是在 baidu.com 这个顶级域里的一台叫做 www 的主机。

域名服务器

能提供域名解析的服务器,上面的记录类型可以是A(address)记录,NS记录(name server),MX(mail),CNAME等。

A 主机(A)记录是名称解析的重要记录,它用于将特定的主机名映射到对应主机的IP地址上。你可以在DNS服务器中手动创建或通过DNS客户端动态更新来创建。
CNAME 此记录用于将某个别名指向到某个主机(A)记录上,从而无需为某个需要新名字解析的主机额外创建A记录。
MX 此记录列出了负责接收发到域中的电子邮件的主机 ,通常用于邮件的收发。
NS 此记录指定负责此DNS区域的权威名称服务器。

A记录又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。指向的目标主机地址类型只能使用IP地址;

CNAME 通常称别名指向。您可以为一个主机设置别名。比如设置 cname.parser.com,用来指向一个主机 www.server.com 那么以后就可以用 cname.parser.com 来代替访问 www.server.com 了。

CNAME的目标主机地址只能使用主机名,不能使用IP地址;主机名前不能有任何其他前缀,如:http:// 等是不被允许的;A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。

MX记录是指邮件交换记录。用于将以该域名为结尾的电子邮件指向对应的邮件服务器以进行处理。如用户所用的邮件是以域名mail.com为结尾的,则需要在管理界面中添加该域名的MX记录来处理所有以@mail.com结尾的邮件。MX记录可以使用主机名或IP地址。

NS记录是指解析服务器记录。用来表明由哪台服务器对该域名进行解析。这里的NS记录只对子域名生效。

例如用户希望由 12.34.56.78 这台服务器解析 news.mydomain.com ,则需要设置 news.mydomain.com 的NS记录。

DNS解析过程

上面讲到互联网都是通过URL来发布和请求资源的,而URL中的域名需要解析成IP地址才能与远程主机建立连接,如何将域名解析成IP地址就属于DNS解析的工作范畴,这个过程大体大体由一张图可以表示:

www.baidu.com 为例,现在我的计算机要向本地DNS发起请求查询 www.baidu.com 这个域名了,本地DNS可能是ISP提供的,也可能是我自己设置的。

当本地DNS拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为非权威服务器的应答

如果缓存中没有的话,本地DNS会从配置文件里面读取13个根域名服务器的地址,然后向其中一台发起请求。

根域名服务器拿到这个请求后,知道他是com.这个顶级域名下的,所以就会返回com域中的NS记录,一般来说是13台主机名和IP。

然后本地DNS向其中一台再次发起请求,com顶级域的服务器发现这个请求是baidu.com这个域的,我一查发现了这个域的NS,那我就返回给你,你再去查。

本地DNS再次向baidu.com这个域的权威服务器发起请求,baidu.com收到之后,查了下有www的这台主机,就把这个IP返回给我了,

最后本地DNS拿到了之后,将其返回给了客户端,并且把这个保存在高速缓存中。

下面我们用Din工具来看一些这个过程:

在命令行中输入:dig +trace www.baidu.com

首先我的计算机本地DNS读取了13个根域:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
. 447119 IN NS m.root-servers.net.
. 447119 IN NS d.root-servers.net.
. 447119 IN NS b.root-servers.net.
. 447119 IN NS e.root-servers.net.
. 447119 IN NS c.root-servers.net.
. 447119 IN NS k.root-servers.net.
. 447119 IN NS g.root-servers.net.
. 447119 IN NS h.root-servers.net.
. 447119 IN NS j.root-servers.net.
. 447119 IN NS a.root-servers.net.
. 447119 IN NS f.root-servers.net.
. 447119 IN NS i.root-servers.net.
. 447119 IN NS l.root-servers.net.
;; Received 228 bytes from 192.168.199.1#53(192.168.199.1) in 402 ms

然后向其中一个根域发送了解析请求,根域返回com.顶级域的服务器IP(未显示)和名称,com.域的一台服务器返回了baidu.com域的服务器IP(未显示)和名称,向百度的顶级域服务器 199.7.83.42 请求 www.baidu.com ,它发现这个www的别名是 www.a.shifen.com,和两个主机地址 61.135.169.121 / 61.135.169.125

1
2
3
4
www.baidu.com. 934 IN CNAME www.a.shifen.com.
www.a.shifen.com. 62 IN A 61.135.169.121
www.a.shifen.com. 62 IN A 61.135.169.125
;; Received 90 bytes from 199.7.83.42#53(199.7.83.42) in 26 ms