DNS

DNS域名系统

DNS(Domain Name System)是因特网的一项服务,它作为域名和IP地址相互映射的一个分布式数据库,能够使人们更方便地访问互联网。通过域名而非IP地址去访问网站,但域名并不能被计算机直接识别,所以需要通过DNS将域名“翻译”称可由计算机直接识别的IP地址。
互联网中的域名系统 DNS 被设计成一个层次树状结构的联机分布式数据库系统,并且采取的是客户服务器的方式,将域名和IP地址相互映射联系了起来。

域名服务器的层次结构:
(来自https://blog.csdn.net/codejas/article/details/80086068)
在这里插入图片描述

DNS 使大多数名字都在本地进行解析,只有少量的解析需要在互联网通信,因此效率很高。采取分布式的一个好处是,即使单个计算机出了故障,也不会妨碍 DNS 系统的正常运行。

域名到 IP 地址的解析是通过许多分布在互联网上的域名服务器完成的。

解析的主要过程如下:

  1. 当一个主机中的进程需要把域名解析为 IP 地址时,该进程就会调用解析程序,首先在本地的浏览器缓存,hosts系统缓存中查找,如果有,解析结束,没有就下一步
  2. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,主机把待解析的域名放在 DNS 的请求报中,以 UDP 用户数据报方式发送给本地域名服务器。
  3. 本地域名服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,如果没有,本地域名服务器向其他DNS服务器查询,在查找域名后,把对应的 IP 地址放在回答报文中返回给主机。
  4. 获得 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加速,摘自

image-20241105172700099

CDN的全称是Content Delivery Network,即内容分发网络。一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将资源文件(音乐、图片、视频、应用程序及其他文件)发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

使用了CDN缓存资源,加速请求网络资源的响应过程:

  1. 对于点击的数据的URL,经过本地DNS系统的解析,发现该URL对应的是一个CDN专用的DNS服务器,DNS系统就会将域名解析权交给CNAME指向的CDN专用的DNS服务器。
  2. CND专用DNS服务器将CND的全局负载均衡设备IP地址返回给用户
  3. 用户向CDN的全局负载均衡设备发起数据请求
  4. CDN的全局负载均衡设备根据用户的IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求
  5. 区域负载均衡设备选择一台合适的缓存服务器来提供服务,将该缓存服务器的IP地址返回给全局负载均衡设备
  6. 全局负载均衡设备把服务器的IP地址返回给用户
  7. 用户向该缓存服务器发起请求,缓存服务器响应用户的请求,将用户所需内容发送至用户终端。

总结:用户发起请求,输入URL网址—>进行DNS解析域名—>本地是否有缓存(本机DNS缓存->本地hosts文件->DNS服务器)(有的话直接返回IP地址,没有话向DNS服务器发起请求)—>DNS服务器(是否使用了CDN,没有的话进行迭代发起请求直到查找到IP地址)->DNS服务器发现该URL是一个CDN专用的DNS服务器,于是将域名解析的工作交给CNAME记录的CDN专用的DNS服务器 -> CDN专用的DNS服务器发起请求->CDN调度中心返回距离最近的URL对应的服务器地址给本地DNS服务器->本地DNS服务器发回给主机->主机发起请求(若该服务器有对应的缓存数据直接返回,没有话向上一层发起请求)->主机得到资源数据。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐