按:

在解答 http请求的细节时候,绕不过DNS,我认为这个知识点属于边缘知识,大致知道用来转换域名和IP即可。但如果要考虑优化细节,绕不过DNS的原理解析。

这篇文章尝试用自己的想法陈述DNS。

理论知识

DNS是什么,DNS如何工作?

Domain Name System。这种网络协议可以把 域名 转化成 IP,因为人记不住IP,但是IP是必不可少,因此DNS在域名和IP之间做转换。

三个关键点:

  • 本地DNS服务器 Local DNS
  • 权威DNS
  • 根DNS

本机拿到了域名网络请求,会向本地的LDNS发起请求,LDNS联网询问 权威DNS,有时候问一个不够,需要问一大圈才能得到答案。

权威DNS收到查询可能没缓存,需要问其他权威DNS。

如果完全没有缓存,LDNS会问根DNS,根来告诉LDNS下一步。

根DNS

全球13个根服务器。美国10个,英国1,瑞典1,日本1。为啥是13这个数字,问就是历史原因和技术原因。 DNS主要使用UDP传输报文,报文大小限制在512字节以内,这个尺寸足够小,每一个根DNS在DNS报文 算了,不太懂。 但13,是逻辑概念,实际上每个根DNS背后有多台物理服务器。每个根有若干镜像。

有人统计过,我国的根镜像,超过28个,这意味着,我们的对根DNS的请求不需要出国,自己有镜像。如果美国要封杀中国的域名,我们有镜像域名,可以不受干扰。其他国家和地区可以选择拒绝同步美国的操作,影响范围就可以缩小到只有美国访问不到。

反过来推,中国也可以拒绝解析国外的域名,其他地区自然不干,影响范围也会缩短为我国访问不到。

理论工作流程

www.baidu.com 这个域名: com 根域名 + baidu.com 二级域名 + www.baidu.com 三级域名

权威DNS:对请求作出权威回答,权威DNS存着多种记录,常见的有:

  • A记录,记录域名和ip的映射 核心
  • NS记录,记录域名和负责解析该域的权威DNS,一般是域名服务商提供
  • CNAME记录,记录域名和别名。

问权威DNS能回答的,就是A记录。
需要问其他权威DNS的就是NS记录,让LDNS再去找其他权威DNS问
如果是别名,就返回CNAME,LDNS再去解析别名,比如CDN的场景

递归DNS,通常就是LDNS,它收到域名请求,负责问一圈,返回答案。

如果完全没缓存,我们访问 www.baidu.com. (注意最后的点) 获取ip:

  • LDNS问根DNS,域名的ip是多少(根DNS的ip如何得知?一般内置
  • 根DNS没有(也就是 . 点),去问 com的DNS,给你com的DNS的ip,这里走NS记录
  • LDNS去问com权威DNS,通过查找找 baidu.com 的权威DNS,得到IP,可能会多个
  • LDNS继续问baidu.com 的权威DNS,这时候会返回a记录,或者cname。如果是前者就拿到了ip
  • 如果是后者,还需要对别名进行查询
  • 最终,LDNS得到了IP

image.png

实际情况

以上是教科书的回答,实际中有缓存,就不会这么麻烦了:

加入还是 www.baidu.com.

  • 浏览器会先看自己有没有缓存,如果没有就去问操作系统,如果没有去问hosts,再没有才找LDNS
  • LDNS也会先自己找,如果没有A记录,就看看 baidu.com 是否存在NS记录,在没有,去看 com,如果来 com的NS都没有才去问根

有趣的问题

如果你购买过域名,或者使用过 DNSPod 这类网站,肯定也了解 A记录(记录IP),NS 转发,CNAME别名,三者的作用。

DNS和前端有啥关系,如何优化?

我们解析DOM生成DOM tree时候,会首先阅读到 head里的meta标签,其中有一个 dns-prefetch 的属性。

因为我们一般会分离资源,使用多个域名加载资源,比如 img.xx.com file.xx.com api.xx.com 等,通过在DOM解析时候就发起DNS预解析,等到真正使用其他域名时候可以享受加速DNS的过程。详见 MDN文档 https://developer.mozilla.org/zh-CN/docs/Controlling_DNS_prefetching

DNS用到了什么算法原理?

真不懂。DNS 的查找过程利用了递归、迭代?

也似乎是 优选策略 https://developer.aliyun.com/article/622410 看不懂的。似乎是A B 两个,选择一个进行工作,如果A不行,就换B。

DNS会解析失败吗?

会。比如自定DNS解析服务器时候写错了,有可能失败。

还有DNS劫持,有的小服务商会劫持DNS,给你一个假的IP,让你访问页面多带了垃圾广告,甚至使用iframe来包裹要访问的地址。

咳咳,有一种更为强大的力量可以污染DNS,那就是xxx,会返回错误的地址,也就访问不了。后面也有升级,这知识一个前菜,可以通过hosts的方式绕过。

一个域名对应一个ip地址吗?CNAME 有啥用?

这里有CNAME的概念,我们访问 baidu.com ,百度不是就一台机器,而是无数台,对应无数个IP,会从中选一个IP来使用。

这里就用到了CDN的概念。现在一般用来解析CDN,用于负载均衡,把响应最快的节点返回给用户。

UDP 的使用场景之一:DNS解析

DNS解析的大部分场景使用UDP来完成解析,因为UDP连接速度快,携带内容轻量,适合解析。

UDP协议传输大小数据区限制;局域网1472字节,互联网548字节

小聪明:DNS也有一个地方用到了tcp,那就是区域传送。啥是区域传送zone transfer?
DNS规范定义了两种类型的DNS服务器,主DNS和辅助DNS,辅助DNS读取同步主DNS时候用到的是TCP协议。因为可靠。

我电脑上不了网,但可以用QQ?

多半是DNS没设置好,进入 internet选项设置ipv4设置就好。电脑管家也会这样操作。QQ为啥是好的?直接访问的就是腾讯服务器的IP

利用 dig 命令来查看解析过程

dig www.tmall.com 这是Linux 的一个命令,展示解析域名的过程

image.png

  1. 观察 Question section 的下一行。三个参数。第一个域名,第二个写死IN,查询A记录
  2. 观察中间那里 Answer section 的下一行。回答了三个,其中两个a,一个cname,使用CNAME是为了CDN

dig +trace www.tmall.com 可以看到所有的解析过程

会从根域名开始查起。


本文参考资料: