内容目录
ToggleDNS 的起源
首先我们先使用手机来做举例,其中每个联络人都有一个唯一的手机号码。如果今天我们需要打电话给朋友,我们可以单纯输入电话号码,拨通电话。然而,随着联络人数量的增加,我们不太可能记住所有的电话号码,因此我们会将通讯录处存在手机里,当我们需要拨通电话时,我们只需要找到对应的联络人资讯,就可以拨通电话。
那么,在资讯领域,电脑则是由IP 位址来当作联络用的号码,例如:140.112.0.0 就是一个IP 位址。我们可以使用IP 位址来存取电脑上托管的网站。不过,如同前面举例的,人类不方便辨识出这么多由数字构成的IP 位址,因此我们有了网域名称。例如:google.com 是一个Google 的网站,他对应的IP 为142.250.191.78 。我们也需要一个类似通讯录的地方,来将IP 位址以及网域名称做纪录。
什么是DNS?
网域名称系统(DNS) 是网际网路命名服务(Domain Name System),此DNS 系统会将可以阅读的网域名称对应到机器可读的IP 位址,例如:google.com 对应的IP为142.250.191.78 。当使用者在浏览器中输入网域名称时,浏览器必须透过DNS 将网域名称转换为IP 位址。一旦获得所需的IP 位址,使用者的请求就会转送到目标伺服器。
DNS需要知道的名词
名称伺服器(Name Server)
其实DNS 不是单一伺服器,而是大量伺服器构成的Block,其中回应使用者查询的DNS 伺服器称为名称伺服器。
资源记录(Resource Record)
DNS 资料库会以资源记录(Resource Record) 的形式储存网域名称到IP 位址的对应。 RR 是使用者从名称伺服器请求的最小资讯单元,并且资源纪录有不同类型。这边提供以下几种不同的资源纪录来提供读者做参考。
缓存(Caching)
DNS 使用不同层的快取,来减少使用者的请求延迟。快取在减轻DNS 负担方面发挥着重要功能,因为它必须满足整个全球网际网路的查询。
层次结构(Hierarchy)
DNS 名称伺服器采用层次结构形式。由于其规模和查询负载不断增加,分层结构使DNS 具有高度可扩展性。
DNS 如何运作?
AWS 图示与描述
首先提供 AWS 图示以及原文描述,接下来会分别针对一些专有名词做讲解。
- 使用者开启Web 浏览器,在网址列中输入 www.example.com,然后按Enter 键。
- 对 www.example.com 的请求将路由到DNS 解析器,该解析器通常由使用者的Internet 服务供应商(ISP) 管理,例如有线Internet 供应商、DSL 宽频供应商或公司网路。
- ISP 的DNS 解析器将对 www.example.com 的请求转送至DNS 根名称伺服器。
- ISP 的DNS 解析器再次转送 www.example.com 的请求,这次转送至.com 网域的TLD 名称伺服器之一。 .com 网域的名称伺服器使用与 example.com 网域关联的四个Amazon Route 53 名称伺服器的名称来回应请求。
- ISP 的DNS 解析器选择Amazon Route 53 名称伺服器,并将 www.example.com 的请求转送到该名称伺服器。
- Amazon Route 53 名称伺服器在 example.com 托管区域中寻找 www.example.com 记录,取得关联值(例如Web 伺服器的IP 位址192.0.2.44),并将IP 位址传回给DNS解析器。
- ISP 的DNS 解析器最终获得使用者所需的IP 位址。解析器将该值传回给Web 浏览器。 DNS 解析器也会将 example.com 的IP 位址快取(储存)一段您指定的时间,以便下次有人浏览 example.com 时它可以更快地回应。有关详细信息,请参阅生存时间(TTL)。
- Web 浏览器向从DNS 解析器取得的IP 位址发送对 www.example.com 的请求。例如,您的内容就是在Amazon EC2 执行个体上执行的Web 伺服器或配置为网站终端节点的Amazon S3 储存桶。
- 位于192.0.2.44 的Web 伺服器或其他资源将 www.example.com 的网页传回给Web 浏览器,并且Web 浏览器显示该页面。
DNS层次结构(Hierarchy)
如前面所描述,DNS 不是接受请求并回应使用者查询的单一伺服器,而是由非常多伺服器结合而成,大型的系统,具有不同层次结构的名称伺服器。
DNS Hierarchy 四种伺服器
DNS 解析器(Resolver)
解析器用来将查询的字串变成一个查询序列,请求转送至其他DNS 名称伺服器。正常情况下,DNS 解析器本身就存在于用户的网路。
根级名称伺服器(Root-level Name Server)
这些伺服器接收来自本机伺服器的请求。根名称伺服器维护基于顶级网域的名称伺服器,例如.com、.edu、.us 等。例如,当使用者要求 educative.io 的IP 位址时,根级名称伺服器将传回保存.io 网域的IP 位址的顶级网域(TLD) 伺服器清单。
顶级网域名称伺服器(Top-level Domain Server)
这些伺服器保存权威名称伺服器的IP 位址。查询方将获得属于该组织的权威伺服器的IP 位址清单。
权威名称伺服器(Authoritative Name Server)
这些是一些大公司的DNS 名称伺服器,提供网路或应用程式伺服器的IP 位址。
迭代与递归查询
有两种方法可以执行DNS 查询,这边也附上CloudFlare 的DNS 简化流程图,仔细看也可以发现是与AWS 的图很相像的。
迭代查询
本机伺服器向根伺服器(Root server)、顶级网域名称伺服器(TLD) 和权威伺服器(Authoritative Name Server)请求IP 位址。
递归查询
最终用户请求本地伺服器。本机伺服器进一步请求根级名称伺服器(Root-level Name Server)。根级名称伺服器(Root-level Name Server)将请求转送到其他名称伺服器。
缓存
什么是快取呢?快取是指经常请求的资料,将它们储存在某一个地方,需要的时候可以快速取得。
在DNS 里面,也是会有快取的!快取可以大幅减少用户的回应时间并减少网路流量,当我们在不同的层次结构中使用快取时,它也可以减轻DNS 基础架构的大量查询负担。快取亦可以在浏览器、作业系统、使用者网路内的本机名称伺服器或ISP 的DNS 解析器中看到。
DNS 之于分散式系统
之前的文章介绍了分散式系统的概念,也介绍一个好的软体系统应该要有哪些特性。那们让我们来聊聊,DNS 中与抽象、特性、需求有关的部分吧。
其实DNS本身就是一个分散式系统,并且这些分散式特性具有以下优点:
- 它避免成为单点故障(SPOF)。
- 它实现了低查询延迟,因此用户可以从附近的伺服器获得回应。
- 它在维护和更新或升级过程中获得更高程度的灵活性。例如,如果一台DNS 伺服器发生故障或负载过重,另一台DNS 伺服器可以回应使用者查询。
这边也讲解DNS 如何提升扩展性(Scalability)、可靠性(Reliability)和一致性(Consistency)。
扩展性(Scalability)
DNS 是一个高度可扩展的系统。根据 Cloudflare 的文章,目前全球有13 台根级名称伺服器(Root-level Name Server) ,并且另外根据这些根伺服器而复制出来的实例,分布在世界各地,用来处理使用者查询。这些请求被分配到TLD 和根伺服器来处理查询,最后分配到由大公司自行管理的权威伺服器以使整个系统正常运作。
可靠性(Reliability)
缓存
快取是在浏览器、作业系统和本机名称伺服器中完成的,ISP DNS 解析器也维护着经常存取的服务的丰富快取。即使某些DNS 伺服器暂时关闭,也可以提供快取记录,使DNS 成为可靠的系统。
伺服器复制
DNS 系统性地,复制了遍布全球的每个副本伺服器,用来降低延迟处理用户请求,并且提高了整个系统的可靠性。
持续性(Consistency)
DNS 使用各种协定在层次结构中的复制伺服器之间更新和传输资讯。 DNS 则在一致性方面做出妥协以实现高效能。因为与写入相比,从DNS 的资料库读取资料的频率更高。不过,DNS 提供最终一致性并延迟更新复制伺服器上的记录。
由于前面提到的快取机制,一致性也会受到影响。由于权威伺服器位于组织内,因此在组织中的伺服器发生故障的情况下,权威伺服器上的某些资源记录可能会被更新。因此,预设/本地和ISP 伺服器上的快取记录可能会过时。为了缓解此问题,每个快取记录都带有一个称为生存时间(TTL) 的过期时间。
后记
这一篇距离上一篇 系统设计元件介绍Building Block – 系统设计05 隔了一段时间,主要是因为花了比较多的时间了解DNS 的原理,并且也认为DNS 不管是在面试、日常工作都是需要知道的一个必备知识,因此花了不少篇幅,深度讲解了DNS 。
未来如果是范围比较大的主题,也会依然花不少篇幅去做讲解,谢谢阅读!
引用
DNS Design: Scalability, Performance, Robustness
Cloudflare: What is a DNS root server?
IBM: What is the DNS protocol?
相关文章
系统设计元件介绍Building Block – 系统设计05