DNS入门:轻松了解网络架构的基础


相关概念

域名

语法结构

  1. 一个完整的域名由2个或2个以上的部分组成
  2. 各部分之间用英文的句号“.”来分隔,最后一个“.”的右边部分称为顶级域名(TLD,也称为一级域名),最后一个“.”的左边部分称为二级域名(SLD),二级域名的左边部分称为三级域名,以此类推,每一级的域名控制它下一级域名的分配。

一级域名(TLD)

一级域名一般用于划分组织

  • .com 代表工商企业域名;
  • .cn 代表中国的域名;
  • .net 网络提供商域名;
  • .org 非盈利组织域名;
  • .gov 政府域名;
  • .edu 教育类的域名。
  • 其他类别(这类一般比较便宜,就是说不热门,没人抢

但是现在其实 .com 跟 .net 谁都能申请(只要不缺钱的话

二级域名(SLD)

一级+二级域名才是中国人常说的域名。比如我的域名 anubis.cafe

  • 二级域名是唯一的
  • 在申请域名的时候,有且仅有二级域名可以被申请(不信可以试试
  • 二级域名一般用于代表个人或组织

子域名

一般指三级及更多级域名(严格来讲,二级域名也算子域名,但是由于申请时只能申请二级域名,不能申请一级域名,所以中国人一般把二级域名叫域名

裸域名

裸网域就是不含“www”前缀的网域地址,例如 google.com(裸), www.google.com(非裸)。

下面内容引自知乎用户 Rio 的回答
越来越多网站不喜欢加 www 前缀

  • 好处:便于记忆
  • 坏处:很多,详见链接

TTL

TTL(Time to Live)是指在网络数据传输中,每个数据包或报文所能跨越的最长时间或网络跳数。当TTL值减到0时,该数据包将被丢弃。

TTL通常用于实现路由和网络拓扑中的一些安全机制。例如,在IP协议中,每个传输的数据包都会携带一个8位的、由源主机设定的TTL值。每经过一个路由器,则这个TTL值就会被减去1,如果最终TTL为0,则数据包将被丢弃并返回一个ICMP Time Exceeded消息以通知源主机。

使用TTL可以防止因无法找到目标节点而导致的数据包循环转发,并限制每次数据包的传播范围,从而提高运行效率和安全性。同时也可以限制某些网络攻击方式比如拒绝服务攻击(DDoS),避免网络资源被耗尽。

除了在网络层应用TTL之外,它还可用于缓存应用,例如在内存或磁盘上存储缓存数据时,为数据设置TTL,以便最近没有被访问的缓存数据自动失效和清理,节省系统资源和空间。

定义

DNS(Domain Name System)域名系统。作用本质上是将人们便于记忆的域名转成计算机需要的 IP 地址。

最初,计算机设备使用物理地址(MAC)在网络中进行唯一标识。然而,MAC 地址对于人类不够友好,因为它们是一长串数字和字母的组合。为了使其更易于理解和记忆,IPv4 地址作为另一种标识方式被设计出来。IPv4 地址使用点分十进制的格式(如 192.168.0.1),比起 MAC 地址更加易用,但仍有些复杂。随着互联网的发展,为了让用户更方便地访问网站,域名被引入。域名是以人类易于理解的方式来表示IP地址的字符串,例如“google.com”。在浏览器中直接输入网站名称即可访问,这增强了用户体验和使用方便。

当然,现在的 DNS 以及有了更多的功能不再局限于便于记忆这一点了。

特征

  1. 分布式:DNS 采用分布式数据库的方式,使得它能够承受海量数据的负载,避免了单点故障。
  2. 层次化:DNS 采用类似于文件系统的树状结构,将域名划分为多个层次,每个层次有一个对应的 DNS 服务器来处理。这种层次化的结构使得 DNS 查询可以被高效地处理。
  3. 可扩展性:由于 DNS 的分布式设计和层次化结构,可以轻松地添加新的 DNS 服务器来处理更多的查询负载。此外,DNS 也支持各种记录类型,可以很容易地添加新的记录类型以满足不同的应用需求。
  4. 快速查询:DNS 采用缓存来提高查询速度,DNS 服务器可以缓存查询结果,当同样的查询再次出现时,可以直接返回缓存的结果,从而避免了重复的查询过程。
  5. 易于管理:DNS 提供了各种工具来管理 DNS 服务器和域名,例如 BIND、PowerDNS 等,这些工具可以使得 DNS 管理变得更加容易和高效。

结构-分布式存储结构

原因

为什么不使用中心化结构

  • 单点故障:在一个中心化架构中,如果主服务器出现问题,整个DNS服务将受到影响。这意味着用户可能会无法访问他们需要访问的网站,因为域名解析不可用。
  • 安全性风险:单点故障同时也带来了安全性问题。黑客攻击或者网络攻击很容易对主DNS服务器进行攻击,并导致大量的信息遭盗窃或破坏。
  • 处理能力限制:由于所有DNS查询都必须转发给一个中央服务器处理,其吞吐量和处理速度会产生瓶颈,在高流量条件下表现不佳。
  • 难以扩展:中心化架构可能难以扩展,尤其是当更多设备加入网络时。新设备将面临RDNS缓慢和延迟等困境。
  • 维护难度大:单个 DNS 服务器将不得不为所有的因特网主机保留记录。这不仅将使这个中央数据库庞大,而且它还不得不为解决每个新添加的主机而频繁更新。

结构

  1. 根域名服务器(Root Name Servers):这是 DNS 体系中最高层次的服务器。全球只有13台根域名服务器,它们以逻辑上的字母从 A 到 M 来标记,每个服务器都运行着唯一一个固定 IP 地址。

    互联网名称与数字地址分配机构 ICANN(Internet Corporation for Assigned Names and Numbers)管理根DNS域

全世界共用 13 台域名服务器,其中 10 台在美国,剩下的 3 台分别在日本,英国,瑞典。

实际上,全球只有13组根域名服务器。根域名服务器的IP地址数量可能是指部署在不同地理位置的服务器镜像或副本,以提高可靠性和容错性。这些镜像或副本服务器在实时同步更新,以保证全球范围内的域名解析服务的高可用性和可靠性。因此,尽管有400多个根域名服务器IP地址,但实际上只有13个根域名服务器。

每个服务器在美国都被复制了约 200 次

这里提到的 13 个根域名服务器(Root Name Servers)分别掌管着以下顶级域名节点(Top-level Domain,TLD),即 “.com”、”.org”、”.net”、”.int”、”.edu”、”.gov”、”.mil”、”.info”、”.biz”、”.name”、”.pro”、”.aero” 和 “.coop” 。这些根域名服务器负责管理 Internet 上所有域名系统中的 IP 地址与域名的映射关系,其存在极大地促进了互联网的发展与运作。

  1. 顶级域名服务器(Top Level Domain,TLD):这些服务器包括许多国家和地区的域名、通用域名(如.com,.org等),以及其他特殊的域名,如.net 和.edu。每一个顶级域名服务器维护自己负责管理的 TLD 的名称服务器记录,并向下查询来指定哪个名称服务器保留任何给定的域的权威性。
  1. 权威域名服务器(:这些服务器存储着具体域名与IP地址的对应关系,而且通常由互联网服务提供商(ISP)或者网络管理员维护。当用户通过其计算机发出请求时,计算机会先向本地域名服务器发送请求,然后在本地缓存中查找信息,如果未能获取,则向更高层次的DNS服务器中一直发出请求至获得相应的解析结果。

  2. 解析器

本地 DNS 服务器,它不严格属于 DNS 分层结构。

本地 DNS 服务器则是用户计算机端的一种非强制性服务,它可以提供 DNS 缓存功能以便加快查询速度,并将查询请求发送到更高层次的 DNS 服务器网络中寻找答案。

虽然本地 DNS 服务器对整个 DNS 解析过程起着重要作用,但它并不属于 DNS 的正式分层结构中的一员。

解析过程

基于 UDP 查询

DNS 最初被设计为基于 UDP,主要原因是 UDP 比 TCP 更快、更简单,并且 UDP 的无连接特性更适合 DNS 的查询场景。由于 DNS 查询通常不超过512字节,这样就可以在一个 UDP 数据包中完成,而 TCP 协议需要额外的握手和拆包操作,会增加延迟和带宽占用,不适合 DNS 的快速查询场景。此外,UDP 也更容易在网络上扩展,因为 DNS 服务器可能需要同时处理大量的查询请求。当然,在某些情况下,例如 DNS 响应较大或查询包含大量的选项和标志时,DNS 服务器可能会将查询切换到 TCP。

递归查询

递归查询

  1. 计算机在进行域名解析时会优先查询本地 Hosts 文件来返回 IP 地址;如果 Hosts 文件中没有对应信息,则计算机向本地 DNS 服务器发送查询请求。
  2. 如第一步未找到所需的记录,则本地 DNS 将检查自己的缓存。如果缓存中缺少相应的记录,则 LDNS(Local DNS) 向根域名服务器之一发起查询请求,并将待查询的完整域名信息包括查询类型(如 A 记录)和递归位设置为”未求助递归”。
  3. 根域名服务器接收到 LDNS 的查询请求后,根据请求的内容回复一个指示下一级别 DNS 服务器地址的 NS 记录给 LDNS。
  4. 此时 LDNS 收到了上层 DNS 返回的授权式 NS 记录,这样它就知道询问要交给哪个 DNS 进行处理了。接下来 LDNS 再次向对应的顶级域名服务器发起新的查询请求,并把原始的查询报文格式几乎全都照搬过去,并将递归位设置为“继续迭代”。
  5. 接着顶级域名服务器按照前两步骤同样的方式分析域名,然后再次回送一个 NS 指针给LDNS.
  6. 最后 LDNS 发送给子域名的 DNS 服务器询问,该服务器会检查自己的缓存和记录,并根据需要向更高一级别继续进行同样的过程。此过程将重复多次,直到找到目标 IP 地址,然后返回结果。
  7. 在整个查询过程中,DNS 系统可能还涉及了许多额外功能,例如负载均衡、故障容错等技术的应用,以保证系统运作的可靠性和高效性。

迭代查询

递归查询与迭代查询的对比

  • 递归查询本地名称服务器为中心,DNS 客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态,直到本地名称服务器发来了最终的查询结果。此时的本地名称服务器就相当于中介代理的作用。
  • 迭代查询DNS客户端自己为中心。所有查询工作全部是 DNS 客户端自己进行。DNS客户 会按照顺序 向 本地名称服务器 、一级名称服务器、二级名称服务器、权威名称服务器发出查询 DNS 的 请求查询报文,这个过程中每一级服务器就会返回一个能解答这个查询的下一个名称服务器列表 A,获取到下个查询列表信息 A 后 DNS 客户 会再向返回的列表 A 中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。

递归查询和迭代查询的主要区别在于查询过程中的责任分配和参与方式。在递归查询中,本地DNS服务器负责完成整个查询过程,并返回最终结果给DNS客户端,DNS客户端只需等待即可。而在迭代查询中,DNS客户端需要主动参与查询过程,并等待DNS服务器的不断返回,DNS服务器需要不断向下级服务器发出请求,直到获得最终结果。

DNS 缓存

从解析过程中不难发现,一个域名的解析流程似乎过于繁琐了,如果能在 LDNS 直接查到就好了,因此我们的缓存就又出马了。

缓存这个实现在计算机网络中特别常见,你看 web 缓存,cdn,dns 缓存还有。。。。。

其实学这些更多是为了学习一些思想,比如多级缓存,模块化,规范化等等。

这些东西直接跟你讲可能不能够很好的体会,在这些实际的技术中更能体会到这些思想。

根据缓存的存储位置可分为本地与远程:

特点 本地DNS缓存 远程DNS缓存
位置 存储在用户计算机上 存储在ISP提供的DNS服务器上
缓存内容 存储访问过的域名和对应的IP地址 存储全球的域名和对应的IP地址
缓存方式 根据TTL过期时间清除缓存 根据服务器内存和磁盘容量限制清除缓存
响应速度 快,无需查询远程服务器 稍慢,需要查询远程服务器
可靠性 受限于用户计算机的存储能力和程序稳定性 受限于ISP提供的DNS服务器的可靠性
隐私保护 能够防止ISP对用户访问行为的追踪 ISP可以追踪用户访问行为

异同点:

  • 本地DNS缓存与远程DNS缓存的位置不同,一个存储在用户计算机上,一个存储在ISP提供的DNS服务器上。
  • 本地DNS缓存只存储访问过的域名和对应的IP地址,而远程DNS缓存存储全球的域名和对应的IP地址。
  • 本地DNS缓存根据TTL过期时间清除缓存,而远程DNS缓存根据服务器内存和磁盘容量限制清除缓存。
  • 本地DNS缓存响应速度快,无需查询远程服务器,而远程DNS缓存稍慢,需要查询远程服务器。
  • 本地DNS缓存受限于用户计算机的存储能力和程序稳定性,而远程DNS缓存受限于ISP提供的DNS服务器的可靠性。
  • 本地DNS缓存能够防止ISP对用户访问行为的追踪,而ISP可以追踪用户访问行为。

优劣性:

  • 本地DNS缓存的优势在于速度快,能够防止ISP对用户访问行为的追踪,但缺点在于受限于用户计算机的存储能力和程序稳定性。
  • 远程DNS缓存的优势在于存储全球的域名和对应的IP地址,可靠性高,但缺点在于响应速度稍慢,ISP可以追踪用户访问行为。

根据缓存信息的查询方式可分为递归与迭代

优点 递归查询缓存 迭代查询缓存
响应速度快 因为递归查询缓存通常保存在本地 DNS 服务器上 因为迭代查询缓存保存在客户端上
减少网络流量 因此响应速度通常比较快 因此响应速度可能较慢
减少 DNS 服务器的负载 可以减少向上游 DNS 服务器发送请求的次数 只能缓存当前客户端的查询结果
支持更多 DNS 协议 可以缓存任何类型的 DNS 查询结果,包括 A、AAAA 等 只缓存迭代查询所产生的 IP 地址
精确控制缓存时间 可以根据不同的查询类型设置不同的缓存时间 只能根据 TTL 设置缓存时间
可以避免 DNS 污染 可以避免向可能被污染的 DNS 服务器发送请求 不能避免向可能被污染的 DNS 服务器发送请求

请求报文

DNS报文头有12个字节,包括以下几个字段:

  • 标识符(identification):用于将查询与响应相对应。
  • 标志(flags):指示查询或响应类型、操作码、递归查询等信息。
    • query or reply
    • recursion desired
    • recursion available
    • reply is authoritative
  • 问题数(number of questions)
  • 答案数(number of answers)
  • 授权者资源记录数(number of authority resource records)
  • 附加资源记录数(number of additional resource records)

DNS 记录类型

记录类型 定义
A 将域名映射到 IPv4 地址
AAAA 将域名映射到 IPv6 地址
CNAME 可以将一个域名指向另外一个域名
MX 指定邮件服务器,管理电子邮箱交换机上的接收信息
NS 标识哪些 DNS 服务器授权提供某个特定域名的服务
PTR 通过 IP 地址查询对应主机名称
TXT 添加任意文本信息或备注

注意事项

  • 一个域名是可以解析到许多不同 IP 上面的。
  • 一个域名可以由任意级子域名,但是任意一级域名长度的最大限制时63个字符,域名总长度不能超过253个字符
  • DNS 解析并不是实时完成的,它需要一定时间来解析和传播。
  • DNS 可能会受到攻击,例如 DDoS 攻击、DNS 污染等安全威胁。
  • 维护好正确且稳定的 DNS 解析对于网站运行至关重要,建议使用可靠的 DNS 服务提供商或自建 DNS 服务器。

小技巧

这些命令或操作可以刷新本地设备上 DNS 解析的缓存,使之生效。

  • Windows:

    • Win10 / WinServer 2016及以后版本:ipconfig /flushdns
    • Win8 / WinServer 2012 及其以下版本:ipconfig /flushdns
    • 在 CMD 命令行窗口中运行上述命令即可。
  • macOS:

    • Mojave 及其以上版本:
      • sudo killall -HUP mDNSResponder
      • 或者使用 /usr/bin/sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
    • High Sierra 以及更早版本:
      • sudo killall -HUP mDNSResponder
  • Linux(Debian / Ubuntu):

    • sudo systemd-resolve --flush-caches
  • Android:

    • 进入设置 -> 应用管理器或应用程序->找到 Google Play services,清除数据和缓存。
    • 对于非 root 的手机需要卸载部分应用之后重新安装再进行尝试
  • iOS:

    • iOS 设备默认无法直接清空 DNS 缓存,但以下两种操作可以帮助解决 DNS 缓存问题:
      • 联网状态下关闭飞行模式并等待一段时间
      • 在设置 -> Wi-Fi 中断开当前连接,并重连 Wi-Fi。

参考资料


如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


文章作者: Anubis
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Anubis !
评论
  目录