在浏览器输入网址 DNS 查询的顺序是如何的?

假如我的电脑是一台全新的电脑,我使用 chrome 查询 www.baidu.com 以后,DNS 的查询是什么规则呢?

我目前的理解如下: (以下步骤皆按照查询失败来进行下一步)

  1. chrome 先查询浏览器缓存
  2. 查询本地 /etc/hosts 文件
  3. 查询本地 DNS服务器
  4. 查询 “.” 根服务器,获取 .com 服务器的地址
  5. 查询 “.com” 顶级域名服务器,获取 baidu.com 一级域名服务器的地址
  6. 查询到 www.baidu.com 的 DNS 服务器
  7. 拿到真正的 ip

不确定是否其中哪一步骤有错误,希望指正。

阅读 1.2k
avatarAI BotBETA

您的理解大部分是正确的,关于 DNS 查询的顺序。不过,我可以帮您更准确地梳理一下这个过程:

  1. 浏览器缓存:Chrome 浏览器首先会检查自己的缓存中是否已经有 www.baidu.com 的 IP 地址记录。如果有,则直接使用这个 IP 地址,而不会发起 DNS 查询。
  2. 操作系统缓存:如果浏览器缓存中没有找到,Chrome 会请求操作系统进行 DNS 解析。操作系统会先检查自己的 DNS 缓存。大多数现代操作系统都会维护一个 DNS 缓存来存储最近解析过的域名和对应的 IP 地址。
  3. /etc/hosts 文件(针对 Unix-like 系统):如果操作系统缓存中也没有找到对应的记录,并且您使用的是 Unix-like 系统(如 Linux 或 macOS),操作系统会查询本地的 /etc/hosts 文件。这个文件通常包含静态的 IP 地址到域名的映射。
  4. 本地 DNS 服务器:如果 /etc/hosts 文件中也没有找到,操作系统会向配置的本地 DNS 服务器发送查询请求。这个本地 DNS 服务器可能是您的网络服务提供商提供的,或者是您在公司或学校网络中配置的。
  5. 根域名服务器:如果本地 DNS 服务器无法解析该域名,它会向根域名服务器发送查询请求。根域名服务器会返回负责 .com 顶级域名的权威 DNS 服务器的地址。
  6. .com 顶级域名服务器:本地 DNS 服务器然后会向 .com 顶级域名服务器发送查询请求,获取 baidu.com 的权威 DNS 服务器的地址。
  7. baidu.com 权威 DNS 服务器:最后,本地 DNS 服务器会向 baidu.com 的权威 DNS 服务器发送查询请求,获取 www.baidu.com 的 IP 地址。
  8. 返回 IP 地址:一旦本地 DNS 服务器从权威 DNS 服务器那里获得了 www.baidu.com 的 IP 地址,它就会将这个 IP 地址返回给操作系统,操作系统再返回给 Chrome 浏览器。浏览器最后使用这个 IP 地址来建立与服务器的连接。

需要注意的是,在查询的过程中,一旦在某一环节找到有效的 IP 地址记录,就会停止后续的查询。而且,为了提高效率,本地 DNS 服务器和操作系统通常会对查询结果进行缓存,以便在后续请求中直接使用,减少网络延迟。

您的理解中,步骤的顺序和描述大致正确,但需要注意的是,操作系统和本地 DNS 服务器的缓存也是 DNS 查询过程中的重要环节。而且,现代操作系统和浏览器通常会使用多种优化策略来提高 DNS 查询的效率和可靠性。

2 个回答

如果单纯从'电脑'的视角来看DNS查询,是没有456这三点的。

  1. 浏览器即将要发起一个http请求时,会委托操作系统查询DNS(创建sockt连接的时候,这里应该算是一个隐式的委托)。
  2. 操作系统执行查询请求时,会读取本地的缓存,还有hosts文件里面的记录。
  3. 当操作系统本地没有记录时,这个时候才会根据网络接口里面的DNS服务器配置来查询。
  4. 从操作系统的角度看,只有查询成功查询失败两个结果。成功则直接使用查询到的结果创建连接,如果是连接dns服务器失败就会使用其他的DNS(这也是配置DNS地址时可以配置两个的原因)
  5. 流程结束。

如果扩展一下,站在DNS服务器的角度看,就是这样的:(这里说的DNS服务器是8.8.8.8这样的公共DNS,或者路由器上运行的本地DNS)

  1. 收到一个来自客户端的DNS查询请求
  2. 检查服务器的缓存里面有没有记录,如果有记录,直接返回记录的结果。
  3. 缓存中没有记录,或者dns记录的ttl已经过期了,dns可能就会它的上游DNS查询一次。
  4. 这里在向上游的DNS查询时,有可能上游也是一台公共的DNS服务器,也有可能没有特定的上游服务器,是进行逐级递归查询。
  5. 再说逐级递归查询,先查询根服务器,得到com顶级服务器的dns地址。
  6. 理想情况下拿到顶级地址之后会,查询baidu,得到baidu的NS地址,再向baidu.com的ns查询得到www对应的ip。(这里就对应你说的456三点)
  7. dns服务器查询的www.baidu.com的ip之后,可能会根据记录的ttl进行缓存,同时把结果响应给客户端。
  8. 结束

上面的这几步对电脑来说是不透明的,电脑只知道发送了dns请求,然后收到响应。

你的理解差不多,有一点小细节可以进一步调整。具体DNS查询的步骤如下:

  1. 浏览器先查看自己的DNS缓存,如果缓存中有www.baidu.com的记录且未过期,就直接返回IP地址。
  2. 如果没有找到,浏览器会去查询操作系统的DNS缓存,这个步骤在Windows上可以通过ipconfig /displaydns查看,而在macOS或Linux上则通常通过系统网络设置服务查询。
  3. 系统会检查本地的hosts文件,这是一个可以手动指定域名到IP地址映射的文件。
  4. 系统会向配置的本地DNS服务器发出查询。这个DNS服务器可能是由你的网络提供商(ISP)提供,或者是你自己设置的DNS服务,比如Google DNS (8.8.8.8)或Cloudflare DNS (1.1.1.1)。
  5. 如果本地DNS服务器没有缓存该域名的记录,它就会进行递归查询。这个过程中首先会去查找根DNS服务器(.),然后根据根服务器提供的信息找到.com顶级域名服务器。从.com顶级域名服务器获取到baidu.com域的服务器地址,最后DNS服务器会提供www.baidu.com的IP地址。
  6. 一旦获得IP地址就会被返回给浏览器,同时这个地址也会被缓存在各级(浏览器、操作系统、本地DNS服务器)中,以便于后续的快速访问。

希望这个查询步骤能帮到你。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏