按:
在解答 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
实际情况
以上是教科书的回答,实际中有缓存,就不会这么麻烦了:
加入还是 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 的一个命令,展示解析域名的过程
- 观察
Question section
的下一行。三个参数。第一个域名,第二个写死IN,查询A记录 - 观察中间那里
Answer section
的下一行。回答了三个,其中两个a,一个cname,使用CNAME是为了CDN
dig +trace www.tmall.com 可以看到所有的解析过程
会从根域名开始查起。
本文参考资料:
- 美国如果把根域名服务器封了,中国会从网络上消失? 微信公众号。对本文有直接影响。
- 面试官:讲讲DNS的原理? 文章详细地介绍了细节
- 【DNS是什么东西,他有什么用,DNS劫持说的又是啥】对劫持提到