DNS & CDN
dns cdn 网络 性能优化
DNS
DNS 是实现域名到 IP 转换的网络协议,当访问网页的时候,浏览器首先会通过 DNS 协议把域名转换为 IP,然后再向这个 IP 发送 HTTP 请求。
域名
标识计算机是使用 IP 地址,IPv4 有 32 位,IPv6 有 128 位。
IPv4 一般用十进制表示:
180.169.174.154
IPv6 太长了,一般是用十六进制表示:
AD80:0000:0000:0000:ABAA:0000:00C2:0002
如果访问网页要输入这样一串数字也太麻烦了。而且 IP 也不是固定的,万一机房做了迁移之类的,那 IP 也会变。
可以起一个名字,客户端不通过 IP,而是通过这个名字来访问目标机器。名字和 IP 的绑定关系是可以变的,每次访问都要经历一次解析名字对应的 IP 的过程。
这个名字就叫做域名。
域名和 IP 的对应
那域名和 IP 的映射关系如何维护呢?最简单的方式就是在一个文件里记录下所有的域名和 IP 的对应关系,每次解析域名的时候都到这个文件里查一下。
最开始确实是这么设计的,这样的文件叫做 hosts 文件,记录了世界上所有的主机(host)。
当然,这个 hosts 的配置是统一维护的,当新的主机需要联网的话就到这里注册一下自己的域名和 IP。其他机器拉取下最新的配置就能访问到这台主机了。
但是随着机器的增多,这种方式就不太行了,有两个突出的问题:
-
全世界都从某一台机器来同步配置,这台机器压力会太大。
-
当域名多了以后,命名上很容易冲突。
所以域名服务器得是分布式的,通过多台服务器来提供服务,并且最好还能通过命名空间来划分,减少命名冲突。
因此才产生了域名,例如 baidu.com 这个 com 就是一个域,叫顶级域,baidu 就是 com 域的二级域。
这样如果再有一个 baidu.xyz 也是可以的,因为 xyz 和 com 是不同的域,之下有独立的命名空间。
这样就减少了命名冲突。
分布式的话就要划分什么域名让什么服务器来处理,把请求的压力分散开。
很容易想到的是顶级域、二级域、三级域分别放到不同的服务器来解析。
所有的顶级域服务器也有个目录,叫做根域名服务器。
这样查询某个域名的 IP 时就先向根域名服务器查一下顶级域的地址,然后有二级域的话再查下对应服务器的地址,一层层查,直到查到最终的 IP。
当然,之前的 hosts 的方式也没有完全废弃,还是会先查一下 hosts,如果查不到的话再去请求域名服务器。
比如查 www.baidu.com 这个域名的 IP,就先查本地 hosts,没有查到的话就向根域名服务器查 com 域的通用顶级域名服务器的地址,之后再向这个顶级域名服务器查询 baidu.com 二级域名服务器的地址,这样一层层查,直到查到最终的 IP。
这样就通过分布式的方式来分散了服务器的压力。
但是这样设计还是有问题的,每一级域一个服务器,如果域名的层次过多,那么就要往返查询好多次,效率也不高。
所以 DNS(Domain Name System)只分了三级域名服务器:
- 根域名服务器:记录着所有顶级域名服务器的地址,是域名解析的入口(比如查询
com对应的顶级域名服务器的地址) - 顶级域名服务器:记录着各个二级域名对应的服务器的地址
- 权威域名服务器:该域下二级、三级甚至更多级的域名都在这里解析
其实就是把二、三、四、五甚至更多级的域名都合并在一个服务器解析了,叫做权威域名服务器(Authoritative Domain Name Server)。
这样既通过分布式减轻了服务器的压力,又避免了层数过多导致的解析慢。
当然,每次查询还是比较耗时的,查询完之后要把结果缓存下来,并且设置一个过期时间,域名解析记录在 DNS 服务器上的缓存时间叫做 TTL(Time-To-Live)。
但现在只是在某一台机器上缓存了这个解析结果,可能某个区域的其他机器在访问的时候还是需要解析的。
所以 DNS 设计了一层本地域名服务器,由它来负责完成域名的解析,并且把结果缓存下来。
这样某台具体的机器只要向这个本地域名服务器发请求就可以了,而且解析结果其他机器也可以直接用。
这样的本地域名服务器是移动、联通等 ISP(因特网服务提供商)提供的,一般在每个城市都有一个。某台机器访问了某个域名,解析之后会把结果缓存下来,其他机器访问这个域名就不用再次解析了。
这个本地域名服务器可以理解为 本区域域名服务器。
总结
客户端访问某个域名的时候,会先查找本地 hosts 文件,如果能查到 ip 就直接访问。
否则会向本地 DNS 服务器发请求,这个是联通、移动等运营商提供的每个城市都有的 DNS 服务器。由它去域名服务器发送解析域名的请求,然后把结果返给客户端。
域名是分层解析的,有根域名服务器、顶级域名服务器、权威域名服务器三层,比如 image.baidu.com 会先向根域名服务器发请求查询 com 的顶级域名服务器的 ip,然后再向 com 顶级域名服务器查询 image.baidu.com 的权威域名服务器的 ip。查询到权威域名服务器之后,任意层级的域名都会在这里解析(所以叫权威域名服务器)。
CDN
CDN 全称 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。
实现方式
看过了上面的DNS原理的介绍,如果能在权威域名服务器这一层根据客户端的 ip 做一下负载均衡,比如北京来的 DNS 请求就返回北京机房的服务器的 ip,上海来的 DNS 请求就返回上海机房的服务器的 ip,这样就近访问就可以提高用户访问网站的响应速度。
一般情况下我们都会买第三方的 CDN 服务来用,假设我们使用百度提供的 CDN 服务:
用户向本地 DNS 服务器发请求之后,经历根域名、顶级域名的 DNS 解析,最终会转给权威 DNS 服务器。这时候只要权威 DNS 服务器再转给 baidu 的 DNS 服务器就可以了。
baidu 的 DNS 服务器实现了负载均衡,会根据请求 ip 所在的城市,返回不同城市的服务器的 ip。也就实现了就近分发的网络加速功能。
那这个从权威 DNS 到 baidu 的 DNS 的转发是怎么实现的呢?
DNS 的记录有很多种类型,比如:
- A 代表 address,记录域名对应的 ip。
- CNAME 代表域名还有一个别名,可以向那个域名来查 ip。
- MX 代表件名后缀对应的域名或者 IP。
而转发就是通过CNAME实现的
只要在自己域名的 DNS 配置信息中,将 A 记录修改成 CNAME 记录即可,指向 CDN 服务器的域名就可以了。
这样,当你访问某个域名的时候,解析域名的权威服务器会返回 CDN 服务的 DNS 服务器的域名,然后再向这台 CDN 的 DNS 服务器发送解析域名的请求,这时候它就可以根据 ip 所在城市来返回一个就近城市的服务器给你。
当然,也可以再做一层 CNAME 转发,比如 CDN 的 DNS 服务器把域名解析转给城市的 DNS 服务器,然后城市的 DNS 服务器再根据不同机器的负载情况来返回一台离得近而且负载比较小的服务器的 ip 给客户端。
这样客户端就能从最近的服务器下载静态资源,从而更快地打开网站。
如果访问的资源没有的时候,会向源站服务器发请求来拿对应的资源并且缓存下来,之后再此访问就不用访问源站了。
图示:

- 用户访问图片内容,先经过 本地 DNS 解析,如果 LDNS 命中,直接返回给用户。
- LDNS MISS,转发 授权 DNS 查询
- 返回域名
CNAMEpicwebws.pstatp.com.wsglb0.com.对应 IP 地址(实际就是 DNS 调度系统的 ip 地址) - 域名解析请求发送至 DNS 调度系统,DNS 调度系统为请求分配最佳节点 IP 地址。
- 返回的解析 IP 地址
- 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端

- 当用户访问加入 CDN 服务的网站时,域名解析请求将最终由 “智能调度 DNS”负责处理。
- 它通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户可以得到快速的服务。
- 同时它需要与分布在各地的 CDN 节点保持通信,跟踪各节点的健康状态、容量等信息,确保将用户的请求分配到就近可用的节点上.
总结
- 用户向浏览器提供要访问的域名;
- 浏览器调用域名解析库对域名进行解析,由于 CDN 对域名解析过程进行了调整,所以解析函数库得到的是该域名对应的 CNAME 记录(由于现在已经是使用了 CDN 服务,CNAME 为 CDN 服务商域名),
为了得到实际 IP 地址,浏览器需要再次对获得的 CNAME 域名进行解析以得到实际的 IP 地址;在此过程中,使用的全局负载均衡 DNS 解析,如根据地理位置信息解析对应的 IP 地址,使得用户能就近访问。(CDN 服务来提供最近的机器) - 此次解析得到 CDN 缓存服务器的 IP 地址,浏览器在得到实际的 IP 地址以后,向缓存服务器发出访问请求;
- 缓存服务器根据浏览器提供的要访问的域名,通过 Cache 内部专用 DNS 解析得到此域名的实际 IP 地址,再由缓存服务器向此实际 IP 地址提交访问请求;
- 缓存服务器从实际 IP 地址得得到内容以后,一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程;
- 客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。
转自
https://juejin.cn/post/7108719346947457054
https://juejin.cn/post/7002781373014474759
https://juejin.cn/post/6844903605888090125