问题引入

很常见的一个面试问题:往浏览器中输入www.baidu.com,到返回界面,整个流程是如何进行的?

除去http请求的过程,单纯来讲域名解析的部分:

  1. 浏览器缓存检查: 浏览器会先检查自身的DNS缓存,看是否已经存储了www.baidu.com的IP地址。如果有缓存,就直接使用该IP地址;如果没有,就继续下一步。

  2. 操作系统缓存检查: 如果浏览器缓存中没有找到,浏览器会向操作系统请求查找DNS缓存。如果操作系统缓存中存在该域名的解析记录,也会直接返回IP地址。

  3. 本地域名服务器(DNS)检查: 如果操作系统缓存中没有找到对应的IP地址,就会向配置的本地DNS服务器发送DNS查询请求。通常,这个DNS服务器是你的ISP(互联网服务提供商)提供的。

  4. 递归查询:

    • 本地DNS服务器缓存检查: 本地DNS服务器会先检查自己的缓存,看是否有该域名的解析记录。

    • 根域名服务器查询: 如果本地DNS服务器缓存中没有记录,它会向根域名服务器发送查询请求。根域名服务器会返回负责顶级域(如 .com.cn)的顶级域名服务器(TLD服务器)的地址。

    • TLD服务器查询: 本地DNS服务器向TLD服务器发送查询请求,TLD服务器会返回负责二级域(如 baidu.com)的权威DNS服务器的地址。

    • 权威DNS服务器查询: 本地DNS服务器向权威DNS服务器发送查询请求,权威DNS服务器会返回www.baidu.com的IP地址。

  5. 返回IP地址: 本地DNS服务器获得IP地址后,会将该地址返回给操作系统,操作系统再将其返回给浏览器。

问题分析

修改host

一个常见的问题,访问github比较慢,如何解决?直接科学上网嘛。一个比较常见的回答是让你改系统的host文件,具体操作:

Windows

  1. 打开记事本(以管理员身份运行):

    • Windows 键,输入 “记事本”,然后右键点击记事本图标,选择 “以管理员身份运行”。
  2. 打开 hosts 文件:

    • 在记事本中,点击 “文件” -> “打开”,然后浏览到以下路径:

      1
      C:\Windows\System32\drivers\etc\hosts
    • 确保文件类型选择为 “所有文件 (.)”,然后选择 hosts 文件并打开。

  3. 编辑 hosts 文件:

    • 在文件末尾添加你需要的域名和IP地址对应关系,例如:

      1
      127.0.0.1   example.com
    • 编辑完成后,保存文件并关闭记事本。

Linux

  1. 打开终端。

  2. 使用文本编辑器打开 hosts 文件(需要root权限):

    • 使用 nano 作为示例,可以用以下命令打开 hosts 文件:

      bash

      1
      sudo nano /etc/hosts
  3. 编辑 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的作用:

  1. 解析域名:当用户在浏览器中输入一个域名时,DNS查询请求首先会被发送到LDNS。如果LDNS缓存中有该域名的解析记录,LDNS会直接返回对应的IP地址,从而快速完成域名解析。
  2. 缓存查询结果:LDNS会缓存查询结果,当同一个域名再次被请求时,可以直接从缓存中获取IP地址,减少查询时间和网络负载。
  3. 递归查询:如果LDNS缓存中没有对应的解析记录,LDNS会向上一级的DNS服务器(如ISP提供的DNS服务器或根DNS服务器)发起递归查询,直到找到域名的解析记录并返回给用户。

通过使用LDNS,可以显著提高域名解析的效率,减少网络延迟和提升用户体验。这是因为本地缓存和递归查询可以更快地找到域名对应的IP地址,而不必每次都从根域名服务器开始查询。

分析

同样的,计算机域名解析有问题的时候,或者在内网环境下,同样常见的一个操作是修改DNS服务器地址:

在 Linux 系统中,/etc/resolve.conf 文件用于指定系统的域名解析(DNS)服务器地址。修改此文件可以更改系统使用的DNS服务器,从而影响域名解析的过程。

/etc/resolv.conf 文件内容示例:

1
2
3
4
5
# 谷歌的
nameserver 8.8.8.8
# 电信
nameserver 114.114.114.114
# 还可以是自己的自建DNS服务器地址

这里的 nameserver 指令指定了 DNS 服务器的IP地址,例如 Google 提供的公共DNS服务器地址 8.8.8.88.8.4.4

对DNS过程的影响:

  1. 指定DNS服务器: 当你修改 /etc/resolv.conf 文件并添加或更改 nameserver 地址时,系统会使用这些指定的DNS服务器来解析域名,而不是使用默认的或自动分配的DNS服务器。
  2. 优先顺序: 文件中指定的多个 DNS 服务器会按顺序依次查询。如果第一个 DNS 服务器无法响应,系统会尝试第二个,依此类推。

对域名解析流程的具体影响:

  • 当浏览器或其他应用程序进行域名解析请求时,操作系统会首先检查 /etc/resolv.conf 中指定的 DNS 服务器。
  • 系统会向这些 DNS 服务器发送 DNS 查询,并根据返回的IP地址进行连接。

通过修改 /etc/resolv.conf 文件,可以定制系统使用的DNS服务器,以提高解析速度、确保解析结果准确,或绕过某些网络限制。

LDNS递归查询

一般用dig工具做DNS测试,直接执行命令dig +trace microsoft.com看看微软域名解析的整个过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; <<>> DiG 9.16.1-Ubuntu <<>> +trace microsoft.com
;; global options: +cmd
. 518400 IN NS a.root-servers.net.
. 518400 IN NS b.root-servers.net.
...
;; Received 508 bytes from 192.168.1.1#53(192.168.1.1) in 27 ms

com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
...
;; Received 493 bytes from 198.41.0.4#53(a.root-servers.net) in 64 ms

microsoft.com. 172800 IN NS ns1-205.azure-dns.com.
microsoft.com. 172800 IN NS ns2-205.azure-dns.net.
...
;; Received 343 bytes from 192.5.6.30#53(a.gtld-servers.net) in 28 ms

microsoft.com. 3600 IN A 13.77.161.179
...
;; Received 43 bytes from 40.90.4.1#53(ns1-205.azure-dns.com) in 20 ms

递归查询过程解析:

  1. 起始查询
    • 用户发出查询请求 dig +trace microsoft.com
    • 查询请求首先发送到根DNS服务器。
  2. 根DNS服务器响应
    • 根DNS服务器返回负责 .com 顶级域名的TLD服务器列表,例如 a.gtld-servers.net
  3. TLD服务器查询
    • 本地DNS服务器向 .com TLD 服务器发送查询请求。
    • TLD 服务器返回负责 microsoft.com 域的权威DNS服务器列表,例如 ns1-205.azure-dns.com
  4. 权威DNS服务器查询
    • 本地DNS服务器向 microsoft.com 的权威DNS服务器发送查询请求。
    • 权威DNS服务器返回 microsoft.com 的A记录(IP地址),例如 13.77.161.179
  5. 结果返回
    • 本地DNS服务器缓存查询结果,并将IP地址 13.77.161.179 返回给用户的系统。
    • 用户的系统将IP地址返回给浏览器,浏览器与目标服务器建立连接,完成网页请求。

反问

  1. 递归查询是客户端做的吗?

    递归查询是由LDNS(本地DNS服务器)来完成的,而不是由请求客户端(如用户的浏览器)来完成的。

  2. LDNS每次都要递归查询会不会很慢?

    不会,LDNS有缓存机制:

    • 缓存命中:当LDNS接收到一个DNS查询请求时,首先会检查自身的缓存。如果缓存中有该域名的解析记录,LDNS会直接返回缓存中的IP地址,而无需进行递归查询。

    • 缓存未命中:只有在缓存中没有找到对应的记录时,LDNS才会进行递归查询。这是为了确保域名解析的效率和速度,同时减少对外部DNS服务器的查询请求量。

    • TTL(Time To Live):每个DNS记录都有一个TTL(生存时间),指定该记录在缓存中保留的时间。当TTL过期后,LDNS会删除缓存中的该记录,并在下一次请求时重新进行递归查询。

    • 负载平衡:通过缓存和TTL机制,LDNS能够优化递归查询的频率,减少不必要的查询负载,提高整体解析效率

  3. NS服务器(权威服务器)返回的是个CNAME记录时,LDNS服务器如何处理?

    DNS 协议规范要求 DNS 解析服务器(如 LDNS)在收到 CNAME 记录后,需要继续解析 CNAME 指向的目标域名,直到获得最终的 A 记录(IP 地址)。

随便写点

一个多月都没更博客了,过年看来点容器的书本来还想更的,结果一躺就不想再开电脑了。。之后有时间再说吧。

DNS这点其实是想写自建DNS服务器的,结果写着写着成写原理的了,有空也再更一下吧,其实估计也就是部署一个named服务器,写点DNS记录的说明,NS服务器是啥,如何提交给云厂商之类的吧,有空再说咯。