精华内容
下载资源
问答
  • 单位网络出现访问故障,经排查,是DNS访问出现了问题。在这种情况该怎么解决呢?下面通过本教程给大家介绍故障排查及解决方案,感兴趣的朋友一起看看吧
  • DNS解析器客户端 用Java编写的缩减DNS解析器客户端
  • github上下载的,大家可以上github上搜索,不用在这下载,备份一下以免以后忘了,适用范围比较小众,很多人不需要
  • 它仅在后台运行,记住DNS解析(主机到IP),直到DNS失败。 然后,它计算已为其缓存IP的DNS故障的数量。 单击DNS解析器图标,然后您可以复制/粘贴必要的信息以复制到主机文件(在Windows中为C:/ Windows / System32 ...
  • 如何判断是否出现DNS解析故障点击开始->运行->输入CMD”后回车,输“nslookup”回车,在输入你的域名,如...如果DNS解析正常的话,会反馈回正确的IP地址,我在家就能返回正确地址,则说明家里这个网的DNS解析正常。
  • 联通DNS设置(联通DNS解析有问题的可以设置下)
  • pcap数据包 DNS解析

    2015-03-05 22:36:17
    对pcap包进行解析 获取DNS内容 C语言编写 可以对数据流进行处理
  • DNS解析过程详解

    2013-06-10 16:23:41
    详细的向你介绍DNS解析的过程,配合图片,加上文字的介绍,相信你会看懂的
  • DNS 解析时快时慢,我该怎么办?

    千次阅读 2021-03-11 08:32:02
    文章目录域名与 DNS 解析案例准备案例分析案例 1:DNS 解析失败案例 2:DNS 解析不稳定总结 上一节,我带你一起学习了网络性能的评估方法。简单回顾一下,Linux 网络基于 TCP/IP 协议栈构建,而在协议栈的不同层,...

    评估网络性能(比如 HTTP 性能)时,在测试工具中指定了网络服务的 IP 地址。

    • IP 地址是 TCP/IP 协议中,用来确定通信双方的一个重要标识。
    • 每个 IP 地址又包括了主机号和网络号两部分。
    • 相同网络号的主机组成一个子网;不同子网再通过路由器连接,组成一个庞大的网络。

    IP 地址虽然方便了机器的通信,却给访问这些服务的人们,带来了很重的记忆负担。

    不过,这并不妨碍我们经常使用这个服务。为什么呢?

    当然是因为还有更简单、方便的方式。我们可以通过域名 github.com 访问,而不是必须依靠具体的 IP 地址,这其实正是域名系统 DNS 的由来。

    • DNS(Domain Name System),即域名系统,是互联网中最基础的一项服务,主要提供域名和 IP 地址之间映射关系的查询服务。
    • DNS 不仅方便了人们访问不同的互联网服务,更为很多应用提供了动态服务发现和全局负载均衡(Global Server Load Balance,GSLB)的机制。这样,DNS 就可以选择离用户最近的 IP 来提供服务。即使后端服务的 IP 地址发生变化,用户依然可以用相同域名来访问。

    那么DNS 出现问题时,又该如何分析和排查呢?今天,我就带你一起来看看这个问题。

    域名与 DNS 解析

    域名我们本身都比较熟悉,由一串用点分割开的字符组成,被用作互联网中的某一台或某一组计算机的名称,目的就是为了方便识别,互联网中提供各种服务的主机位置。

    域名是全球唯一的,需要通过专门的域名注册商才可以申请注册。为了组织全球互联网中的众多计算机,域名同样用点来分开,形成一个分层的结构。而每个被点分割开的字符串,就构成了域名中的一个层级,并且位置越靠后,层级越高。

    我们以极客时间的网站 time.geekbang.org 为例,来理解域名的含义。这个字符串中,最后面的 org 是顶级域名,中间的 geekbang 是二级域名,而最左边的 time 则是三级域名。

    如下图所示,注意点(.)是所有域名的根,也就是说所有域名都以点作为后缀,也可以理解为,在域名解析的过程中,所有域名都以点结束。

    在这里插入图片描述
    域名主要是为了方便让人记住,而 IP 地址是机器间的通信的真正机制。

    把域名转换为 IP 地址的服务,也就是我们开头提到的,域名解析服务(DNS),而对应的服务器就是域名服务器,网络协议则是 DNS 协议。

    DNS 协议在 TCP/IP 栈中属于应用层,不过实际传输还是基于 UDP 或者 TCP 协议(UDP 居多) ,并且域名服务器一般监听在端口 53 上。

    既然域名以分层的结构进行管理,相对应的,域名解析其实也是用递归的方式(从顶级开始,以此类推),发送给每个层级的域名服务器,直到得到解析结果。

    不过不要担心,递归查询的过程并不需要你亲自操作,DNS 服务器会替你完成,你要做的,只是预先配置一个可用的 DNS 服务器就可以了。

    当然,我们知道,通常来说,每级 DNS 服务器,都会有最近解析记录的缓存。当缓存命中时,直接用缓存中的记录应答就可以了。如果缓存过期或者不存在,才需要用刚刚提到的递归方式查询。

    所以,系统管理员在配置 Linux 系统的网络时,除了需要配置 IP 地址,还需要给它配置 DNS 服务器,这样它才可以通过域名来访问外部服务。

    比如,我的系统配置的就是 114.114.114.114 这个域名服务器。你可以执行下面的命令,来查询你的系统配置:

    $ cat /etc/resolv.conf
    nameserver 114.114.114.114
    

    另外,DNS 服务通过资源记录的方式,来管理所有数据,它支持 A、CNAME、MX、NS、PTR 等多种类型的记录。比如:

    • A 记录,用来把域名转换成 IP 地址;
    • CNAME 记录,用来创建别名;
    • 而 NS 记录,则表示该域名对应的域名服务器地址。

    当我们访问某个网址时,就需要通过 DNS 的 A 记录,查询该域名对应的 IP 地址,然后再通过该 IP 来访问 Web 服务。

    比如,还是以极客时间的网站 time.geekbang.org 为例,执行下面的 nslookup 命令,就可以查询到这个域名的 A 记录,可以看到,它的 IP 地址是 39.106.233.176:

    $ nslookup time.geekbang.org
    # 域名服务器及端口信息
    Server:		114.114.114.114
    Address:	114.114.114.114#53
     
    # 非权威查询结果
    Non-authoritative answer:
    Name:	time.geekbang.org
    Address: 39.106.233.17
    

    这里要注意,由于 114.114.114.114 并不是直接管理 time.geekbang.org 的域名服务器,所以查询结果是非权威的。使用上面的命令,你只能得到 114.114.114.114 查询的结果。

    前面还提到了,如果没有命中缓存,DNS 查询实际上是一个递归过程,那有没有方法可以知道整个递归查询的执行呢?

    其实除了 nslookup,另外一个常用的 DNS 解析工具 dig ,就提供了 trace 功能,可以展示递归查询的整个过程。比如你可以执行下面的命令,得到查询结果:

    +trace 表示开启跟踪查询
    # +nodnssec 表示禁止 DNS 安全扩展
    $ dig +trace +nodnssec time.geekbang.org
     
    ; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> +trace +nodnssec time.geekbang.org
    ;; global options: +cmd
    .			322086	IN	NS	m.root-servers.net.
    .			322086	IN	NS	a.root-servers.net.
    .			322086	IN	NS	i.root-servers.net.
    .			322086	IN	NS	d.root-servers.net.
    .			322086	IN	NS	g.root-servers.net.
    .			322086	IN	NS	l.root-servers.net.
    .			322086	IN	NS	c.root-servers.net.
    .			322086	IN	NS	b.root-servers.net.
    .			322086	IN	NS	h.root-servers.net.
    .			322086	IN	NS	e.root-servers.net.
    .			322086	IN	NS	k.root-servers.net.
    .			322086	IN	NS	j.root-servers.net.
    .			322086	IN	NS	f.root-servers.net.
    ;; Received 239 bytes from 114.114.114.114#53(114.114.114.114) in 1340 ms
     
    org.			172800	IN	NS	a0.org.afilias-nst.info.
    org.			172800	IN	NS	a2.org.afilias-nst.info.
    org.			172800	IN	NS	b0.org.afilias-nst.org.
    org.			172800	IN	NS	b2.org.afilias-nst.org.
    org.			172800	IN	NS	c0.org.afilias-nst.info.
    org.			172800	IN	NS	d0.org.afilias-nst.org.
    ;; Received 448 bytes from 198.97.190.53#53(h.root-servers.net) in 708 ms
     
    geekbang.org.		86400	IN	NS	dns9.hichina.com.
    geekbang.org.		86400	IN	NS	dns10.hichina.com.
    ;; Received 96 bytes from 199.19.54.1#53(b0.org.afilias-nst.org) in 1833 ms
     
    time.geekbang.org.	600	IN	A	39.106.233.176
    ;; Received 62 bytes from 140.205.41.16#53(dns10.hichina.com) in 4 ms
    

    dig trace 的输出,主要包括四部分。

    • 第一部分,是从 114.114.114.114 查到的一些根域名服务器(.)的 NS 记录。
    • 第二部分,是从 NS 记录结果中选一个(h.root-servers.net),并查询顶级域名 org. 的 NS 记录。
    • 第三部分,是从 org. 的 NS 记录中选择一个(b0.org.afilias-nst.org),并查询二级域名 geekbang.org. 的 NS 服务器。
    • 最后一部分,就是从 geekbang.org. 的 NS 服务器(dns10.hichina.com)查询最终主机 time.geekbang.org. 的 A 记录。

    这个输出里展示的各级域名的 NS 记录,其实就是各级域名服务器的地址,可以让你更清楚 DNS 解析的过程。 为了帮你更直观理解递归查询,我把这个过程整理成了一张流程图,你可以保存下来理解。
    在这里插入图片描述
    当然不仅仅是发布到互联网的服务需要域名,很多时候,我们也希望能对局域网内部的主机进行域名解析(即内网域名,大多数情况下为主机名),可以把主机名和 IP 地址的映射关系,写入本机的 /etc/hosts 文件中,指定的主机名就可以在本地直接找到目标 IP。

    比如,你可以执行下面的命令来操作:

    $ cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain
    ::1         localhost6 localhost6.localdomain6
    192.168.0.100 domain.com
    

    可以在内网中,搭建自定义的 DNS 服务器,专门用来解析内网中的域名。

    而内网 DNS 服务器,一般还会设置一个或多个上游 DNS 服务器,用来解析外网的域名。

    案例准备

    本次案例还是基于 Ubuntu 18.04,同样适用于其他的 Linux 系统。我使用的案例环境如下所示:

    • 机器配置:2 CPU,8GB 内存。
    • 预先安装 docker 等工具,如 apt install docker.io。

    你可以先打开一个终端,SSH 登录到 Ubuntu 机器中,然后执行下面的命令,拉取案例中使用的 Docker 镜像:

    $ docker pull feisky/dnsutils
    Using default tag: latest
    ...
    Status: Downloaded newer image for feisky/dnsutils:latest
    

    然后,运行下面的命令,查看主机当前配置的 DNS 服务器:

    $ cat /etc/resolv.conf
    nameserver 114.114.114.114
    
    

    可以看到,我这台主机配置的 DNS 服务器是 114.114.114.114。

    案例分析

    案例 1:DNS 解析失败

    首先,执行下面的命令

    # 进入案例环境的 SHELL 终端中
    $ docker run -it --rm -v $(mktemp):/etc/resolv.conf feisky/dnsutils bash
    root@7e9ed6ed4974:/#
    

    注意,这儿 root 后面的 7e9ed6ed4974,是 Docker 生成容器的 ID 前缀,你的环境中很可能是不同的 ID,所以直接忽略这一项就可以了。

    注意:下面的代码段中, /# 开头的命令都表示在容器内部运行的命令。

    接着,继续在容器终端中,执行 DNS 查询命令,我们还是查询 time.geekbang.org 的 IP 地址:

    /# nslookup time.geekbang.org
    ;; connection timed out; no servers could be reached
    

    你可以发现,这个命令阻塞很久后,还是失败了,报了 connection timed out 和 no servers could be reached 错误。

    看到这里,估计你的第一反应就是网络不通了,到底是不是这样呢?我们用 ping 工具检查试试。执行下面的命令,就可以测试本地到 114.114.114.114 的连通性:

    /# ping -c3 114.114.114.114
    PING 114.114.114.114 (114.114.114.114): 56 data bytes
    64 bytes from 114.114.114.114: icmp_seq=0 ttl=56 time=31.116 ms
    64 bytes from 114.114.114.114: icmp_seq=1 ttl=60 time=31.245 ms
    64 bytes from 114.114.114.114: icmp_seq=2 ttl=68 time=31.128 ms
    --- 114.114.114.114 ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 31.116/31.163/31.245/0.058 ms
    

    这个输出中,你可以看到网络是通的。那要怎么知道 nslookup 命令失败的原因呢?这里其实有很多方法,最简单的一种,就是开启 nslookup 的调试输出,查看查询过程中的详细步骤,排查其中是否有异常。

    比如,我们可以继续在容器终端中,执行下面的命令:

    /# nslookup -debug time.geekbang.org
    ;; Connection to 127.0.0.1#53(127.0.0.1) for time.geekbang.org failed: connection refused.
    ;; Connection to ::1#53(::1) for time.geekbang.org failed: address not available.
    

    从这次的输出可以看到,nslookup 连接环回地址(127.0.0.1 和 ::1)的 53 端口失败。这里就有问题了,为什么会去连接环回地址,而不是我们的先前看到的 114.114.114.114 呢?

    你可能已经想到了症结所在——有可能是因为容器中没有配置 DNS 服务器。那我们就执行下面的命令确认一下:

    /# cat /etc/resolv.conf
    

    果然,这个命令没有任何输出,说明容器里的确没有配置 DNS 服务器。到这一步,很自然的,我们就知道了解决方法。在 /etc/resolv.conf 文件中,配置上 DNS 服务器就可以了。

    你可以执行下面的命令,在配置好 DNS 服务器后,重新执行 nslookup 命令。自然,我们现在发现,这次可以正常解析了:

    /# echo "nameserver 114.114.114.114" > /etc/resolv.conf
    /# nslookup time.geekbang.org
    Server:		114.114.114.114
    Address:	114.114.114.114#53
     
    Non-authoritative answer:
    Name:	time.geekbang.org
    Address: 39.106.233.176
    

    到这里,第一个案例就轻松解决了。最后,在终端中执行 exit 命令退出容器,Docker 就会自动清理刚才运行的容器。

    案例 2:DNS 解析不稳定

    接下来,我们再来看第二个案例。执行下面的命令,启动一个新的容器,并进入它的终端中:

    $ docker run -it --rm --cap-add=NET_ADMIN --dns 8.8.8.8 feisky/dnsutils bash
    root@0cd3ee0c8ecb:/#
    

    然后,跟上一个案例一样,还是运行 nslookup 命令,解析 time.geekbang.org 的 IP 地址。不过,这次要加一个 time 命令,输出解析所用时间。如果一切正常,你可能会看到如下输出:

    /# time nslookup time.geekbang.org
    Server:		8.8.8.8
    Address:	8.8.8.8#53
     
    Non-authoritative answer:
    Name:	time.geekbang.org
    Address: 39.106.233.176
     
    real	0m10.349s
    user	0m0.004s
    sys	0m0.0
    

    可以看到,这次解析非常慢,居然用了 10 秒。如果你多次运行上面的 nslookup 命令,可能偶尔还会碰到下面这种错误:

    /# time nslookup time.geekbang.org
    ;; connection timed out; no servers could be reached
     
    real	0m15.011s
    user	0m0.006s
    sys	0m0.006s
    

    换句话说,跟上一个案例类似,也会出现解析失败的情况。综合来看,现在 DNS 解析的结果不但比较慢,而且还会发生超时失败的情况。

    这是为什么呢?碰到这种问题该怎么处理呢?

    其实,根据前面的讲解,我们知道,DNS 解析,说白了就是客户端与服务器交互的过程,并且这个过程还使用了 UDP 协议。

    那么,对于整个流程来说,解析结果不稳定,就有很多种可能的情况了。比方说:

    • DNS 服务器本身有问题,响应慢并且不稳定;
    • 或者是,客户端到 DNS 服务器的网络延迟比较大;
    • 再或者,DNS 请求或者响应包,在某些情况下被链路中的网络设备弄丢了。

    根据上面 nslookup 的输出,你可以看到,现在客户端连接的 DNS 是 8.8.8.8,这是 Google 提供的 DNS 服务。对 Google 我们还是比较放心的,DNS 服务器出问题的概率应该比较小。基本排除了 DNS 服务器的问题,那是不是第二种可能,本机到 DNS 服务器的延迟比较大呢?

    前面讲过,ping 可以用来测试服务器的延迟。比如,你可以运行下面的命令:

    /# ping -c3 8.8.8.8
    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=31 time=137.637 ms
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=31 time=144.743 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=31 time=138.576 ms
    --- 8.8.8.8 ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 137.637/140.319/144.743/3.152 ms
    

    从 ping 的输出可以看到,这里的延迟已经达到了 140ms,这也就可以解释,为什么解析这么慢了。实际上,如果你多次运行上面的 ping 测试,还会看到偶尔出现的丢包现象。

    $ ping -c3 8.8.8.8
    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=30 time=134.032 ms
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=30 time=431.458 ms
    --- 8.8.8.8 ping statistics ---
    3 packets transmitted, 2 packets received, 33% packet loss
    round-trip min/avg/max/stddev = 134.032/282.745/431.458/148.713 ms
    

    这也进一步解释了,为什么 nslookup 偶尔会失败,正是网络链路中的丢包导致的。

    碰到这种问题该怎么办呢?显然,既然延迟太大,那就换一个延迟更小的 DNS 服务器,比如电信提供的 114.114.114.114。

    配置之前,我们可以先用 ping 测试看看,它的延迟是不是真的比 8.8.8.8 好。执行下面的命令,你就可以看到,它的延迟只有 31ms:

    /# ping -c3 114.114.114.114
    PING 114.114.114.114 (114.114.114.114): 56 data bytes
    64 bytes from 114.114.114.114: icmp_seq=0 ttl=67 time=31.130 ms
    64 bytes from 114.114.114.114: icmp_seq=1 ttl=56 time=31.302 ms
    64 bytes from 114.114.114.114: icmp_seq=2 ttl=56 time=31.250 ms
    --- 114.114.114.114 ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 31.130/31.227/31.302/0.072 ms
    

    这个结果表明,延迟的确小了很多。我们继续执行下面的命令,更换 DNS 服务器,然后,再次执行 nslookup 解析命令:

    /# echo nameserver 114.114.114.114 > /etc/resolv.conf
    /# time nslookup time.geekbang.org
    Server:		114.114.114.114
    Address:	114.114.114.114#53
     
    Non-authoritative answer:
    Name:	time.geekbang.org
    Address: 39.106.233.176
     
    real    0m0.064s
    user    0m0.007s
    sys     0m0.006s
    

    你可以发现,现在只需要 64ms 就可以完成解析,比刚才的 10s 要好很多。

    到这里,问题看似就解决了。不过,如果你多次运行 nslookup 命令,估计就不是每次都有好结果了。比如,在我的机器中,就经常需要 1s 甚至更多的时间。

    /# time nslookup time.geekbang.org
    Server:		114.114.114.114
    Address:	114.114.114.114#53
     
    Non-authoritative answer:
    Name:	time.geekbang.org
    Address: 39.106.233.176
     
    real	0m1.045s
    user	0m0.007s
    sys	0m0.004s
    

    1s 的 DNS 解析时间还是太长了,对很多应用来说也是不可接受的。那么,该怎么解决这个问题呢?我想你一定已经想到了,那就是使用 DNS 缓存。这样,只有第一次查询时需要去 DNS 服务器请求,以后的查询,只要 DNS 记录不过期,使用缓存中的记录就可以了。

    不过要注意,我们使用的主流 Linux 发行版,除了最新版本的 Ubuntu (如 18.04 或者更新版本)外,其他版本并没有自动配置 DNS 缓存。

    所以,想要为系统开启 DNS 缓存,就需要你做额外的配置。比如,最简单的方法,就是使用 dnsmasq。

    dnsmasq 是最常用的 DNS 缓存服务之一,还经常作为 DHCP 服务来使用。它的安装和配置都比较简单,性能也可以满足绝大多数应用程序对 DNS 缓存的需求。

    我们继续在刚才的容器终端中,执行下面的命令,就可以启动 dnsmasq:

    /# /etc/init.d/dnsmasq start
     * Starting DNS forwarder and DHCP server dnsmasq                    [ OK ]
    

    然后,修改 /etc/resolv.conf,将 DNS 服务器改为 dnsmasq 的监听地址,这儿是 127.0.0.1。接着,重新执行多次 nslookup 命令:

    /# echo nameserver 127.0.0.1 > /etc/resolv.conf
    /# time nslookup time.geekbang.org
    Server:		127.0.0.1
    Address:	127.0.0.1#53
     
    Non-authoritative answer:
    Name:	time.geekbang.org
    Address: 39.106.233.176
     
    real	0m0.492s
    user	0m0.007s
    sys	0m0.006s
     
    /# time nslookup time.geekbang.org
    Server:		127.0.0.1
    Address:	127.0.0.1#53
     
    Non-authoritative answer:
    Name:	time.geekbang.org
    Address: 39.106.233.176
     
    real	0m0.011s
    user	0m0.008s
    sys	0m0.003s
    

    现在我们可以看到,只有第一次的解析很慢,需要 0.5s,以后的每次解析都很快,只需要 11ms。并且,后面每次 DNS 解析需要的时间也都很稳定。

    案例的最后,还是别忘了执行 exit,退出容器终端,Docker 会自动清理案例容器。

    总结

    今天,我带你一起学习了 DNS 的基本原理,并通过几个案例,带你一起掌握了,发现 DNS 解析问题时的分析和解决思路。

    DNS 是互联网中最基础的一项服务,提供了域名和 IP 地址间映射关系的查询服务。很多应用程序在最初开发时,并没考虑 DNS 解析的问题,后续出现问题后,排查好几天才能发现,其实是 DNS 解析慢导致的。

    试想,假如一个 Web 服务的接口,每次都需要 1s 时间来等待 DNS 解析,那么,无论你怎么优化应用程序的内在逻辑,对用户来说,这个接口的响应都太慢,因为响应时间总是会大于 1 秒的。

    所以,在应用程序的开发过程中,我们必须考虑到 DNS 解析可能带来的性能问题,掌握常见的优化方法。这里,我总结了几种常见的 DNS 优化方法。

    • 对 DNS 解析的结果进行缓存。缓存是最有效的方法,但要注意,一旦缓存过期,还是要去 DNS 服务器重新获取新记录。不过,这对大部分应用程序来说都是可接受的。

    • 对 DNS 解析的结果进行预取。这是浏览器等 Web 应用中最常用的方法,也就是说,不等用户点击页面上的超链接,浏览器就会在后台自动解析域名,并把结果缓存起来。

    • 使用 HTTPDNS 取代常规的 DNS 解析。这是很多移动应用会选择的方法,特别是如今域名劫持普遍存在,使用 HTTP 协议绕过链路中的 DNS 服务器,就可以避免域名劫持的问题。

    • 基于 DNS 的全局负载均衡(GSLB)。这不仅为服务提供了负载均衡和高可用的功能,还可以根据用户的位置,返回距离最近的 IP 地址。

    展开全文
  • DNS解析地址

    千次阅读 2019-07-22 21:36:03
    1.DNS域名解析 1.1 DNS产生背景 用户与互联网的某台主机进行通讯时必须知道对方的IP地址,但是要用户很记住32位ip地址时件很反人类的事情(即使是用点分十进制也不容易记住),而我们睿智的程序员早已经料到这一点,...

    1.DNS域名解析

    1.1 DNS产生背景
    用户与互联网的某台主机进行通讯时必须知道对方的IP地址,但是要用户很记住32位ip地址时件很反人类的事情(即使是用点分十进制也不容易记住),而我们睿智的程序员早已经料到这一点,在应用层为了方便用户记忆,连接在互联网上的主机不仅有ip地址还有主机名字。DNS域名系统能够把主机的名字转换为ip地址。
    在上古年代,准确的说是在APRPANET(1969年),整个网络只有数百台计算机,有一个host文件,里面列出了有关主机名和ip地址的映射,用户只要输入有关计算机主机名就能得到相应的ip地址。

    题外话:为什么主机处理ip报文需要32位IP地址(如果是ipv6就是128位ip地址)而不是域名?

    答案是因为ip地址无论是32位还是128位都是定长的,而域名长度则是不固定的,主机处理起来比较麻烦,所以需要ip地址。
    到了现代,理论上我们能用一个服务器储存所有的有关主机名和ip地址的映射,可惜想法很美好,但是现在的互联网规模已经不能同日而语了,如果只有一台服务器,它会因为负荷过大而无法运行,而这台服务器一旦无法运行,整个互联网就会big-bang了。
    睿智的攻城狮早再1983年规定了域名的树装层次命名,并且使用分布式的DNS域名系统。

    DNS使得大多数的域名都在本地进行解析,仅需要少量的信息需要传到网上查询,因为是分布式的,所以即使某一台服务器出现了故障问题也不大。
    一个域名转为ip的过程位:当一个应用程序需要将域名转化为ip,首先会调用解析程序,成为DNS服务的客户,将要转化的域名写入到DNS请求报文中以UDP的方式发送(主要是为了节约资源)本地域名服务器中,本地域名服务器在查询到相关的ip后就会将ip地址以回答报文中返回,应用进程获得ip地址后即可通讯。
    若本地域名服务器无法回答此请求,本地域名服务器就会成为DNS服务的另一个客户,向其他的域名服务器发出请求,直到找到ip地址。
    开始的时候我们可以理解,不过首先我们要了解几个概念
    1.2 互联网的域名系统
    早起的互联网使用了非等级的名字结构,其优点是名字简短。但是当互联网上的用户数急剧增加时,用非等级的名字空间来管理一个很大的而且是经常变化的名字集合是非常困难的。因此,互联网后来就采用了层次树状结构的命名方法。采用这种命名方法,任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名。这里“域”是名字空间中间中一个可被管理的划分。域可以划分为子域,而子域还可以继续划分为子域的子域,就这样就形成了顶级域,二级域,三级域,等等。如下图所示。

    计算机网络
    上图出自计算机网络第七版

    DNS规定:域名中的标号由英文字母和数字组成,每一个标号不超过63个字符(但为了方便记忆,最好不要超过12个字符),也不区分大小写字母。标号中除连接字符外不能使用其他的标点符号。级别最低的域名写在最左边,而级别最高的顶级域名写在最右边。由多个标号组成的完整域名总共不超过266个字符。
    DNS既不规定一个域名需要包含多少下级域名,也不规定每一级的域名代表什么意思。各级域名由其上一级的域名管理机构管理,而最高级的顶级域名管理机构则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是唯一的,并且也容易设计出一种查询域名的机制。
    需要注意的是,域名只是个逻辑概念,并不代表计算机所在的物理地点。变长的域名和使用有助记忆的字符串,是为了便于人使用。而IP地址是定长的32位二进制进制数字则非常便于机器进行处理。这里需要注意,域名中的“点”和点分十进制IP地址中的点并无一一对应的关系。点分十进制IP地址中一定是包含三个点,但是每一个域名中的点的数目不一定是三个。

    我们可以用一颗树来形象的表示域名系统
    在这里插入图片描述
    上面是一个n叉树,每一个父节点的域名管理下面的子节点的域名,就这样分下去,直到树叶是一个个计算机,一旦某个单位有了自己的域名自己就可以决定是否往下分割,而不必向上级域名请示。域名树的树叶就是单台计算机的名字,它不能再继续往下划分了。互联网的域名划分是按照机构的组织来划分的,与物理的网络无关,与IP地址中的子网也没关系。
    1.3域名服务器
    上面的互联网域名空间是逻辑上,而现实中,我们既不需要那么多域名服务器,会使效率降低,因此DNS使用划分区的方式解决这个问题。
    一个区就是一个服务器负责的范围,区中的节点要保证互相连通,每个区都有一个权限域名服务器,实际上DNS是以区为单位而不是以域为单位的。
    下面的例子节选自《计算机网络第七版》
    在这里插入图片描述
    在这里插入图片描述
    实际上笔者开始也对DNS的服务器的单位有误会,误以为每一个域都要配一个服务器,实际上不需要。(汗)
    搞完了上面的基础概念,我们可以对DNS干的事情进行讨论了。
    1.4域名解析过程
    这里要了解两个概念,递归查询和迭代查询。
    迭代查询是指:一般是主机向本地域名服务器查询方式,当本地域名服务器向根服务器请求查询的域名,根服务器告诉本地服务器下一步应该去哪个顶端服务器查找,将该顶端服务器的ip告诉本地域名服务器,到了该顶端服务器要么把该域名解析的ip地址告诉本地域名服务器,要么告诉本地域名服务器,下一步应该到哪个二级域名服务器,依次类推直到找到域名对应的ip地址,然后把这个ip地址发给主机。
    递归查询是指:一般是本地域名服务器向根域名服务器查询方式,如果主机询问的本地域名服务器不知道ip地址,本地域名服务器以DNS客户的身份向根域名发送DNS请求报文,而不是让该主机进行查询。

    其实笔者在写这个查询时脑袋是晕晕的,看不出两个查询有什么区别,不过加上下面这幅图应该能看明白。
    在这里插入图片描述

    所谓的迭代查询,使让本地域名服务器来一个个访问其他的域名服务器直到找到IP,而递归查询是让每个相应主机,自己查询下一层的域名服务器直到找到ip,将结果返回个主机。
    总结起来就是 自己动 和 自己躺着别人动的区别(φ(≧ω≦*)♪)

    顺便说一下,本地域名服务器也是有记忆的,如果它在自己的记录里找到了对应的ip地址,就不会向根域名服务器发送DNS请求报文,如果记录里虽然没有ip地址但是又顶端域名服务器的ip,也不会向根域名服务器发送DNS请求报文,而是直接向顶端域名服务器发送DNS请求报文,这样做可以达到的减少网络负担,每隔一段时间,域名服务器就会从缓存中删掉,又重新查询,为了内容正确。

    所有的DNS的概念零件已经介绍完毕,下面我们来看DNS域名解析的全貌
    当一个用户在地址栏输入www.taobao.com时,DNS解析有大致十个过程如下:

    1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
    2. 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
    3. 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
    4. 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析
    5. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
    6. 此时LDNS再发送请求给上一步返回的gTLD
    7. 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
    8. Name Server根据映射关系表找到目标ip,返回给LDNS
    9. LDNS缓存这个域名和对应的ip
    10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

    下面为相应的流程图。
    在这里插入图片描述
    -----------我------------------是----------------分----------割-------------------线----------------
    写完DNS解析地址才算写出了输入url后发生的事情里的第一片拼图,感觉自己写的,还很不完善o(≧口≦)o
    这篇博客如果哪里有不对,或者知识盲区的地方请指出了,真的十分的感谢
    o( =•ω•= )m

    参考资料:
    图解http(日)上野宣
    《计算机网络第七版》谢希仁

    展开全文
  • 用于异步DNS解析器。 DNS组件的重点是提供异步DNS解析。 但是,它实际上是用于处理DNS消息的工具包,可以轻松地用于创建DNS服务器。 目录 执照 参考 基本用法 最基本的用法是仅通过解析器工厂创建解析器。 您...
  • 2 案例2:特殊DNS解析 2.1 问题 沿用案例1,本例要求掌握DNS轮询、泛域名解析的配置,实现的目标如下: 为站点 www.tedu.cn 提供DNS轮询解析,三台Web服务器节点的IP地址分别为:192.168.4.100、192.168.4.110、192....
  • DNS解析与CDN加速

    千次阅读 2019-03-12 23:21:26
    DNS解析与CDN加速1.DNS解析1.1 域名系统DNS1.2 DNS解析二、几个概念1.CDN架构2.静态加速3.动态加速三、CDN加速1.CDN架构2.静态加速3.动态加速四、http中的Nocache与no1.CDN架构2.静态加速3.动态加速欢迎使用Markdown...

    一.DNS解析

    1. 域名系统DNS

    • 域名系统的前世今生
        域名系统的产生的原因是用户通过形如198.26.92.33点分十进制的IP地址访问因特网的主机时,实在是记不住。因此早在ARPANET(美国国防部高级研究计划署开发的世界上第一个运营的封包交换网络)时代,就在hosts文件中配置主机名字和IP地址的对应关系。
        随后网络中主机的爆炸增长,计算机科学家保罗·莫卡派乔斯才设计出了域名系统,即Domain Name System,DNS中强调域的概念,是联机分布式数据库系统,采用客户端-服务器方式。
        如今在自己电脑中仍然可以通过配置hosts对应IP地址,访问所需网页。
    • 域名长什么样?
      (1)中国传媒大学官网域名:cuc.edu.cn
      (2)华为官网域名:huawei.com
      (3)IPV6反向解析域名:ip6.apra
      可以看出域名的结构是分层次的:…三级域名.二级域名.顶级域名,具体可见下图。
      在这里插入图片描述
      顶级域名(Top Level Domain)主要分为三大类:
      (1)国家顶级域名nTLD(National Top-Level Domain):如cn为China表示中国,us为The United States表示美国。
      (2)通用顶级域名gTLD(generic Top-Level Domain):如com为Commercial代表商业机构,org为Organizations表示非盈利组织。
      (3)基础结构域名(infrastructure domain):这类域名比较少见,如ipv6.arpa,用于域名反向解析为IPV6地址。

    2. DNS解析

    • 域名服务器

      从域名到IP地址的解析需要调用域名服务器程序 ,把运行域名解析程序的服务器称为域名服务器。域名服务器管辖域名,并且它很厉害,能够按片按区(zone)区管理,区最大时等于域,见下图。
    在这里插入图片描述
    域名服务器分为以下四类:
    (1)根域名服务器。知道所有的顶级域名服务器的域名和IP地址,如果本地域名服务器无法对域名进行解析时,都要求助于根域名服务器,由根域名服务器告诉下一步应该去查找哪个顶级域名服务器。共有从 a.root-servers.netm.root-servers.net 13个不同IP地址的根域名服务器(不代表只有13个域名服务器,而是有13套装置,内部有很多域名服务器)。
    (2)顶级域名服务器。管理所有的二级域名服务器器的域名和IP地址。
    (3)权限域名服务器。管理下一级的权限域名服务器的域名和IP地址。
    (4)本地域名服务器。主机发送DNS查询请求时,查询首先要通过本地域名服务器,每一个因特网服务提供者ISP或一个大学或一个企业都可以拥有一个本地域名服务器,平时在PC中可以设置,Windows设置见下图。
    在这里插入图片描述

    • 域名如何解析?

      通常主机向本地域名服务器采用递归查询(recursive query),意思是主机询问本地域名服务器,本地域名服务器不知道时,就以DNS客户的身份向根域名服务器继续发送查询请求报文,而不是让主机进行下一步查询。通常本地域名服务器向根域名服务器采用迭代查询(iterative query),意思是根域名服务器返回给本地域名服务器一个要查询的IP地址,或者告诉本地域名服务器下一步向哪个顶级域名服务器查询,或者报错无法查询到所需的IP地址,具体见下图,以查询www.cuc.edu.cn域名为例。
    在这里插入图片描述
    总共有10个步骤,,使用10个UDP用户数据报的报文,本地域名服务器进行4次迭代查询后,从 dns.cuc.edu.cn 中得到 www.cuc.edu.cn 的IP地址:
    (1)用户主机向本地域名服务器进行递归查询。
    (2)本地域名服务器采用迭代查询,首先选择根域名服务器 d.root-servers.net 查询。
    (3)根域名服务器 d.root-servers.net 告诉本地域名服务器,下一次应查询的顶级域名服务器cn的地址 x.dns.cn (很多个)和对应的IP地址。
    (4)本地域名服务器选择顶级域名服务器 e.dns.cn 进行查询。
    (5)顶级域名服务器 e.dns.cn 告诉本地域名服务器,权限域名服务器 edu.cn 的域名地址 x.edu.cn (很多个,下面dig中的 ns.cernet.net 为中国教育和科研计算机网的域名服务器地址)和对应的IP地址。
    (6)本地域名服务器选择权限域名服务器 dns.edu.cn 进行查询。
    (7)权限域名服务器 dns.edu.cn 告诉本地域名服务器,权限域名服务器 cuc.edu.cn 的域名地址 bdns.cuc.edu.cnbdns2.cuc.edu.cn.、pdns.cuc.edu.cn 和对应的IP地址。。
    (8)本地域名服务器选择权限域名服务器 bdns.cuc.edu.cn 进行查询。
    (9)权限域名服务器 bdns.cuc.edu.cn 告诉本地域名服务器, www.cuc.edu.cn 的IP地址。
    (10)本地域名服务器告诉查询主机 www.cuc.edu.cn 的IP地址。

    在Windows中安装dig.exe后,用dig www.cuc.edu.cn +trace 命令行查询解析过程如下所示:

    C:\Users\user>dig www.cuc.edu.cn +trace
    ; <<>> DiG 9.9.7 <<>> www.cuc.edu.cn +trace
    .                       343445  IN      NS      e.root-servers.net.
    .                       343445  IN      NS      i.root-servers.net.
    .                       343445  IN      NS      c.root-servers.net.
    .                       343445  IN      NS      l.root-servers.net.
    .                       343445  IN      NS      a.root-servers.net.
    .                       343445  IN      NS      h.root-servers.net.
    .                       343445  IN      NS      g.root-servers.net.
    .                       343445  IN      NS      b.root-servers.net.
    .                       343445  IN      NS      d.root-servers.net.
    .                       343445  IN      NS      f.root-servers.net.
    .                       343445  IN      NS      j.root-servers.net.
    .                       343445  IN      NS      k.root-servers.net.
    .                       343445  IN      NS      m.root-servers.net.
    ;; Received 239 bytes from 114.114.114.114#53(114.114.114.114) in 117 ms
    //以上为本地域名服务器向根域名服务器求助
    cn.                     172800  IN      NS      a.dns.cn.
    cn.                     172800  IN      NS      b.dns.cn.
    cn.                     172800  IN      NS      c.dns.cn.
    cn.                     172800  IN      NS      d.dns.cn.
    cn.                     172800  IN      NS      e.dns.cn.
    cn.                     172800  IN      NS      f.dns.cn.
    cn.                     172800  IN      NS      g.dns.cn.
    cn.                     172800  IN      NS      ns.cernet.net.
    ;; Received 705 bytes from 199.7.x.x#53(d.root-servers.net) in 78 ms
    //以上为从根域名服务d.root-servers.net中获取的cn顶级域名服务器的域名地址和IP地址
    edu.cn.                 172800  IN      NS      deneb.dfn.de.
    edu.cn.                 172800  IN      NS      ns2.cuhk.hk.
    edu.cn.                 172800  IN      NS      dns.edu.cn.
    edu.cn.                 172800  IN      NS      dns2.edu.cn.
    edu.cn.                 172800  IN      NS      ns2.cernet.net.
    ;; Received 682 bytes from 203.119.x.x#53(e.dns.cn) in 278 ms
    //以上为从e.dns.cn顶级域名服务器获取edu.cn权限域名服务器的域名地址和IP地址
    cuc.edu.cn.             172800  IN      NS      bdns2.cuc.edu.cn.
    cuc.edu.cn.             172800  IN      NS      pdns.cuc.edu.cn.
    cuc.edu.cn.             172800  IN      NS      bdns.cuc.edu.cn.
    ;; Received 397 bytes from 202.112.x.x#53(dns.edu.cn) in 1 ms
    //以上为从dns.edu.cn权限域名服务器获取cuc.edu.cn权限域名服务器的域名地址和IP地址
    www.cuc.edu.cn.         43200   IN      A       202.205.22.207
    cuc.edu.cn.             43200   IN      NS      PDNS.cuc.edu.cn.
    cuc.edu.cn.             43200   IN      NS      BDNS2.cuc.edu.cn.
    cuc.edu.cn.             43200   IN      NS      BDNS.cuc.edu.cn.
    ;; Received 193 bytes from 202.205.x.x#53(bdns.cuc.edu.cn) in 3 ms
    //以上为bdns.cuc.edu.cn权限域名服务器获取www.cuc.edu.cn的IP地址
    
    另一种DNS查询方式:主机和本地域名服务器都采取递归查询,见下图。

    在这里插入图片描述

    二、CDN加速

    1.什么是CDN

      CDN英文全称为 Content Delivery Network,即内容分发网络。CDN构建在现有的网络之上,将网站的内容分发到最接近用户的边缘节点。举例:假设广州用户要访问的服务器在北京,利用CDN技术后,用户不用“翻山越岭”,经过各种网络到达北京的服务器,而是直接访问在广州的CDN边缘节点。

      传统的DNS解析访问

    在这里插入图片描述
      使用CDN后的访问
    在这里插入图片描述
    (1)用户访问域名 www.huawei.com 递归交给本地域名服务器去负责查询。
    (2)本地域名服务器经过迭代查询由 huawei.com 的域名服务器返回CNAME解析到的地址 www.huawei.com.akadns.net
    (3)本地域名服务器去迭代查询 www.huawei.com.akadns.net 经过dig +trace 命令追踪发现又经过一次CNAME到 www.huawei.com.lxdns.com ,具体原因没有深究,暂且认为此 www.huawei.com.lxdns.com 为真正的CDN DNS域名服务器地址;本地域名服务器再次去迭代查询 www.huawei.com.lxdns.com 的IP地址。
    (4)经过DNS全局负载均衡和区域负载均衡等一系列的智能调度,分配CDN节点,确定 www.huawei.com.lxdns.com 的IP地址。
      全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备。
      区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
    (5)返回CDN server(CDN节点)的IP地址。
    (6)返回CDN域名 www.huawei.com.lxdns.com 的IP地址。
    (7)返回 www.huawei.com 对应 CDN域名 www.huawei.com.lxdns.com 的IP地址
    (8)用户访问 www.huawei.com.lxdns.com 的IP地址对应的CDN server(CDN 节点),如果有缓存则直接到步骤11返回数据。如果没有则进行步骤9回源,再到步骤10,再到步骤11,返回数据。

    2.静态加速

      静态加速是指对网页中的静态资源(包括html文件、CSS文件、js文件、图片、flash动画等)进行CDN节点缓存,使得用户在访问网页中的静态资源时,调取CDN边缘节点缓存;在访问网页中的动态资源如asp、php、jsp等时从源站中调取,从而实现“动静分离”,达到加速的目的。“动静分离”的好处在于用户访问网站时,静态资源直接从离自己最近的CDN节点缓存中获取(具体架构见使用CDN后的访问,以访问 www.huawei.com 为例),减少用户访问静态资源的时间,同时又降低源站服务器的带宽压力、静态资源访问压力。

    3.动态加速

      动态加速是指CDN的DNS解析中通过动态链路探测,监控网络环境的变化,监控各地网络延迟,寻找到一条最稳定、最高效、最快速的路径,回源动态资源,从而实现动态资源(如asp、php、jsp等)加速。然后构成链路列表,绑定到DNS解析上,更新到CDN的本地域名服务器上。简单架构见下图所示。
    在这里插入图片描述


    参考:


    1、《深入分析 Java Web 技术内幕(修订版)》 许令波著 20-25页

    2、CDN的基本原理和基础架构:https://yq.aliyun.com/articles/104041

    3、《计算机网络(第6版)》谢希仁著 235-244页

    展开全文
  • 片文章介绍了C++如何实现DNS域名解析,还有对相关技术的介绍,代码很详细,需要的朋友可以参考下
  • DNS解析错误解决办法

    2011-11-22 11:48:10
    DNS解析错误解决办法,用于DNS服务器无法启动时,给用户带来方便解决问题。
  • DNS解析顺序

    万次阅读 2018-10-10 11:02:03
    学习过计算机基础和网络的人都知道域名解析的大概原理和过程,就是细节可能不太清除。下面我就简单介绍一下域名解析的大概过程: DNS的作用: DNS的作用:在互联网中,其实没有类似于www.xxx.com这种域名方式,而...

    学习过计算机基础和网络的人都知道域名解析的大概原理和过程,就是细节可能不太清除。下面我就简单介绍一下域名解析的大概过程:

    DNS的作用:

    DNS的作用:在互联网中,其实没有类似于www.xxx.com这种域名方式,而替代的是以IP地址,如222.222.222.222,那我们在IE地址栏中应当输入222.222.222.222才能打开网站www.xxx.com,但我们细想一下,互联网上的网站成千上万,如果每个网站登陆都需要记住一大串数字,那是不是特别不方便,对于记忆力不强的人,根本无法记住这么烦琐的数字。这个时候DNS就出现了,它的作用就是将222.222.222.222解析为www.xxx.com,那么我们登陆的时候就直接输入域名就可以了。

    为什么一定要设置DNS才能上网?有些朋友可能会发现,为什么我可能登陆QQ、MSN,但却打不开网页呢?其实大部分原因都是因为DNS服务器故障造成的,DNS服务器地址是唯一的,是运营商提供给终端用户用来解析IP地址及域名的关系,而如果不设定DNS服务器地址,那么就无法查询地址的去向,自然也就打不开网页,而QQ、MSN等即时聊天软件,采用的是UDP传输协议,即不可靠传输协议,无需提供DNS服务器地址,也同样可以登陆。

     

    DNS缓存简介:

    DNS缓存指DNS返回了正确的IP之后,系统就会将这个结果临时储存起来。并且它会为缓存设定一个失效时间 (例如N小时),在这N小时之内,当你再次访问这个网站时,系统就会直接从你电脑本地的DNS缓存中把结果交还给你,而不必再去询问DNS服务器,变相“加速”了网址的解析。

      当然,在超过N小时之后,系统会自动再次去询问DNS服务器获得新的结果。所以,当你修改了 DNS 服务器,并且不希望电脑继续使用之前的DNS缓存时,就需要手动去清除本地的缓存了。

     

    DNS缓存分类:

    1)浏览器DNS缓存(内存中): 浏览器会按照一定频率缓存DNS记录

    2)本地DNS缓存(内存中): 如果浏览器缓存中找不到需要的DNS记录,那就去操作系统找。

    3)本地HOSTS文件: Windows系统中位于C:\Windows\System32\drivers\etc

    4)路由器DNS(可以登录后台设置DNS服务器地址): 路由器自动获取DNS地址,也可以手动

         修改(路由器DNS被篡改会造成域名劫持,你访问的网址都会被定位到同一个位置,但是

         IP直接可以访问)

    5)ISP的DNS服务器:  ISP(互联网服务提供商、联通电信移动),ISP有专门的DNS服务器应

         对DNS查询请求

    6)根服务器: ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询

         (以访问www.baidu.com为例, DNS服务器先问根域名服务器.com域名服务器的IP地址

         ,然后再问.com域名服务器,以此类推)

     

    调用系统缓存需要跨进程,消耗大,因此为了解析速度的方便,就有了一系列缓存来加快IP查找速度。 

    浏览器DNS查找顺序一般是这样的: 

         浏览器DNS缓存->本地系统DNS缓存->本地计算机HOSTS文件->ISP DNS缓存->递归搜索

    期间如果查询到了,也就直接访问ip地址了,这个就像三级缓存原理一样。

     

    我们有时候在破解或者是网络损坏的情况下会清除一些缓存,修改HOSTS文件来达到目的,

    下面我就简单示例一下:

    我的是无线网络,系统Win10

    查看DNS服务器以及DHCP服务器和自己的IP地址:

    cmd->ipconfig/all可以查看,其中有些公网IP是可以定位位置的,这里就不展示了

    可以看到我的DHCP服务器ip,以及我的DNS服务器的首选ip为114.114.114.114(位于北京人民英雄纪念碑),还有

    一个在我位置附近的DNS服务器IP xxx.xxx.xxx.xxx

    全国通用DNS地址(国内用户推荐使用,速度较快!)
    首先DNS服务器地址添:114.114.114.114
    备用DNS服务器地址添:114.114.115.115
    全球通用DNS地址(此DNS地址为谷歌服务器的)
    首选DNS服务器地址添:8.8.8.8
    备用DNS服务器地址添:8.8.4.4
    无线局域网适配器 WLAN:
    
       连接特定的 DNS 后缀 . . . . . . . :
       描述. . . . . . . . . . . . . . . : Intel(R) Dual Band Wireless-AC 3165
       物理地址. . . . . . . . . . . . . : xx-xx-xx-xx-xx-xx
       DHCP 已启用 . . . . . . . . . . . : 是
       自动配置已启用. . . . . . . . . . : 是
       IPv6 地址 . . . . . . . . . . . . : 2001:da8:4002:3301:45fd:6156:b8c3:xxxx(首选)
       临时 IPv6 地址. . . . . . . . . . : 2001:da8:4002:3301:cdc3:eff1:9911:xxxx(首选)
       本地链接 IPv6 地址. . . . . . . . : fe80::45fd:6156:b8c3:42ed%7(首选)
       IPv4 地址 . . . . . . . . . . . . : 10.101.41.181(首选)
       子网掩码  . . . . . . . . . . . . : 255.255.128.0
       获得租约的时间  . . . . . . . . . : 2018年10月9日 12:15:50
       租约过期的时间  . . . . . . . . . : 2018年10月11日 8:49:26
       默认网关. . . . . . . . . . . . . : fe80::1614:4bff:fe80:3c21%7
                                           10.101.127.254
       DHCP 服务器 . . . . . . . . . . . : 10.101.127.254
       DHCPv6 IAID . . . . . . . . . . . : 66597953
       DHCPv6 客户端 DUID  . . . . . . . : xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx
       DNS 服务器  . . . . . . . . . . . : 114.114.114.114
                                           xxx.xxx.xxx.xxx
       TCPIP 上的 NetBIOS  . . . . . . . : 已启用

    查看自己的本地dns缓存:

    .............................................. 
    记录名称. . . . . . . : ditu.google.cn
        记录类型. . . . . . . : 1
        生存时间. . . . . . . : 68
        数据长度. . . . . . . : 4
        部分. . . . . . . . . : 答案
        A (主机)记录  . . . . : 203.208.41.79
    
    
        记录名称. . . . . . . : ditu.google.cn
        记录类型. . . . . . . : 1
        生存时间. . . . . . . : 68
        数据长度. . . . . . . : 4
        部分. . . . . . . . . : 答案
        A (主机)记录  . . . . : 203.208.41.87
    ..............................................

    清除本地dns缓存:

    C:\Users\Xxxxxxx>ipconfig/flushdns
    
    Windows IP 配置
    
    已成功刷新 DNS 解析缓存。
    

    清除浏览器缓存:

    我们在开发的时候,有时候会给某个域名绑hosts,用于本地开发测试,但是绑了之后,用谷歌浏览器访问会发现并没有生效,按F12会发现访问的还是线上的ip,说明浏览器是有该域名的dns缓存的,那么如何清除浏览器的dns缓存呢?

    谷歌浏览器清除方法如下:打开浏览器,访问如下地址

    chrome://net-internals/#dns

    如下图:

    点击 clear host cache,就清楚了浏览器的dns缓存,再访问绑hosts的域名,就会发现ip变啦

    如果是firefox火狐浏览器的话,可以按照以下方式:

    在地址栏中 about:config 并回车,可能会出现一个警告信息,直接点击按钮进入,会出现firefox的所有配置信息,通过搜索dns 进行过滤,可以看到一项名为 network.dnsCacheExpirationGracePeriod 项,它对应的值就是DNS缓存的时间,双击此项,会出现修改的提示框,填入 0 (不缓存DNS)即可。 

     

    最后给大家推荐一篇讲解浏览器缓存吐槽的英文文章:

    https://dyn.com/blog/web-browser-dns-caching-bad-thing/

    展开全文
  • 曲奇智能DNS解析系统(CookyDNS)(以下简称CookyDNS)提供域名授权解析服务,他是完全自主开发的DNS服务器软件,不是BIND或这NSD之类的DNS软件的修改产品,可以快速简单安装,配置简单、并且有设置向导和安装程序、...
  • 1,将网络连接获取的DNS设置到系统中 1.1DNS获取后先设置LinkProperty 在Android Frameworks中不同的网络interface(eth0、wlan0等)都会有一个独立的LinkProperties对象来保持自己的网络信息 1.2通知...
  • Node.js编写的最小零依赖的DNS解析器和服务器。 最适合学习DNS消息的结构。 依存关系 Node.js 用法 例子 main.js有一个基本示例 只需运行 node main 在项目目录下,您可以在IP上启动dns服务器(重定向google DNS)...
  • DNS 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。...DNS就是将域名转化成IP的一个解析过程,这样...
  • DNS解析错误分析

    千次阅读 2020-03-16 10:06:10
    1、如何去查询DNS解析 2、dig命名查询的内容解析 3、常见DNS解析错误的分析
  • 获取DNS解析时间

    千次阅读 2018-09-20 16:43:19
    结论: 在6.0及一下的系统中,系统代码中没有hook点,所有解析dns的方式都是通过调用静态方法的方法完成的,所以6.0及以下系统是拿不... 发现系统进行dns解析的主要方式是利用InetAddress类中的方法getAllByName(S...
  • Linux网络编程[浅析DNS原理,了解相关DNS解析的函数]1.DNS解析的相关原理 2. 域名解析的相关函数###端口绑定, DNS解析的相关原理 先通过一张图示来展示一下什么是DNS:1:每一个域名都是与ip进行绑定的 2:浏览器...
  • Linux性能优化-DNS解析

    千次阅读 2019-02-15 08:39:15
    DNS解析
  • 域名的解析工作由DNS服务器完成。 1.DNS定义: DNS(Domain Name System)是因特网的一项服务,它作为域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。 2.DNS作用: (1)解析域名 人们...
  • 快速专用DNS,提供自定义的DNS记录配置和DNS解析缓存。 特性: A记录 CNAME 泛解析 DNS负载均衡 缓存DNS解析结果 上游同时多DNS服务器查询 安装 直接执行如下命令: ./build.sh 会生成阳离子文件fpdns在bin目录。...
  • DNS解析记录类型

    千次阅读 2020-01-10 09:31:45
    阿里云上是这么说明的,解释的比较全面了--------------------------------------------------------------...解析记录类型 云解析支持的记录类型包含: A记录 CNAME记录 MX记录 AAAA记录 TXT记录 URL显性/隐...
  • DNS解析错误

    万次阅读 2018-08-28 14:03:33
    DNS解析错误 大早上打开电脑发现浏览器都打不开了,然而微信还能登录。 第一步,分析原因 谷歌、360、搜狗都不能打开。问题是:DNS解析错误。 第二步,选择什么DNS服务器 不同地区的用户,适用的DNS服务器...
  • windows下dns解析过程

    千次阅读 2019-12-30 23:04:12
    闲来无事做了一些测试。。。。。。。。 本人利用谷歌和IE浏览器试了一下,当用两个浏览器同时访问(https://music.163.com)后,然后...由此证明浏览器是有DNS缓存的,但是并不是绝对的,而且我们自己也可以设置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 228,630
精华内容 91,452
关键字:

dns解析