DNS的解析过程

本篇博客主要说明如下几个问题:
1、什么是域名?什么是URL?两者有什么关系?
2、域名是如何转换成IP地址?
3、浏览器是怎么访问一个网站的?

一、DNS简介

1.1 域名和URL的区别

域名是分等级的,一般分为:主机名.二级域名.顶级域名.。注意,最后有一个点代表的是根域,是所有域的起点。常见的域名有www.google.com、www.baidu.com等。

顶级域名TLD(Top Level Domain)

  • 国家顶级域名 nTLD: .cn 表示中国,.us 表示美国,.uk 表示英国,等等。
  • 通用顶级域名 gTLD:.com (公司和企业),.net (网络服务机构),.org (非赢利性组织),.edu (美国专用的教育机构),.gov (美国专用的政府部门),.mil (美国专用的军事部门),.int(国际组织)。(最早的顶级域名)
  • 基础结构域名(infrastructure domain):这种顶级域名只有一个,即 arpa,用于反向域名解析,因此又称为反向域名。

顶级域名的管理服务由对应的域名注册管理机构(域名注册局)负责,注册服务通常由域名注册商负责。

当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符

比如http://mail.163.com/index.html

  1. http://:这个是协议,也就是HTTP超文本传输协议,也就是网页在网上传输的协议。
  2. mail:这个是服务器名或主机名(host),代表着是一个邮箱服务器,所以是mail.,常见www.baidu.com中,www是服务器名。主机名又称为“三级域名”,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。
  3. 163.com:com是顶级域名、163是二级域名。
  4. mail.163.com:这是一个域名,真正的域名是mail.163.com.root,简写为mail.163.com.(注意最后由个点)。因此,根域名.root对于所有域名都是一样的,所以平时是省略的。
  5. /:这个是根目录,也就是说,通过域名找到服务器,然后需要知道访问该服务器下的哪个目录,这里的根目录并不是服务器的根目录下,具体的目录是服务器的配置文件决定,由配置文件完成对URL中的根目录与服务器目录的映射。
  6. index.html:这个是根目录下的默认网页,有时候输入http://mail.163.com/,服务器会在自己的目录下寻找默认的网页,一般是index.html(163默认网页是否是这个不清楚)。
  7. http://mail.163.com/index.html:这个叫做URL统一资源定位器,全球性地址,用于定位网上的资源。

所以域名是URL的一部分。

1.2 什么是DNS

DNS(Domain Name Server,域名服务器) 是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的,以解析消息的域名。将域名解析为IP的称为正向解析,将IP解析为域名的称为反向域名解析
(思考:知道IP地址,那端口号怎么知道?端口号80)

DNS 使用 TCP 和 UDP 端口 53
DNS 是一个应用层协议。

Linux下搭建DNS 服务器

1.3 DNS解析记录的分类

域名与IP之间的对应关系,称为"记录(record)"。根据使用场景,"记录"可以分成不同的类型(type),常见的资源记录类型有:

  • NS 记录: 域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
  • MX 记录: 邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
  • A 记录: 地址记录(Address),返回域名指向的IPv4地址。DNS里用得最多的记录。
  • AAAA 记录: 地址记录(Address),返回域名指向的 IPv6 地址记录。
  • CNAME: 规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转。
  • PTR 记录: 逆向查询记录(Pointer Record),PTR记录用于定义与 IP地址相关联的名称。PTR 记录是A或AAAA记录的逆。 PTR记录是唯一的,因为它们以 .arpa根开始并被委派给IP地址的所有者。

每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。

二、DNS解析过程

主机名到 IP 地址的映射有两种方式:

  • 静态映射:在本机上配置域名和 IP 的映射,旨在本机上使用。Windows 和 Linux 的 hosts 文件中的内容就属于静态映射。

  • 动态映射:建立一套域名解析系统(DNS),只在专门的 DNS 服务器上配置主机到 IP 地址的映射,网络上需要使用主机名通信的设备,首先需要到 DNS 服务器查询主机所对应的 IP 地址。

通过域名去查询域名服务器,得到 IP 地址的过程叫做域名解析。在解析域名时,一般先静态域名解析,再动态解析域名。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。

有DNS的地方,就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。
DNS查询顺序:浏览器缓存→系统缓存→路由器缓存→ISP DNS 缓存→迭代搜索

主机向本地域名服务器的查询一般都是采用递归查询
本地域名服务器向根域名服务器的查询通常是采用迭代查询

在这里插入图片描述
上图展示了一个域名解析的流程,步骤如下,
首先进行静态域名解析:

  1. 用户打开 Web 浏览器,在地址栏中输入 www.163.com,然后按 Enter 键。
  2. 浏览器先检查自身缓存中有是否解析过这个域名对应的ip地址,如果有,解析结束。
    查看浏览器中的域名解析缓存结果:chrome://net-internals/#dns(该命令行针对于chrome浏览器,只需要复制粘贴到Chrome的地址栏,回车即可)。 浏览器的DNS缓存查看和清除
  3. 如果浏览器缓存中没有,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts文件(c:\windows\system32\drivers\etc)来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。在Linux中可以通过 /etc/hosts 文件来设置。
    在windows操作系统下,可通过ipconfig /displaydns命令进行查看本地的缓存的DNS域名解析的结果。(该缓存中包含,hosts文件中的信息。当断网后,该缓存中的信息就是hosts文件中的信息。)

如果静态域名解析未命中,则需要进行动态域名解析。

再进行动态域名解析:

  1. 如果至此还没有命中域名,将解析请求路由到本地域名服务器(LDNS) 来解析这个域名,该过程为上图中的step1。这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。这一般由用户的 Internet 服务提供商 (ISP) 进行管理,例如有线 Internet服务提供商、DSL宽带提供商或公司网络。
  2. 如果LDNS仍然没有命中,则LDNS将域名解析请求发送给根域名服务器解析,开启迭代搜索。根域名服务器的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面
  3. 根域名服务器接受请求并返回给LDNS一个顶级域名服务器地址(该例中域名是以.com作为顶级域名,所以返回的地址是.com域服务器的IP地址)。
  4. 根据上一步返回的地址信息,LDNS发送解析请求给顶级域名服务器。
  5. 顶级域名服务器接受请求并返回给LDNS一个这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器(163.com域服务器)。
  6. 根据上一步返回的地址信息,LDNS发送解析请求给Name Server注册的域名服务器。
  7. 163.com域服务器通过查询得知www服务器对应的ip地址,返回该域名对应的IP和TTL值给LDNS,LDNS缓存这个域名和IP地址,缓存时间由TTL值控制。
  8. LDNS将IP地址返回给网络客户端,用户根据TTL值缓存在本地系统,域名解析过程结束。

三、Linux命令查看DNS解析过程

3.1 dig命令

DNS服务器根据域名的层级,进行分级查询。
dig - DNS lookup utility(DNS查找工具),可以显示整个查询过程。

$ dig math.stackexchange.com

上面的命令会输出六段信息:
在这里插入图片描述
第一段是查询参数和统计:
在这里插入图片描述

  • 第一行:dig程序的版本号和查询的域名。
  • 第二行:表示可以在命令后面加选项。
  • 第三行:表示以下是获取信息的内容。
  • 第四行:这是返回信息的头部。
    opcode(操作码):QUERY(代表是查询操作);
    status有四种状态:NXDOMAIN( 否定回答,不存在此记录)、NOERROR(没有错误,查询成功)、REFUSED(DNS服务器拒绝回答,记录未生效) 以及SERFAIL(DNS服务器停机或DNSsec响应验证失败);
    id:编号,在DNS协议中,通过编号匹配返回和查询。
  • 第五行:flags:标志;
    qr:query 查询标志,代表这是查询操作;
    rd:recursion desired,代表希望进行递归查询操作;
    ra:recursion available 在返回中设置,代表查询的服务器支持递归查询操作;
    aa:authoritative answer 权威回复,如果查询结果是由管理域名的域名服务器而不是缓存服务器提供的,则称为权威回复;
    QUERY:1表示查询数,对应下面的QUESTION SECTION:的记录数;
    ANSER:4表示4个查询结果,对应下面的ANSWER SECTION:的记录数;
    AUTHORITY:4表示4个权威域名服务器记录数,代表该域名有4个权威域名服务器,可供域名解析用,对应下面的AUTHORITY SECTION:的记录数;
    ADDITIONAL:4表示4个额外记录数,表示权威域名服务器的所有IP地址,对应下面的ADDITIONAL SECTION:的记录数。

在这里插入图片描述

  • 第一行:向DNS请求的问题(请求部分)。
  • 第二行:查询域名math.stackexchange.com.的A记录。

在这里插入图片描述

  • 第一行:得到问题的答案(回应部分)。
  • 第一列:查询的域名。
  • 第二列:TTL缓存时间,表示缓存域名服务器可以在缓存中保存多少秒该记录。
  • 第三列:class要查询信息的类别,IN代表类别为internet。
  • 第四列:TYPE要查询的记录类型。
  • 第五列:VALUE域名对应的A的值,即IP地址。

在这里插入图片描述

  • 第一行:权威域名部分,即哪些服务器负责管理stackexchange.com的DNS记录,上面结果显示stackexchange.com共有四条NS记录,即四个域名服务器。
  • 第一列:NAME域名。
  • 第二列:TTL缓存时间。
  • 第三列:class要查询信息的类别,IN代表类别为internet。
  • 第四列:TYPE要查询的记录类型。
  • 第五列:VALUE域名对应的权威域名解析服务器,即域名。

在这里插入图片描述

  • 第一行:权威ns服务器的所有IP地址(额外记录部分)。
  • 第一列:NAME域名。
  • 第二列:TTL缓存时间。
  • 第三列:class要查询信息的类别,IN代表类别为internet。
  • 第四列:TYPE要查询的记录类型。
  • 第五列:VALUE域名对应的A的值,即IP地址。

在这里插入图片描述

  • 第一行:查询耗时。
  • 第二行:查询使用的服务器地址和端口,其实就是本地配置的DNS域名服务器。
  • 第三行:查询的时间。
  • 第四行:回应的大小,收到305个字节。

如果不想看到这么多内容:

$ dig +short math.stackexchange.com 

在这里插入图片描述
1、分级查询:

$ dig +trace math.stackexchange.com 
linux@ubuntu:~$ dig +trace math.stackexchange.com 

; <<>> DiG 9.8.1-P1 <<>> +trace math.stackexchange.com
;; global options: +cmd
.			5	IN	NS	d.root-servers.net.
.			5	IN	NS	e.root-servers.net.
.			5	IN	NS	f.root-servers.net.
.			5	IN	NS	g.root-servers.net.
.			5	IN	NS	h.root-servers.net.
.			5	IN	NS	i.root-servers.net.
.			5	IN	NS	j.root-servers.net.
.			5	IN	NS	k.root-servers.net.
.			5	IN	NS	l.root-servers.net.
.			5	IN	NS	m.root-servers.net.
.			5	IN	NS	a.root-servers.net.
.			5	IN	NS	b.root-servers.net.
.			5	IN	NS	c.root-servers.net.
;; Received 228 bytes from 192.168.72.2#53(192.168.72.2) in 406 ms

com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
;; Received 500 bytes from 192.58.128.30#53(192.58.128.30) in 442 ms

stackexchange.com.	172800	IN	NS	ns-925.awsdns-51.net.
stackexchange.com.	172800	IN	NS	ns-1029.awsdns-00.org.
stackexchange.com.	172800	IN	NS	ns-cloud-d1.googledomains.com.
stackexchange.com.	172800	IN	NS	ns-cloud-d2.googledomains.com.
;; Received 263 bytes from 192.55.83.30#53(192.55.83.30) in 803 ms

math.stackexchange.com.	3600	IN	A	151.101.1.69
math.stackexchange.com.	3600	IN	A	151.101.65.69
math.stackexchange.com.	3600	IN	A	151.101.129.69
math.stackexchange.com.	3600	IN	A	151.101.193.69
;; Received 104 bytes from 216.239.34.109#53(216.239.34.109) in 419 ms
  1. 第一部分收到的receive,来自系统指定的DNS域名服务器(192.168.72.2)。根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问.com的NS记录。
  2. 第二部分收到的receive,来自192.58.128.30(dig -x 192.58.128.30命令查看,域名:j.root-servers.net.)。上面结果显示.com域名的13条NS记录,同时返回的还有每一条记录对应的IP地址。DNS服务器向这些IP地址发出查询请求,询问stackexchange.com的NS记录。(全球13台根域名服务器的 IP 地址
  3. 第三部分收到的receive,来自192.55.83.30(域名:m.gtld-servers.net.)。上面结果显示stackexchange.com域名的4条记录,同时返回的还有每一条记录对应的IP地址。然后,DNS服务器向这些IP地址发出查询请求,询问math.stackexchange.com的A记录。
  4. 第四部分收到的receive,来自216.239.34.109(域名:ns-cloud-d2.googledomains.com.)。上面结果显示math.stackexchange.com有四条A记录,即这四个IP地址都可以访问到网站。

dig命令无法找到IP地址,返回一条SOA记录。
在这里插入图片描述

2、指定向DNS服务器8.8.8.8查询:

$ dig math.stackexchange.com @8.8.8.8 +trace

在这里插入图片描述
从中可知,根域名服务器的NS记录来自IP地址为8.8.8.8的DNS域名服务器,这13条NS记录是13台根域名服务器。根域名服务器的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面,这也是为什么13条记录信息不是来自根域名服务器而是来自IP地址8.8.8.8(google DNS服务器)。

3、IP地址反查域名:

dig -x 192.58.128.30

在这里插入图片描述

3.2 nslookup命令

nslookup有交互式和非交互式两种使用方式如下图:
在这里插入图片描述
在这里插入图片描述

3.3 host命令

host命令可以看作dig命令的简化版本,返回当前请求域名的各种记录。
在这里插入图片描述
host命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x 。
在这里插入图片描述

四、HTTP操作过程

在这里插入图片描述
万维网的操作过程:首先是域名解析,然后http访问

  1. 浏览器分析超链接指向页面的URL。
  2. 浏览器向DNS请求解析网站名www.tsinghua.edu.cn的IP地址。
  3. 域名服务器DNS解析出清华大学服务器的IP地址。
  4. 浏览器与服务器建立TCP连接。
  5. 浏览器发出取文件命令:GET /chn/yxsz/index.html
  6. 服务器给出响应,把文件index.html发送给浏览器。
  7. TCP连接释放。
  8. 浏览器通过渲染,显示文件index.html中的所有文本。

五、参考资料

[1]: DNS域名解析
[2]: 计算机网络之应用层1 域名,域名系统DNS万维网www、HTTP、HTML电子邮件
[3]: DNS 协议入门
[4]: 域名,网站名和URL区别
[5]: 域名解析过程,很好的一张图收藏了
[6]: 详解DNS域名解析全过程
[7]: 浏览器的DNS缓存查看和清除
[8]: windows 查看/清除DNS解析记录
[9]: 域名解析
[10]: DNS 原理入门
[11]: Dig命令解析结果
[12]: 使用dig/nslookup命令查看dns解析详情

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值