什么是DNS、CNAME、CDN?
DNS
DNS域名系统
DNS(Domain Name System)是因特网的一项服务,它作为域名和IP地址相互映射的一个分布式数据库,能够使人们更方便地访问互联网。通过域名而非IP地址去访问网站,但域名并不能被计算机直接识别,所以需要通过DNS将域名“翻译”称可由计算机直接识别的IP地址。
互联网中的域名系统 DNS 被设计成一个层次树状结构的联机分布式数据库系统,并且采取的是客户服务器的方式,将域名和IP地址相互映射联系了起来。
域名服务器的层次结构:
(来自https://blog.csdn.net/codejas/article/details/80086068)
DNS 使大多数名字都在本地进行解析,只有少量的解析需要在互联网通信,因此效率很高。采取分布式的一个好处是,即使单个计算机出了故障,也不会妨碍 DNS 系统的正常运行。
域名到 IP 地址的解析是通过许多分布在互联网上的域名服务器完成的。
解析的主要过程如下:
- 当一个主机中的进程需要把域名解析为 IP 地址时,该进程就会调用解析程序,首先在本地的浏览器缓存,hosts系统缓存中查找,如果有,解析结束,没有就下一步
- 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,主机把待解析的域名放在 DNS 的请求报中,以 UDP 用户数据报方式发送给本地域名服务器。
- 本地域名服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,如果没有,本地域名服务器向其他DNS服务器查询,在查找域名后,把对应的 IP 地址放在回答报文中返回给主机。
- 获得 IP 地址的后主机即可进行通信。
比如:
域名如:alibaba.com (URL地址)
IP地址为:xx.233.xxs.12 (访问)
首先,第一步浏览器会请求DNS返回域名对应的IP,浏览器还提供了DNS数据缓存服务,如果某个域名已经被解析过了,浏览器就会缓存解析的结构,下次查询时直接使用,减少一次网络请求。
拿到IP后,就需要获取端口号,如果url没有明确指出端口号,HTTP协议默认是80端口。
在实际情况中,因为用户和服务器之间存在代理服务器比如nginx,这个解析到的域名一般是代理服务器的 IP地址(或者IP地址 :80端口 ),代理服务再去转发请求到真正的业务服务器,业务服务器和IP和端口号就跟访问的域名没啥关系了。
域名和端口号是怎么对应起来的?
客户端输入域名,通过DNS将域名解析成为服务器ip,找到代理服务器,因为http协议服务所占用的端口默认为80端口,所以会访问服务器的80端口,然后再通过代理服务器将请求转发到不同的服务器以及端口中.
如图:域名和端口号的对应
(来自https://blog.csdn.net/qq_43778308/article/details/109382424)
应该通过域名访问项目吗?
答案是必须的。
如果用IP+端口号的方式访问,会有以下后果:
- 首先,非常难记,域名是对人友好的有含义的字符,而ip都是4组基本无规律的数字,对人不友好.
- 其次,如果服务器中的资源发生迁移,那么原先的服务器ip地址就无效了,必须要重新使用新的ip地址访问服务器,用户还要再去记忆一遍IP地址。但是如果是使用域名则不存在这个问题.
- 最后,不安全,通过ip直接访问服务器是非常危险的,相当于将整个服务器的大门向所有人打开,造成的后果是别有用心的人能够非常容易攻击到服务器.域名访问就能杜绝这种情况,用户是不知道服务器的IP地址的,而且就算有人通过域名恶意攻击,直接和用户交互的代理服务器也可以保护内容服务器。这样就算代理服务器被攻破,损失也相对较小。
从域名到服务器的流程是怎么样的?
首先是域名解析,然后客户端拿到域名对应的IP地址,客户端再根据IP地址去对指定服务器资源进行访问(默认80端口)。
域名解析的大致过程如下图
(来自https://blog.csdn.net/qq_43778308/article/details/109382424)
DNS的查询方式有几种?
当客户端程序要通过一个主机名称来访问网络中的一台主机时,它首先要得到这个主机名称所对应的IP地址,因为IP数据报中允许放置的是目地主机的IP地址,而不是主机名称。
可以从本机的hosts文件中得到主机名称所对应的IP地址,但如果hosts文件不能解析该主机名称时,只能通过向客户机所设定DNS服务器进行查询了。(这里hosts文件是本地查询)
按照如下流程查询IP
浏览器缓存→hosts&系统缓存→路由器缓存→ISP DNS 缓存
查询方式可大致分为以下几种:
- 本地查询:客户机平时得到的DNS查询记录都保留在DNS缓存中,客户机操作系统上都运行着一个DNS客户端程序。当其他程序提出DNS查询请求时,这个查询请求要传送至DNS客户端程序。DNS客户端程序首先使用本地缓存信息进行解析,如果可以解析所要查询的名称,则DNS客户端程序就直接应答该查询,而不需要向DNS服务器查询,该DNS查询处理过程也就结束了。
- 直接查询:如果DNS客户端程序不能从本地DNS缓存回答客户机的DNS查询,它就向客户机所设定的本地DNS服务器发一个查询请求,要求本地DNS服务器进行解析。本地DNS服务器得到这个查询请求,首先查看一下所要求查询的域名是不是自己能回答的,如果能回答,则直接给予回答,如是不能回答,再查看自己的DNS缓存,如果可以从缓存中解析,则也是直接给予回应。
当本地域名服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式:递归和迭代
- 递归查询:本地DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给本地DNS服务器,再由本地DNS服务器返回给客户端。
递归查询结构图如下(图片来自https://blog.csdn.net/codejas/article/details/80086068)
- 迭代查询:当本地域名服务器自己不能回答客户机的DNS查询时,也可以通过迭代查询的方式进行解析。DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给本地域名服务器,本地域名服务器再继续向这些DNS服务器进行查询,直到得到查询结果为止。
迭代查询结构图如下:
(图片来自https://blog.csdn.net/codejas/article/details/80086068)
DNS缓存机制
关于DNS缓存的机制,有一篇非常详细的文章What really happens when you navigate to a URL。
简单来说,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操作系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问OS缓存,最后再访问DNS服务器(一般是ISP提供),然后DNS服务器会递归式的查找域名记录,然后返回。
DNS记录会有一个ttl值(time to live),单位是秒,意思是这个记录最大有效期是多少。经过实验,OS缓存会参考ttl值,但是不完全等于ttl值,
而浏览器DNS缓存的时间跟ttl值无关,每种浏览器都使用一个固定值。
Windows访问DNS后会把记录保存一段短暂的时间
可通过ipconfig /displaydns 查看windows的DNS缓存、通过ipconfig /flushdns来清除。
而在修改hosts文件后,所有OS中DNS缓存会被清空,而浏览器缓存则不发生变化
DNS解析负载均衡之优缺点
优点:
- 配置简单,无成本费用
- 将负载均衡的工作交给了DNS服务器,省去了管理的麻烦
缺点:
- 记录的添加与修改是需要一定时间才能够生效的(因为DNS缓存了A记录)。一旦有一台服务器坏了需要下线,即使修改了A记录,要使其生效也需要较长的时间,这段时间,DNS任然会将域名解析到已下线的服务器上,最终导致用户访问失败。
- 不能按需分配负载,DNS并不知道各服务器的真实负载情况,所以负载效果不是很好
实际的情况:
在实际的项目部署,我们一般会将部分服务器使用DNS解析,利用域名解析作为第一级负载均衡.再在服务器中使用NGINX负载均衡作为第二级负载均衡。
CNAME是什么?
CNAME(Canonical Name)记录是DNS中的一种资源记录类型,用于将一个域名指向另外一个域名。当DNS遇到一个CNAME记录时,就会将查询转发到CNAME指向的目标域名,并继续解析那个域名。CNAME记录成为一种实现域名别名的常用手段。
CNAME记录将域名解析为另外一个域名,A记录将域名解析为IP地址。
A记录
A记录,即Address记录,他并不是一个IP或者一个域名,而是一种指向关系。
举个例子:
- 域名 www.xx.com —> 1.1.1.1
- 主机名 DD —> 2.2.2.2
当我们访问某个域名的时候,DNS服务器会通过A记录解析出来域名对应的IP记录,以达到后续访问目的。A记录是IP解析,直接将域名或者主机名指向某个IP
CNAME记录
也称为别名记录,相当于给A记录中的域名起个小名,他也是一种指向关系,将一个域名指向另外一个域名,然后通过A记录指向IP地址。
- www.yy.com(别名) —> www.xx.com (A记录)—> 1.1.1.1
可以直接通过小名找到对应的地址。
就好比:一个人的外号一样,并且一个人可以很多外号,都指向这个人!!!
一个IP地址可以有多个域名,并且多个域名都可以找到这个IP地址。那么就可以给每个域名起一个别名。
- www.yy.com —> www.xx.com —> 1.1.1.1
- www.cc.com —> www.xx.com —> 1.1.1.1
- www.kk.com —> www.xx.com —> 1.1.1.1
当服务器的IP地址需要更换为2.2.2.2的时候,这个时候只要修改一下www.xx.com的指向就好。
www.xx.com —> 2.2.2.2
并且它的小名是不用进行更改的,他们只指向他们解析的域名。
如果不用CANME记录,直接进行A记录?
- www.yy.com —> 1.1.1.1
- www.cc.com —> 1.1.1.1
- www.kk.com —> 1.1.1.1
那么在更改了服务器地址后,每条A记录都需要进行更改,这样子就会很麻烦!!!
CANME记录的应用
- 现网常用在CDN加速上
- 域名别名: 为长域名或者频繁更改的域名提供一个简短或者稳定的别名。
- 多域名管理
- 第三方服务
有一个域名example.com(1.1.1.1) 并希望www.example.com也指向同一个网站,则就可以为www.example.com创建一个CNAME记录,指向example.com。配置方式如下:
- Type:CNAME
- Name: www
- Target:example.com
www.example.com配置如下:
www(别名) —> example.com(A记录) —> 1.1.1.1
CDN
一张图理解CDN加速,摘自

CDN的全称是Content Delivery Network,即内容分发网络。一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将资源文件(音乐、图片、视频、应用程序及其他文件)发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。
使用了CDN缓存资源,加速请求网络资源的响应过程:
- 对于点击的数据的URL,经过本地DNS系统的解析,发现该URL对应的是一个CDN专用的DNS服务器,DNS系统就会将域名解析权交给CNAME指向的CDN专用的DNS服务器。
- CND专用DNS服务器将CND的全局负载均衡设备IP地址返回给用户
- 用户向CDN的全局负载均衡设备发起数据请求
- CDN的全局负载均衡设备根据用户的IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求
- 区域负载均衡设备选择一台合适的缓存服务器来提供服务,将该缓存服务器的IP地址返回给全局负载均衡设备
- 全局负载均衡设备把服务器的IP地址返回给用户
- 用户向该缓存服务器发起请求,缓存服务器响应用户的请求,将用户所需内容发送至用户终端。
总结:用户发起请求,输入URL网址—>进行DNS解析域名—>本地是否有缓存(本机DNS缓存->本地hosts文件->DNS服务器)(有的话直接返回IP地址,没有话向DNS服务器发起请求)—>DNS服务器(是否使用了CDN,没有的话进行迭代发起请求直到查找到IP地址)->DNS服务器发现该URL是一个CDN专用的DNS服务器,于是将域名解析的工作交给CNAME记录的CDN专用的DNS服务器 -> CDN专用的DNS服务器发起请求->CDN调度中心返回距离最近的URL对应的服务器地址给本地DNS服务器->本地DNS服务器发回给主机->主机发起请求(若该服务器有对应的缓存数据直接返回,没有话向上一层发起请求)->主机得到资源数据。
更多推荐


所有评论(0)