DNS 是什么?
域名系统即 DNS 就相当于是数字电话簿,负责将URL解析成对应的IP地址。
公共DNS
我们很难在物理上提升网络传输速度,但我们可以减少一些DNS服务器物理距离。
谷歌公共 DNS
是最流行的 DNS 服务器之一,使用 8.8.8.8 和 8.8.4.4 这两个 IP 地址。这些被称为任播地址,在世界各地有多个服务器响应来自这些地址的请求。
Cloudflare公共DNS
Cloudflare 声称它将是“互联网上速度最快且高度关注隐私保护的消费级 DNS 服务”
并承诺永远不会将查询 IP 地址写入磁盘,并在每 24 小时内就清除所有 DNS 查询日志一次。以保护隐私。
域名
域名是全球唯一的,需要通过专门的域名注册商才可以申请注册。为了组织全球互联网中的众多计算机,域名同样用点来分开,形成一个分层的结构。而每个被点分割开的字符串,就构成了域名中的一个层级,并且位置越靠后,层级越高。
以time.geekbang.org 为例,来理解域名的含义。
这个字符串中,最后面的 org 是顶级域名,中间的 geekbang 是二级域名,而最左边的 time 则是三级域名。
所有域名都以点作为后缀,也可以理解为,在域名解析的过程中,所有域名都以点结束。
DNS解析
几种DNS服务器:
- 本地 DNS服务器:
如果是通过 DHCP 配置,本地 DNS 由你的网络服务商(ISP),如电信、移动等自动分配,它通常就在你网络服务商的某个机房 - 根 DNS 服务器 :
持有所有顶级域(.cn/.com/.org.....)DNS服务器地址,并返回对应服务器 - 顶级域 DNS 服务器:
持有所有下属权威域(dex.org/geekbang.org.....)DNS服务器地址,并返回对应服务器 - 权威 DNS 服务器:
持有所属域名(www.geekbang.org/time.geekbang.org....)主机ip,并返回对应ip地址
以查询time.geekbang.org对应ip地址为例:
dig +trace +nodnssec
也可以用更加详细的命令,查看整个流程:
dig +trace +nodnssec 域名
本地host解析
可以把主机名和 IP 地址的映射关系,写入本机的 /etc/hosts 文件中
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain
::1 localhost6 localhost6.localdomain6
192.168.0.100 domain.com
Host文件属于一个历史遗留问题。早年间在ARPANET 时期,是没有DNS的,整个互联网上只有数百台主机,那时就是通过hosts 文件来解析域名的。后来Internet 爆发增长,已经不可能再将所有的主机名与ip的对应关系写进hosts 文件里面了,那样速度太难。后来就出现了DNS。DNS是一个分布式的数据库。同时原来的hosts 文件也保留了下来 . 当主机进行dns查询的时候,是先查找hosts文件,如果在hosts文件中找不到对应关系,再询问dns服务器的。
① 适用于小型公司局域网或本地的域名解析工作。
② 当 DNS 服务器解析出错的时候,可以通过临时修改 HOSTS 文件来解决域名解析问题。
③ 通过修改 HOSTS 文件,添加相应的记录,可以达到屏蔽广告的效果。
④ 早期的时候可以通过修改 HOSTS 文件,上 google 网站。现在该方法应该是无效的了。
内网DNS解析
搭建自定义的 DNS 服务器,专门用来解析内网中的域名。而内网 DNS 服务器,一般还会设置一个或多个上游 DNS 服务器,用来解析外网的域名
DNS的传输
DNS 协议在 TCP/IP 栈中属于应用层,不过实际传输还是基于 UDP 或者 TCP 协议(UDP 居多) ,并且域名服务器一般监听在端口 53 上。
为什么DNS使用UDP而不是TCP?
由于TCP三次握手的规则限制,采用UDP传输,DNS域名解析时间更小。
再加上多级域服务器的递归查询,三次握手的耗时会被更加放大。
传统 DNS 存在的问题
域名缓存问题
不是每一个请求,它都会去访问权威 DNS 服务器,而是访问过一次就把结果缓存到自己本地用于之后的查询。
一旦想要访问的ip地址发生变化(负载均衡,页面更新),可能就无法返回最新、最高效的ip地址了域名转发问题
比如NAT,会影响权威服务器对于请求源的地址判断,可能返回一个跨运营商的ip地址。
比如跨运营商转发,用户就会得到一个不属于自己运营商的ip地址。域名更新
本地 DNS 服务器是由不同地区、不同运营商独立部署的。对域名解析缓存的处理上,实现策略也有区别,有快有慢。
在负载均衡和触发容灾时,权威 DNS更新速度决定有多少用户会出现访问异常。解析延迟问题
DNS 的查询过程需要递归遍历多个 DNS 服务器,才能获得最终的解析结果。这会带来一定的时延,甚至会解析超时。
HttpDNS
HttpDNS不走传统的 DNS 解析,而是服务商(比如阿里云)搭建基于 HTTP 协议的 DNS 服务器集群,分布在多个地点和多个运营商。当客户端需要 DNS 解析的时候,直接通过 HTTP 协议进行请求这个服务器集群。
使用 HttpDNS 的,往往是手机应用,需要在手机端嵌入支持 HttpDNS 的客户端 SDK。
工作流程
在客户端的 SDK 里动态请求服务端,获取 HttpDNS 服务器的 IP 列表,缓存到本地。随着不断地解析域名,SDK 也会在本地缓存 DNS 域名解析的结果。
当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回。这个缓存和本地 DNS 的缓存不一样的是,这个是手机应用自己做的,而非整个运营商统一做的。如何更新、何时更新,手机应用的客户端可以和服务器协调来做这件事情。
如果本地没有,就需要请求 HttpDNS 的服务器,在本地 HttpDNS 服务器的 IP 列表中,选择一个发出 HTTP 的请求,会返回一个要访问的网站的 IP 列表。
HttpDNS即使使用Http,也比使用UDP的传统DNS要快
HttpDNS服务端不会使用递归的方式依次通过根域名、顶级域名、权威域名去递归查询,而是直接返回目标IP。
鸡生蛋还是蛋生鸡
HttpDNS服务器的地址一般不变 可以使用DNS的方式获取HttpDNS服务器的ip地址 也可以直接把HttpDNS服务器的ip地址写死在客户端中。
HttpDNS的ip地址簿从哪来
直接向权威DNS请求,对于特殊的IP也可以由用户自行配置
HTTP与DNS的关系
以发送一个HTTP请求为例:
- 生成HTTP请求消息
- 根据域名,通过DNS查询解析出ip地址
- 找到IP地址对应的服务器通过三次握手建立TCP连接,向服务器发送HTTP Request请求,并得到服务器的Response响应
提升DNS解析速度的一些方法
更换一个块的DNS服务
- 解析URL的IP地址
$time nslookup time.geekbang.org
// 域名服务器及端口信息
Server: 1.1.1.1
Address: 1.1.1.1#53
// 非权威查询结果
Non-authoritative answer:
Name: time.geekbang.org
Address: 39.106.233.176
// 耗时
real 0m0.245s
user 0m0.003s
sys 0m0.005s
可以看到解析用了0.2秒
- 查看你的本地DNS
$ cat /etc/resolv.conf
#
# macOS Notice
#
# This file is not consulted for DNS hostname resolution, address
# resolution, or the DNS query routing mechanism used by most
# processes on this system.
#
# To view the DNS configuration used by this system, use:
# scutil --dns
#
# SEE ALSO
# dns-sd(1), scutil(8)
#
# This file is automatically generated.
#
nameserver 1.1.1.1 //这个就是你默认的DNS
- 检查DNS服务器的链接速度
$ ping -c3 1.1.1.1
PING 1.1.1.1 (1.1.1.1): 56 data bytes
64 bytes from 1.1.1.1: icmp_seq=0 ttl=51 time=175.752 ms
64 bytes from 1.1.1.1: icmp_seq=1 ttl=51 time=213.000 ms
--- 1.1.1.1 ping statistics ---
3 packets transmitted, 2 packets received, 33.3% packet loss
round-trip min/avg/max/stddev = 175.752/194.376/213.000/18.624 ms
平均194.376ms
你也可以比较其他的DNS地址,比如1.1.1.1
,8.8.8.8
。然后选出一个最快的。
$ 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=73 time=37.513 ms
64 bytes from 114.114.114.114: icmp_seq=1 ttl=68 time=34.629 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=60 time=76.672 ms
--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 34.629/49.605/76.672/19.176 ms
平均 49.605ms
- 更换你的DNS服务地址
找一个你觉得不错的地址替换一下。
$ 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.019s
user 0m0.003s
sys 0m0.004s
解析变成了0.019秒
DNSmasq
DNSmasq 是最常用的 DNS 缓存服务之一,还经常作为 DHCP 服务来使用。它的安装和配置都比较简单,性能也可以满足绝大多数应用程序对 DNS 缓存的需求。