本文是一篇学习笔记,学习的课程是极客时间的《透视HTTP协议》。
透视HTTP协议_HTTP_HTTPS-极客时间 (geekbang.org)
DNS(Domain Name System)是域名系统的缩写,它是一个分布式数据库系统,用于将人们易于记忆和理解的域名(如 www.example.com
)转换为计算机能够理解和处理的IP地址(如 192.0.2.1
)。DNS系统由多个层次化的域名服务器组成,这些服务器共同工作以解析域名并提供相应的IP地址。
一、域名的形式
域名是一个有层次的结构,是一串用“.”分隔的多个单词,最右边的被称为“顶级域名”,然后是“二级域名”,层级关系向左依次降低。
最左边的是主机名,通常用来表明主机的用途,比如“www”表示提供万维网服务、“mail”表示提供邮件服务,不过这也不是绝对的,名字的关键是要让我们容易记忆。
看一下极客时间的域名“time.geekbang.org”,这里的“org”就是顶级域名,“geekbang”是二级域名,“time”则是主机名。使用这个域名,DNS就会把它转换成相应的IP地址,就可以访问极客时间的网站了
在Apache、Nginx这样的Web服务器里,域名可以用来标识虚拟主机,决定由哪个虚拟主机来对外提供服务。
敲黑板:域名本质上就是个名字空间系统。
类似于电话本,ip就是电话号码,域名就是人名。
二、域名的解析
就像IP地址必须转换成MAC地址才能访问主机一样,域名也必须要转换成IP地址,这个过程就是“域名解析”。
DNS的核心系统是一个三层的树状、分布式服务,基本对应域名的结构:
-
根域名服务器(Root DNS Server):管理顶级域名服务器,返回“com”“net”“cn”等顶级域名服务器的IP地址;
-
顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如com顶级域名服务器可以返回apple.com域名服务器的IP地址;
-
权威域名服务器(Authoritative DNS Server):管理自己域名下主机的IP地址,比如apple.com权威域名服务器可以返回www.apple.com的IP地址。
例如,你要访问“www.apple.com”,就要进行下面的三次查询:
-
访问根域名服务器,它会告诉你“com”顶级域名服务器的地址;
-
访问“com”顶级域名服务器,它再告诉你“apple.com”域名服务器的地址;
-
最后访问“apple.com”域名服务器,就得到了“www.apple.com”的地址。
三、DNS缓存
虽然核心的DNS系统遍布全球,服务能力很强也很稳定,但如果全世界的网民都往这个系统里挤,即使不挤瘫痪了,访问速度也会很慢。
所以在核心DNS系统之外,还有两种手段用来减轻域名解析的压力,并且能够更快地获取结果,基本思路就是“缓存”。
DNS是一个树状的分布式查询系统,但为了提高查询效率,外围有多级的缓存。
1、建立“非权威域名服务器”缓存DNS查询结果
许多大公司、网络运行商都会建立自己的DNS服务器,作为用户DNS查询的代理,代替用户访问核心DNS系统。这些“野生”服务器被称为“非权威域名服务器”,可以缓存之前的查询结果,如果已经有了记录,就无需再向根服务器发起查询,直接返回对应的IP地址。
这些DNS服务器的数量要比核心系统的服务器多很多,而且大多部署在离用户很近的地方。比较知名的DNS有Google的“8.8.8.8”,Microsoft的“4.2.2.1”,还有CloudFlare的“1.1.1.1”等等。
2、操作系统缓存DNS查询结果
操作系统里也会对DNS解析结果做缓存,如果你之前访问过“www.apple.com”,那么下一次在浏览器里再输入这个网址的时候就不会再跑到DNS那里去问了,直接在操作系统里就可以拿到IP地址。
3、“主机映射”文件
操作系统里还有一个特殊的“主机映射”文件,通常是一个可编辑的文本,在Linux里是“/etc/hosts”,在Windows里是“C:\WINDOWS\system32\drivers\etc\hosts”,如果操作系统在缓存里找不到DNS记录,就会找这个文件。
下面的这张图比较完整地表示了现在的DNS架构。
四、域名的新作用
1、也是最简单的,“重定向”。因为域名代替了IP地址,所以可以让对外服务的域名不变,而主机的IP地址任意变动。当主机有情况需要下线、迁移时,可以更改DNS记录,让域名指向其他的机器。
2、因为域名是一个名字空间,所以可以使用bind9等开源软件搭建一个在内部使用的DNS,作为名字服务器。这样我们开发的各种内部服务就都用域名来标记,比如数据库服务都用域名“mysql.inner.app”,商品服务都用“goods.inner.app”,发起网络通信时也就不必再使用写死的IP地址了,可以直接用域名。
3、基于域名实现的负载均衡。
- 因为域名解析可以返回多个IP地址,所以一个域名可以对应多台主机,客户端收到多个IP地址后,就可以自己使用轮询算法依次向服务器发起请求,实现负载均衡。
- 域名解析可以配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,这样在DNS端把请求分发到不同的服务器,实现负载均衡。
有没有不理解为什么公司要自建DNS ?
- 性能优化和响应时间:
- 自建DNS服务器通常部署在公司或运营商的网络内部,与用户距离更近,这有助于减少网络延迟和查询响应时间。
- 本地缓存机制能够存储用户经常访问的域名和IP地址对应关系,减少了对外部DNS服务器的依赖,从而提高了查询效率。
- 安全性和隐私保护:
- 自建DNS服务器可以更好地控制DNS查询的处理过程,避免潜在的中间人攻击和数据泄露。
- 公司或运营商可以自定义DNS查询的过滤和拦截规则,以防止恶意域名解析,保护用户免受网络钓鱼、恶意软件和广告等威胁。
- 可靠性和稳定性:
- 自建DNS服务器可以根据公司或运营商的需求进行定制和优化,提供更可靠和稳定的服务。
- 在发生故障或网络拥塞时,自建DNS服务器可以提供备用路径或负载均衡,确保用户查询的连续性和可用性。
- 内容控制和策略实施:
- 通过自建DNS服务器,公司或运营商可以实施特定的内容控制策略,如阻止访问某些网站或限制某些类型的网络流量。
- 这有助于维护公司内部网络的安全和合规性,以及符合相关法律法规和政策要求。
- 定制化和灵活性:
- 自建DNS服务器可以根据公司或运营商的具体需求进行定制和扩展,提供灵活的域名解析服务。
- 例如,可以添加自定义的DNS记录类型、支持特定的查询协议或实现与其他网络服务的集成。
- 数据分析和监控:
- 自建DNS服务器可以收集和分析用户的DNS查询数据,提供有关网络使用情况的洞察和统计信息。
- 这有助于公司或运营商更好地理解用户需求、优化网络配置以及改进服务质量。
在浏览器地址栏里随便输入一个不存在的域名,比如就叫“www.不存在.com”,试着解释一下它的DNS解析过程。
本地查询:首先,浏览器会在本地缓存中查找该域名对应的IP地址。本地缓存通常保存了之前访问过的域名解析结果,以加快访问速度。如果本地缓存中有该域名的记录,浏览器会直接使用缓存中的IP地址进行访问。
查询DNS服务器:如果本地缓存中没有找到对应的域名记录,浏览器会向配置的DNS服务器发送查询请求。DNS服务器中存储着域名和IP地址的映射关系。
主域名服务器:如果DNS服务器是主域名服务器,它会直接从本地磁盘文件中加载域名信息进行解析。主域名服务器负责维护一个特定区域的所有域名信息。
辅助域名服务器:如果DNS服务器是辅助域名服务器,它会从主域名服务器那里获得授权,并有一个所有域信息的完整拷贝。辅助域名服务器作为主域名服务器的备份,提供域名解析服务。
缓存域名服务器:缓存域名服务器没有自己的域名数据库,而是从远程服务器获取域名解析的答案,并将其存储在高速缓存中。对于相同的查询请求,缓存域名服务器可以直接从缓存中提供答案,从而提高解析速度。
转发域名服务器:转发域名服务器负责处理所有非本地域名的查询。如果它自己的缓存中没有找到答案,它会将查询请求转发到指定的其他DNS服务器,直到找到结果为止。
如果DNS服务器找到了对应的IP地址,它会将结果返回给浏览器。浏览器随后会使用这个IP地址来访问目标网站。 如果因为某些原因,DNS失效或者出错了,会出现什么后果?
无法解析域名:浏览器会报告一个错误,通常是“您所访问的域名错误或者不存在”。这意味着浏览器无法将输入的域名解析为有效的IP地址。
无法建立连接:由于没有有效的IP地址,浏览器无法与目标服务器建立TCP连接,因此无法加载或显示网页内容。
用户体验下降:用户可能会感到困惑或不满,因为他们无法访问期望的网站。这可能导致用户尝试重新输入域名、检查网络连接或寻求其他帮助。
为了避免这些问题,网络管理员和服务提供商需要确保DNS服务器的正常运行和及时更新,以减少DNS失效或出错的可能性。同时,用户也可以采取一些措施,如清除浏览器缓存、检查网络连接或尝试使用其他DNS服务器来解决访问问题。