关于DNS的学习记录 其二
问题引入
很常见的一个面试问题:往浏览器中输入www.baidu.com
,到返回界面,整个流程是如何进行的?
除去http
请求的过程,单纯来讲域名解析的部分:
浏览器缓存检查: 浏览器会先检查自身的DNS缓存,看是否已经存储了
www.baidu.com
的IP地址。如果有缓存,就直接使用该IP地址;如果没有,就继续下一步。操作系统缓存检查: 如果浏览器缓存中没有找到,浏览器会向操作系统请求查找DNS缓存。如果操作系统缓存中存在该域名的解析记录,也会直接返回IP地址。
本地域名服务器(DNS)检查: 如果操作系统缓存中没有找到对应的IP地址,就会向配置的本地DNS服务器发送DNS查询请求。通常,这个DNS服务器是你的ISP(互联网服务提供商)提供的。
递归查询:
本地DNS服务器缓存检查: 本地DNS服务器会先检查自己的缓存,看是否有该域名的解析记录。
根域名服务器查询: 如果本地DNS服务器缓存中没有记录,它会向根域名服务器发送查询请求。根域名服务器会返回负责顶级域(如
.com
或.cn
)的顶级域名服务器(TLD服务器)的地址。TLD服务器查询: 本地DNS服务器向TLD服务器发送查询请求,TLD服务器会返回负责二级域(如
baidu.com
)的权威DNS服务器的地址。权威DNS服务器查询: 本地DNS服务器向权威DNS服务器发送查询请求,权威DNS服务器会返回
www.baidu.com
的IP地址。
返回IP地址: 本地DNS服务器获得IP地址后,会将该地址返回给操作系统,操作系统再将其返回给浏览器。
问题分析
修改host
一个常见的问题,访问github
比较慢,如何解决?直接科学上网嘛。一个比较常见的回答是让你改系统的host
文件,具体操作:
Windows
打开记事本(以管理员身份运行):
- 按
Windows
键,输入 “记事本”,然后右键点击记事本图标,选择 “以管理员身份运行”。
- 按
打开
hosts
文件:在记事本中,点击 “文件” -> “打开”,然后浏览到以下路径:
1
C:\Windows\System32\drivers\etc\hosts
确保文件类型选择为 “所有文件 (.)”,然后选择
hosts
文件并打开。
编辑
hosts
文件:在文件末尾添加你需要的域名和IP地址对应关系,例如:
1
127.0.0.1 example.com
编辑完成后,保存文件并关闭记事本。
Linux
打开终端。
使用文本编辑器打开
hosts
文件(需要root权限):使用
nano
作为示例,可以用以下命令打开hosts
文件:bash
1
sudo nano /etc/hosts
编辑
hosts
文件:在文件末尾添加你需要的域名和IP地址对应关系,例如:
1
127.0.0.1 example.com
编辑完成后,按
Ctrl + X
,然后按Y
保存并退出
这里能解决访问github
访问的问题,其实就是改变github
域名解析的过程,基于第一点说的流程,主要影响是:
操作系统缓存检查: 在浏览器检查自身缓存之后,它会向操作系统请求查找DNS缓存。在这一步,如果操作系统中
hosts
文件中有相应的域名解析记录,操作系统会直接使用hosts
文件中的IP地址,而不会再继续向DNS服务器发送查询请求。
LDNS服务器修改
LDNS解释
LDNS(Local DNS Server,本地DNS服务器)是指位于用户本地网络中的DNS服务器,通常由互联网服务提供商(ISP)或公司网络管理员提供。LDNS的主要功能是负责处理并缓存本地网络内用户的DNS查询请求,从而提高域名解析的效率。
LDNS的作用:
- 解析域名:当用户在浏览器中输入一个域名时,DNS查询请求首先会被发送到LDNS。如果LDNS缓存中有该域名的解析记录,LDNS会直接返回对应的IP地址,从而快速完成域名解析。
- 缓存查询结果:LDNS会缓存查询结果,当同一个域名再次被请求时,可以直接从缓存中获取IP地址,减少查询时间和网络负载。
- 递归查询:如果LDNS缓存中没有对应的解析记录,LDNS会向上一级的DNS服务器(如ISP提供的DNS服务器或根DNS服务器)发起递归查询,直到找到域名的解析记录并返回给用户。
通过使用LDNS,可以显著提高域名解析的效率,减少网络延迟和提升用户体验。这是因为本地缓存和递归查询可以更快地找到域名对应的IP地址,而不必每次都从根域名服务器开始查询。
分析
同样的,计算机域名解析有问题的时候,或者在内网环境下,同样常见的一个操作是修改DNS服务器地址:
在 Linux 系统中,/etc/resolve.conf
文件用于指定系统的域名解析(DNS)服务器地址。修改此文件可以更改系统使用的DNS服务器,从而影响域名解析的过程。
/etc/resolv.conf
文件内容示例:
1 | # 谷歌的 |
这里的 nameserver
指令指定了 DNS 服务器的IP地址,例如 Google 提供的公共DNS服务器地址 8.8.8.8
和 8.8.4.4
。
对DNS过程的影响:
- 指定DNS服务器: 当你修改
/etc/resolv.conf
文件并添加或更改nameserver
地址时,系统会使用这些指定的DNS服务器来解析域名,而不是使用默认的或自动分配的DNS服务器。 - 优先顺序: 文件中指定的多个 DNS 服务器会按顺序依次查询。如果第一个 DNS 服务器无法响应,系统会尝试第二个,依此类推。
对域名解析流程的具体影响:
- 当浏览器或其他应用程序进行域名解析请求时,操作系统会首先检查
/etc/resolv.conf
中指定的 DNS 服务器。 - 系统会向这些 DNS 服务器发送 DNS 查询,并根据返回的IP地址进行连接。
通过修改 /etc/resolv.conf
文件,可以定制系统使用的DNS服务器,以提高解析速度、确保解析结果准确,或绕过某些网络限制。
LDNS递归查询
一般用dig
工具做DNS测试,直接执行命令dig +trace microsoft.com
看看微软域名解析的整个过程:
1 | ; <<>> DiG 9.16.1-Ubuntu <<>> +trace microsoft.com |
递归查询过程解析:
- 起始查询:
- 用户发出查询请求
dig +trace microsoft.com
。 - 查询请求首先发送到根DNS服务器。
- 用户发出查询请求
- 根DNS服务器响应:
- 根DNS服务器返回负责
.com
顶级域名的TLD服务器列表,例如a.gtld-servers.net
。
- 根DNS服务器返回负责
- TLD服务器查询:
- 本地DNS服务器向
.com
TLD 服务器发送查询请求。 - TLD 服务器返回负责
microsoft.com
域的权威DNS服务器列表,例如ns1-205.azure-dns.com
。
- 本地DNS服务器向
- 权威DNS服务器查询:
- 本地DNS服务器向
microsoft.com
的权威DNS服务器发送查询请求。 - 权威DNS服务器返回
microsoft.com
的A记录(IP地址),例如13.77.161.179
。
- 本地DNS服务器向
- 结果返回:
- 本地DNS服务器缓存查询结果,并将IP地址
13.77.161.179
返回给用户的系统。 - 用户的系统将IP地址返回给浏览器,浏览器与目标服务器建立连接,完成网页请求。
- 本地DNS服务器缓存查询结果,并将IP地址
反问
递归查询是客户端做的吗?
递归查询是由LDNS(本地DNS服务器)来完成的,而不是由请求客户端(如用户的浏览器)来完成的。
LDNS每次都要递归查询会不会很慢?
不会,LDNS有缓存机制:
缓存命中:当LDNS接收到一个DNS查询请求时,首先会检查自身的缓存。如果缓存中有该域名的解析记录,LDNS会直接返回缓存中的IP地址,而无需进行递归查询。
缓存未命中:只有在缓存中没有找到对应的记录时,LDNS才会进行递归查询。这是为了确保域名解析的效率和速度,同时减少对外部DNS服务器的查询请求量。
TTL(Time To Live):每个DNS记录都有一个TTL(生存时间),指定该记录在缓存中保留的时间。当TTL过期后,LDNS会删除缓存中的该记录,并在下一次请求时重新进行递归查询。
负载平衡:通过缓存和TTL机制,LDNS能够优化递归查询的频率,减少不必要的查询负载,提高整体解析效率
NS服务器(权威服务器)返回的是个
CNAME
记录时,LDNS服务器如何处理?DNS 协议规范要求 DNS 解析服务器(如 LDNS)在收到 CNAME 记录后,需要继续解析 CNAME 指向的目标域名,直到获得最终的 A 记录(IP 地址)。
随便写点
一个多月都没更博客了,过年看来点容器的书本来还想更的,结果一躺就不想再开电脑了。。之后有时间再说吧。
DNS这点其实是想写自建DNS服务器的,结果写着写着成写原理的了,有空也再更一下吧,其实估计也就是部署一个named
服务器,写点DNS记录的说明,NS服务器是啥,如何提交给云厂商之类的吧,有空再说咯。