CSInternet04
DNS 是什么?
DNS (Domain Name System) 是互联网的一个核心服务,主要功能是将人类容易记住的域名(如 172.217.163.46)提供反向解析,即从IP地址查找域名,或者是提供邮件服务器查询等其他服务。
DNS 域名解析的流程?
解析记录
解析记录存储在域名服务器中,用于表达域名
与 IP
之间的对应关系,称为 记录
(record)。根据使用场景,”记录”可以分成不同的类型(type),下面列举几个常见的解析记录类型
type | 解释 |
---|---|
A | 地址记录(Address),返回域名指向的IPv4地址。 |
AAAA | AAAA记录(AAAA record),返回域名指向的IPv6地址。 |
NS | 域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。 |
CNAME | 规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。 |
MX | 邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。 |
DNS服务器根据域名的层级,进行分级查询。
需要明确的是,每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。
所谓”分级查询”,就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下。
- 从”根域名服务器”查到”顶级域名服务器”的NS记录和A记录(IP地址)
- 从”顶级域名服务器”查到”次级域名服务器”的NS记录和A记录(IP地址)
- 从”次级域名服务器”查出”主机名”的IP地址
仔细看上面的过程,你可能发现了,没有提到DNS服务器怎么知道”根域名服务器”的IP地址。回答是”根域名服务器”的NS记录和IP地址一般是不会变化的,所以”根域名服务器”的IP地址已经内置在所有DNS服务器里面了。
迭代查询
tips: 一般的DNS并不是全程使用迭代或者递归查询,而是使用两种方式结合。这里仅仅是为了演示全程使用迭代查询的过程。
迭代查询的过程其实就是:当域名服务器收到迭代查询请求报文时,需求给出主机“你下一步应当向哪一个域名服务器进行查询”的建议,然后由主机进行下一步的查询,当返回内容即没有确切的结果也没有下一步的建议时,DNS失败。
这里的建议指
NS
或者CNAME
等记录
请看图(随手画的小度机器人)

DNS缓存
为了缓解各个域名服务器的查询压力和加快 DNS
查询速度,浏览器、操作系统、域名服务器都会将 DNS
的查询结果进行缓存,当在缓存有效时间内再次收到重复的 DNS
请求时,就会直接返回 IP
地址,而不会继续下一步的域名查询了。
缓存的优先级由 DNS
查询的路径来定,相信这个很好理解
浏览器缓存>操作系统缓存> hosts
文件>本地DNS服务器缓存>根域名服务器缓存>…
缓存时长如何控制
缓存时间一般由 DNS响应报文
中 资源记录部分
中的 TTL
(Time to live)指定的值,单位为秒
1 | yaml 代码解读复制代码 baidu.com: type A, class IN, addr 220.181.57.216 #资源记录部分 |
但是有些浏览器或者操作系统会因为 TTL
值过小或者其他的原因不遵守 TTL
约定的缓存时间。这也导致很多缓存问题的 TTL
解决方案失效。
hosts文件并不是缓存,所以它是永久有效的
作者:月夕
链接:https://juejin.cn/post/7035659937166393375
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本地服务器和非权威域名服务器是不是一样,都是指代像google、cloudflare之类的dns服务器?
不完全一样。让我解释它们的区别:
本地DNS服务器(Local DNS Server):
- 通常是由ISP(网络服务提供商)提供的DNS服务器
- 也可以是组织/公司内部部署的DNS服务器
- 是客户端首先接触的DNS服务器
- 负责代替客户端进行递归查询
非权威域名服务器:
- 更广泛的概念,包括所有不是特定域名权威服务器的DNS服务器
- Google(8.8.8.8)和Cloudflare(1.1.1.1)是典型的公共递归DNS服务器
- 本地DNS服务器也属于非权威服务器的一种
主要区别:
- 本地DNS服务器特指网络运营商或组织提供的最近的DNS服务器
- 而Google、Cloudflare这类是公共DNS服务器,需要手动配置才能使用
- 它们都属于非权威服务器,但承担的角色和使用场景有所不同
权威DNS服务器才是真正负责特定域名解析的服务器,比如专门负责解析google.com的DNS服务器就是权威服务器。
ok,让我们复盘一下:
收到一个域名之后,先查浏览器缓存。没有,再查操作系统缓存和hosts文件。没有,再找本地服务器或者公共dns服务器。再没有,访问dns根服务器迭代查询。
完整版如下:
浏览器将会检查缓存中有没有这个域名对应的解析过的 IP 地址,如果有该解析过程将会结束。浏览器缓存域名也是有限制的,包括缓存的时间、大小,可以通过 TTL 属性来设置。
如果用户的浏览器中缓存中没有,操作系统会先检查自己本地的 DNS 解析器缓存和 hosts 文件是否有这个网址映射关系,如果有,就先调用这个 IP 地址映射,完成域名解析。
如果都没有,会找 TCP/IP 参数中设置的首选 DNS 服务器,我们叫它本地 DNS 服务器。通过递归查询的方式向本地 DNS 服务器发起查询,如果本地 DNS 服务器中有 A记录 或者该域名的映射缓存,则返回
如果都没有,本地域名服务器会开始迭代查询的过程,会先向 13 台根域名服务器查询该域名,根域名服务器会返回该域名的顶级域名服务器的 IP 地址,也就是 NS 记录。然后本地域名服务器再向顶级域名服务器发起查询,顶级域名服务器返回二级域名服务器的 NS 记录,重复这个过程直到返回 A 记录为止,最后把 A 记录中的 IP 地址返回给主机。
DNS 劫持和污染?
- “域名屏蔽”,对域名直接不解析,返回错误,让你无法拿到 IP 地址,也就无法访问网站;
- “域名劫持”,也叫“域名污染”,你要访问 A 网站,但 DNS 给了你 B 网站。
DNS 用了什么传输协议?(tcp 还是 udp)
使用UDP的情况:
- 标准DNS查询:当查询消息和响应消息长度都比较小(小于512字节)时,使用UDP传输。这是最常见的场景,因为UDP快速且开销小,适合简单的域名解析请求。
使用TCP的情况:
- 消息超长:当DNS响应超过512字节时,会使用TCP传输。这种情况通常出现在:
- DNSSEC查询(带有安全签名的DNS查询)
- 包含大量记录的响应
- 区域传送(Zone Transfer)时
- 区域传送:主从DNS服务器之间同步区域数据时,必须使用TCP。因为区域传送通常包含大量数据,需要可靠传输。
- DNS over TLS (DoT):由于需要建立加密通道,DoT只能使用TCP的853端口进行传输。
工作流程:
- 客户端首先尝试使用UDP发送查询
- 如果服务器响应表明数据过大(TC标志位置1),客户端会自动切换到TCP重新发送查询
- 某些应用程序也可能直接选择使用TCP发送查询
CDN 有什么作用?为什么 CDN 可以加速网络?
在外部加速 HTTP 协议的服务,这个就是我们今天要说的 CDN(Content Delivery Network 或 Content Distribution Network),中文名叫“内容分发网络”:用户可以就近取到想要的资源提高响应速度,减少源站压力减少宽带消耗。CDN 构建了全国、全球级别的专网,让用户就近访问专网里的边缘节点,降低了传输延迟,实现了网站加速。
从名字上看,CDN 有三个关键词:“内容”“分发”和“网络”。
先看一下“网络”的含义。CDN 的最核心原则是“就近访问”,如果用户能够在本地几十公里的距离之内获取到数据,那么时延就基本上变成 0 了。
所以 CDN 投入了大笔资金,在全国、乃至全球的各个大枢纽城市都建立了机房,部署了大量拥有高存储高带宽的节点,构建了一个专用网络。这个网络是跨运营商、跨地域的,虽然内部也划分成多个小网络,但它们之间用高速专有线路连接,是真正的“信息高速公路”,基本上可以认为不存在网络拥堵。
有了这个高速的专用网之后,CDN 就要“分发”源站的“内容”了,用到的就是在[第 22 讲]说过的“缓存代理”技术。使用“推”或者“拉”的手段,把源站的内容逐级缓存到网络的每一个节点上。
于是,用户在上网的时候就不直接访问源站,而是访问离他“最近的”一个 CDN 节点,术语叫“边缘节点”(edge node),其实就是缓存了源站内容的代理服务器,这样一来就省去了“长途跋涉”的时间成本,实现了“网络加速”。
就近和缓存,引申出cdn两大核心机制:全局负载均衡和缓存系统。
GSLB
全局负载均衡(Global Sever Load Balance)一般简称为 GSLB,它是 CDN 的“大脑”,主要的职责是当用户接入网络的时候在 CDN 专网中挑选出一个“最佳”节点提供服务,解决的是用户如何找到“最近的”边缘节点,对整个 CDN 网络进行“负载均衡”。

GSLB 最常见的实现方式是“DNS 负载均衡”,这个在[第 6 讲]里也说过,不过 GSLB 的方式要略微复杂一些。
原来没有 CDN 的时候,权威 DNS 返回的是网站自己服务器的实际 IP 地址,浏览器收到 DNS 解析结果后直连网站。
但加入 CDN 后就不一样了,权威 DNS 返回的不是 IP 地址,而是一个 CNAME( Canonical Name ) 别名记录,指向的就是 CDN 的 GSLB。它有点像是 HTTP/2 里“Alt-Svc”的意思,告诉外面:“我这里暂时没法给你真正的地址,你去另外一个地方再查查看吧。”
因为没拿到 IP 地址,于是本地 DNS 就会向 GSLB 再发起请求,这样就进入了 CDN 的全局负载均衡系统,开始“智能调度”,主要的依据有这么几个:
- 看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点;
- 看用户所在的运营商网络,找相同网络的边缘节点;
- 检查边缘节点的负载情况,找负载较轻的节点;
- 其他,比如节点的“健康状况”、服务能力、带宽、响应时间等。
GSLB 把这些因素综合起来,用一个复杂的算法,最后找出一台“最合适”的边缘节点,把这个节点的 IP 地址返回给用户,用户就可以“就近”访问 CDN 的缓存代理了。
CDN 的缓存代理
缓存系统是 CDN 的另一个关键组成部分,相当于 CDN 的“心脏”。如果缓存系统的服务能力不够,不能很好地满足用户的需求,那 GSLB 调度算法再优秀也没有用。
但互联网上的资源是无穷无尽的,不管 CDN 厂商有多大的实力,也不可能把所有资源都缓存起来。所以,缓存系统只能有选择地缓存那些最常用的那些资源。
这里就有两个 CDN 的关键概念:“命中”和“回源”。
“命中”就是指用户访问的资源恰好在缓存系统里,可以直接返回给用户;“回源”则正相反,缓存里没有,必须用代理的方式回源站取。
相应地,也就有了两个衡量 CDN 服务质量的指标:“命中率”和“回源率”。命中率就是命中次数与所有访问次数之比,回源率是回源次数与所有访问次数之比。显然,好的 CDN 应该是命中率越高越好,回源率越低越好。现在的商业 CDN 命中率都在 90% 以上,相当于把源站的服务能力放大了 10 倍以上。