【性能】DNS 解析时快时慢,我该怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【性能】DNS 解析时快时慢,我该怎么办?相关的知识,希望对你有一定的参考价值。

参考技术A DNS(Domain Name System),即域名系统,是互联网中最基础的一项服务,主要提供域名和 IP 地址之间映射关系的查询服务。

DNS 不仅方便了人们访问不同的互联网服务,更为很多应用提供了,动态服务发现和全局负载均衡(Global Server Load Balance,GSLB)的机制。这样,DNS 就可以选择离用户最近的 IP 来提供服务。即使后端服务的 IP 地址发生变化,用户依然可以用相同域名来访问。

我们以极客时间的网站 time.geekbang.org 为例,来理解域名的含义。

这个字符串中,最后面的 org 是顶级域名,中间的 geekbang 是二级域名,而最左边的 time 则是三级域名。

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

# host www.baidu.com

# nslookup www.baidu.com

# nslookup  www.baidu.com    8.8.8.8

# dig www.baidu.com

# nslookup -debug time.geekbang.org

# time nslookup time.geekbang.org

#  dig +trace +nodnssec time.geekbang.org

Why option rotate in resolv.conf picks up second nameserver as first every time?

https://access.redhat.com/solutions/1426263

nslookup-OK-but-ping-fail问题处理

https://plantegg.github.io/2019/01/09/nslookup-OK-but-ping-fail

time命令:测量命令的执行时间或者系统资源的使用情况

http://m.biancheng.net/linux/time.html

程序员如何学习和构建网络知识体系

https://plantegg.github.io/2020/05/24/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%A6%82%E4%BD%95%E5%AD%A6%E4%B9%A0%E5%92%8C%E6%9E%84%E5%BB%BA%E7%BD%91%E7%BB%9C%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB

计算机网络 DNS解析命令汇总

前言

本文参考倪朋飞老师的DNS 解析时快时慢,该怎么办文章,结合
DNS服务介绍ICMP协议 ping和traceroute介绍这两篇文章,能对DNS从理论到具体解析流程有个理解。

DNS各种命令介绍

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

  • DNS 服务通过资源记录的方式,来管理所有数据,它支持 A、CNAME、MX、NS、PTR 等多种类型的记录。
    参考DNS各项记录
    A 记录,是指定域名对应的IP地址。;
    CNAME记录,别名记录,允许您将多个名字映射到同一台计算机;
    NS 记录,是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
    AAAA记录: 将主机名(或域名)指向一个IPv6地址,需要添加AAAA记录;

  • 执行cat /etc/resolv.conf命令,查询系统配置的DNS 服务器;
    系统必须要配置 DNS 服务器,这样才可以通过域名来访问外部服务:

$ cat /etc/resolv.conf
nameserver 192.168.4.251
nameserver 172.20.64.240
  • 执行nslookup命令,可以查询到这个域名的 A 记录
~ nslookup www.baidu.com                
Server:		192.168.4.251
Address:	192.168.4.251#53

Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 110.242.68.3  // A 记录
Name:	www.a.shifen.com
Address: 110.242.68.4 // A 记录
  • 执行dig命令,可以展示递归查询的整个过程
    输出里展示的各级域名的 NS 记录,其实就是各级域名服务器的地址,可以更清楚 DNS 解析的过程;
    它执行 DNS 搜索,显示从受请求的域名服务器返回的答复;可以利用 dig 作为 DNS 问题的故障诊断,因为它灵活性好、易用、输出清晰。
    第一部分显示 dig 命令的版本和输入的参数。
    第二部分显示服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束。
    第三部分中的 “QUESTION SECTION” 显示我们要查询的域名。
    第四部分的 “ANSWER SECTION” 是查询到的结果。
    第五部分则是本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,在什么时间进行的查询等等。
 ~ dig www.baidu.com
// 第一部分
; <<>> DiG 9.10.6 <<>> www.baidu.com
;; global options: +cmd 
// 第二部分
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29880;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 13, ADDITIONAL: 27
//第三部分
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.			IN	A
//第四部分
;; ANSWER SECTION:
www.baidu.com.		52	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	209	IN	A	110.242.68.3
www.a.shifen.com.	209	IN	A	110.242.68.4

;; AUTHORITY SECTION:
com.			133139	IN	NS	b.gtld-servers.net.
com.			133139	IN	NS	j.gtld-servers.net.
com.			133139	IN	NS	c.gtld-servers.net.
com.			133139	IN	NS	h.gtld-servers.net.
com.			133139	IN	NS	i.gtld-servers.net.
com.			133139	IN	NS	l.gtld-servers.net.
com.			133139	IN	NS	f.gtld-servers.net.
com.			133139	IN	NS	a.gtld-servers.net.
com.			133139	IN	NS	m.gtld-servers.net.
com.			133139	IN	NS	e.gtld-servers.net.
com.			133139	IN	NS	d.gtld-servers.net.
com.			133139	IN	NS	g.gtld-servers.net.
com.			133139	IN	NS	k.gtld-servers.net.

;; ADDITIONAL SECTION:
a.gtld-servers.net.	2901	IN	A	192.5.6.30
a.gtld-servers.net.	10065	IN	AAAA	2001:503:a83e::2:30
b.gtld-servers.net.	83957	IN	A	192.33.14.30
b.gtld-servers.net.	2320	IN	AAAA	2001:503:231d::2:30
c.gtld-servers.net.	83397	IN	A	192.26.92.30
c.gtld-servers.net.	145158	IN	AAAA	2001:503:83eb::30
d.gtld-servers.net.	16584	IN	A	192.31.80.30
d.gtld-servers.net.	133139	IN	AAAA	2001:500:856e::30
e.gtld-servers.net.	82924	IN	A	192.12.94.30
e.gtld-servers.net.	60534	IN	AAAA	2001:502:1ca1::30
f.gtld-servers.net.	83959	IN	A	192.35.51.30
f.gtld-servers.net.	60853	IN	AAAA	2001:503:d414::30
g.gtld-servers.net.	17022	IN	A	192.42.93.30
g.gtld-servers.net.	133139	IN	AAAA	2001:503:eea3::30
h.gtld-servers.net.	82708	IN	A	192.54.112.30
h.gtld-servers.net.	60431	IN	AAAA	2001:502:8cc::30
i.gtld-servers.net.	14862	IN	A	192.43.172.30
i.gtld-servers.net.	60431	IN	AAAA	2001:503:39c1::30
j.gtld-servers.net.	84156	IN	A	192.48.79.30
j.gtld-servers.net.	133139	IN	AAAA	2001:502:7094::30
k.gtld-servers.net.	21663	IN	A	192.52.178.30
k.gtld-servers.net.	60853	IN	AAAA	2001:503:d2d::30
l.gtld-servers.net.	16592	IN	A	192.41.162.30
l.gtld-servers.net.	87523	IN	AAAA	2001:500:d937::30
m.gtld-servers.net.	58701	IN	A	192.55.83.30
m.gtld-servers.net.	133139	IN	AAAA	2001:501:b1f9::30
// 第五部分
;; Query time: 167 msec
;; SERVER: 192.168.4.251#53(192.168.4.251)
;; WHEN: Thu Jul 08 10:58:31 CST 2021
;; MSG SIZE  rcvd: 897

DNS优化方法

  • 可以把主机名和 IP 地址的映射关系,写入本机的 /etc/hosts 文件中。这样,指定的主机名就可以在本地直接找到目标 IP。可以作为优化dns解析的手段;

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

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

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

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

DNS解析为何使用UDP协议

  • 区域传送时使用TCP
    DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。
    辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。

  • 客户端向DNS服务器查询域名使用UDP;
    DNS需要优先解决的快速查询,以及减少对DNS服务器的压力。
    如果使用TCP查询DNS,需要三次握手+一次查询RTT+四次挥手。而用UDP查询,只需要1RTT,当然如果发生超时丢包,重传就是了,使用UDP对服务器的压力也小很多。另外你也可以试想下TCP丢包的场景,也是需要重传的,只是这部分的功能,被包括在了TCP协议里面。

参考:
DNS为什么既使用TCP又使用UDP?
为什么DNS使用UDP而不是TCP?

以上是关于【性能】DNS 解析时快时慢,我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

sql:查询时快时慢?

informix SQL时快时慢

为啥自动机械表秒针走时不均匀,时快时慢?

计算机网络 DNS解析命令汇总

计算机网络 DNS解析命令汇总

计算机网络 DNS解析命令汇总