解析阶段详细流程说明
步骤 | 说明 |
---|---|
① | 浏览器输入:http://www.baidu.com |
② | 查找浏览器自身 DNS 缓存:chrome://net-internals/#dns |
③ | Windows 系统:查找系统 hosts 文件、Linux 系统:查找 /etc/hosts 文件 |
④ | 浏览器就会发起一个 DNS 系统调用(向本地域名服务器发起域名解析请求) |
⑤ | 本地域名服务器 LDNS 替我们的浏览器发起 迭代 DNS 解析请求
|
⑥ | 本地域名服务器把查询 IP 结果返回客户端(浏览器) |
查找浏览器自身 DNS 缓存介绍
在 chrome 浏览器的 url 地址栏输入如下地址
chrome://net-internals/#dns
访问页面结果
Resolved lP addresses of “www.baidu.com”:[“112.80.248.75”, “112.80.248.76”].
No data on which protocols are supported.
Host resolver cache
主机解析器缓存(点击 Clear host cache 即可清除缓存记录)
将其一对应 IP 进行直接请求访问
把 112.80.248.75 在浏览器打开:默认 80 端口(访问结果如下)
Window 系统查找 hosts 文件
打开路径
C:\Windows\System32\drivers\etc
etc 目录展示
里面会有一个 hosts 文件,右击用笔记本打开。在最下面添加如下格式:IP + 空格 + 网址
例如 127.0.0.1 www.baidu.com,那么你访问百度的时候 其实访问的是127.0.0.1(自己电脑的)
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 www.baidu.com
我们使用 Golang 开启一个 127.0.0.1 的 server 进程,验证
package main
import ("net/http")
func handle(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("hello world"))
}
func main() {
http.HandleFunc("/", handle)
http.ListenAndServe("127.0.0.1:80", nil)
}
因为默认端口是 80,所以可以省略端口号,直接访问 127.0.0.1 IP,访问结果展示:
因为我们在 window 的 hosts 文件中配置了 127.0.0.1 www.baidu.com
,现在我们进行验证上述
访问 www.baidu.com 域名地址(结果是 百度搜索页 结果)
问题原因
为什么不是出现不是 hello world,结果是 百度搜索页 呢?
原因:浏览器先查找自身的 DNS 缓存,没有查找到结果才会去 Window 下 hosts 文件查找,所以我们先用进行删除 浏览器 Dns 缓存。
chrome://net-internals/#dns 中 点击 clear host cache
(在 # 查找浏览器自身 DNS 缓存介绍
提到)
验证 127.0.0.1 www.baidu.com
在 # Window 系统查找 hosts 文件
上节中进行修改 Window 中 hosts 文件,并且 删除了 chrome 浏览器的 host cache 缓存,然后继续进行尝试。
访问 www.baidu.com 域名地址(这次更加直接,都直接无法访问此网站了)
分析原因:我们双击 chrome 浏览器的 url 地址,展示结果如下:
这是因为 chrome 浏览器的 域名安全策略 ?
有些网址 http 协议和 https 协议是两个服务,有时候需要访问 http 地址,但 chrome 会默认转成 https 请求地址,而且会不停的跳转,导致我们访问不到 http 的网址,非常的烦人。
如何解决?
在 chrome 浏览器地址输入如下地址:
chrome://net-internals/#hsts
在最下面的 Delete domain security policies 中填写 www.baidu.com 地址,然后点击 Delete
继续访问 www.baidu.com 域名地址(访问成功,结果是 hello world)
继续测试:接下来删除 hosts 文件中 127.0.0.1 www.baidu.com,然后继续访问 www.baidu.com 域名地址,能够发现,结果是 hello world
原因:Chrome 浏览器先查找自身的 DNS 缓存,查找到结果了,不会再去 Window 下 hosts 文件查找域名和 IP 的映射关系。
所以我们如果删除 chrome DNS 缓存,再去访问 www.baidu.com,先查找自身的 DNS 缓存没有查找结果,再去 Window 的 hosts 文件中 没有查找结果,接下来查找 ···(后面的小节会提到)直到映射百度搜索页。
本地域名服务器解析(LDNS)
如果在 hosts 文件中也没有找到对应的条目,浏览器就会发起一个 DNS 系统调用,就会向本地配置的首选 DNS 服务器(LDNS一般是电信运营商提供的,也可以使用像 Google 提供的 DNS 服务器)发起域名解析请求(通过的是 UDP 协议向 DNS 的 53 端口发起请求,这个请求是递归的请求,也就是运营商的 DNS 服务器必须得提供给我们该域名的 IP 地址)。
本地电脑网络设置中的 DNS 服务器,一般是自动设置好的,自动设置的 DNS 地址一般是管理 wifi 路由器的 IP 地址;当然也可以手动设置,比如常见的 Google DNS 服务器 8.8.8.8
本地域名服务器
在我们的网络配置中都会有“DNS 服务器地址”这一项,这个地址就用于解决前面所说的如果两个过程无法解析时要怎么办,操作系统会把这个域名发送给这里设置的 LDNS,也就是本地区的域名服务器。
这个 DNS 通常都提供给你本地互联网接入的一个 DNS 解析服务。例如你是在学校接入互联网,那么你的 DNS 服务器肯定在你的学校。例如你是在一个小区接入互联网的,那这个 DNS 就是提供给你接入互联网的应用提供商,即电信或者联通,也就是通常所说的 SPA,那么这个 DNS 通常也会在你所在城市的某个角落,通常不会很远。
这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约 80% 的域名解析都到这里就已经完成了,所以 LDNS 主要承担了域名的解析工作。
运营商的 DNS 服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。
如何查看本地 DNS 服务器?
对于本地 DNS 服务器地址,Windows 系统使用命令 ipconfig
就可以查看,在 Linux 和 Mac 系统下,直接使用命令 cat /etc/resolv.conf
来查看LDNS服务地址。
查看配置信息:请点击电脑所连接 WiFi 的 属性即可查看网络属性信息(例如如下所示)
SSID: TP-LINK_hh
协议: Wi-Fi 4 (802.11n)
安全类型: WPA2-个人
网络频带: 2.4 GHz
网络通道: 6
链接速度(接收/传输): 300/300 (Mbps)
IPv4 地址: 192.168.1.106
IPv4 DNS 服务器: 172.16.4.4 210.29.152.xxx(前一个是本地局域网,后一个是公网 IP)
根域名服务器解析(Root Server)
域名服务器 4 种不同的类型
根域名服务器
根域名服务器是最高层次的域名服务器。每个根域名服务器都知道所有的顶级域名服务器的域名及其 IP 地址。因特网上共有 13 个不同 IP 地址的根域名服务器。当本地域名服务器向根域名服务器发出查询请求时,路由器就把查询请求报文转发到离这个 DNS 客户最近的一个根域名服务器。这就加快了 DNS 的查询过程,同时也更合理地利用了因特网的资源。
顶级域名服务器
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到 DNS 查询请求时就给出相应的回答(可能是最后的结果,也可能是下一级权限域名服务器的 IP 地址)。
权限域名服务器
这些域名服务器负责管理某个区的域名。每一个主机的域名都必须在某个权限域名服务器处注册登记。因此权限域名服务器知道其管辖的域名与 IP 地址的映射关系。另外,权限域名服务器还知道其下级域名服务器的地址。
本地域名服务器
本地域名服务器不属于上述的域名服务器的等级结构。当一个主机发出DNS请求报文时,这个报文就首先被送往该主机的本地域名服务器。本地域名服务器起着代理的作用,会将该报文转发到上述的域名服务器的等级结构中。本地域名服务器离用户较近,一般不超过几个路由器的距离,也有可能就在同一个局域网中。本地域名服务器的IP地址需要直接配置在需要域名解析的主机中。
解析流程图示
查询根域名服务器 (Root DNS)
如果LDNS没有找到对应的条目,则由本地域名服务器替我们的浏览器发起 迭代 DNS 解析请求
。它首先是会找根域的 DNS 的 IP 地址(这个 DNS 服务器都内置 13 台根域的 DNS 的 IP 地址),找到根域的 DNS 地址,就会向其发起请求。
例如:请问 www.baidu.com 这个域名的 IP 地址是什么啊?
根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址,gTLD 是国际顶级域名服务器,如 .com、.cn、.org 等,全球只有 13 台左右。
根域发现这是一个顶级域 com 域的一个域名,于是就告诉本地域名服务器我不知道这个域名的 IP 地址,但是我知道 com 域的 IP 地址,让本地域名服务器去查找它。
查询顶级域名服务器 (Top Level DNS)
本地域名服务器 (Local DNS Server) 再向上一步返回的 gTLD 服务器发送请求。于是本地域名服务器就得到了 com 域的 IP 地址,再向 com 域的 IP 地址发起了请求(请问 www.baidu.com 这个域名的 IP 地址是什么?)
com 域这台服务器告诉本地域名服务器我不知道 www.google.com 这个域名的IP地址,但是我知道 baidu.com 这个域的 DNS 地址,让本地域名服务器去查找它。
查询权威域名服务器 (Authoritative DNS)
接受请求的 gTLD 服务器查找并返回此域名对应的 Name Server 域名服务器的地址,这个Name Server通常就是注册的域名服务器。
例如:在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
本地域名服务器 (Local DNS Server) 向 google.com 这个域名的 DNS 地址(这个一般就是由域名注册商提供的,像万网,新网等)发起请求(请问 www.baidu.com 这个域名的IP地址是什么?)
这个时候 baidu.com 域的 DNS 服务器一查,果真在我这里,于是就把找到的结果发送给本地域名服务器,这个时候本地域名服务器就拿到了 wwwbaidu.com 这个域名对应的 IP 地址。最后本地域名服务器把结果返回给用户浏览器的主机。
DNS 迭代查询 和 递归查询
DNS域名解析过程:域名解析包含两种查询方式,分别是递归查询和迭代查询。
递归查询
递归查询是一种DNS 服务器的查询模式,在该模式下 DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
迭代查询
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的 DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台 DNS 服务器提交请求,依次循环直到返回查询的结果为止。
由于递归查询对于被查询的域名服务器负担太大,通常采用以下模式:从请求主机到本地域名服务器的查询是递归查询,而 DNS 服务器到 DNS 服务器的查询是迭代查询。
DNS 迭代查询 和 递归查询 综合图示