%% # 纲要 > 主干纲要、Hint/线索/路标 - DNS 服务器 - DNS 域名解析 - DNS 缓存 - DNS 记录 - DNS 报文 # Q&A #### 已明确 #### 待明确 > 当下仍存有的疑惑 **❓<font color="#c0504d"> 有什么问题?</font>** %% # DNS 服务器 > **DNS(Domain Name System)域名系统** [^1] [^2] **==DNS 服务器==** 是存储了 "**域名-IP 地址**" 之间的映射关系,**提供 DNS 服务的服务器**—— **域名到 IP 地址** 之间的**域名解析服务**,或逆向**从 IP 地址反查域名**。 DNS 服务器上运行着 **BIND(Berkeley Internet Name Domain)软件**,基于**运行在 ==UDP== 上的应用层协议**来提供域名解析服务。 DNS 服务器的基本工作就是**接收来自客户端的查询消息**,然后根据消息的内容返回响应。 <br><br> ## DNS 系统 DNS 服务器遵循**域名的层级结构**来保存信息,**每个 DNS 服务器保存着域名层级结构中的一个或多个域**,因此各台 **DNS 服务器之间同样具有层级关系**。 **整个 DNS 系统**实际上**由==多个不同层级的 DNS 服务器==所构成**,整体可看作是一个由 **==分层的 DNS 服务器==** 实现的分布式数据库。 > [!caution] > > - **一个域**只能完整地存储在一个 DNS 服务器中 > - 一个 DNS 服务器中可以**存储多个域**的信息,可以是**不同层级的域、或同一层级的多个域** > <br><br> ## DNS 服务器的层级 每台 DNS 服务器中保存着**一个域的完整信息**——存储着 "**保存了==该域中下一层级的各个域==的 DNS 服务器的地址**",故同样形成了**层级结构**: - **根 DNS 服务器** ——存储着根域 `.` 下的所有顶级域 DNS 服务器的地址 - **顶级域 DNS 服务器**——存储着该顶级域(例如`.com`)下所有的权威 DNS 服务器的地址 - **权威 DNS 服务器**——存储着该域(例如 `server.com`)下所有子级域 DNS 服务器的地址 - **本地 DNS 服务器**——用户端请求 DNS 解析时所访问的**最近服务器**, ![image-20220216002200640.png|744](_attachment/02-开发笔记/07-计算机网络/应用层/DNS%20相关.assets/IMG-DNS%20相关-F251BDA50091A46651E1901C99C3D8F0.webp) ### **根域 DNS 服务器**(Root Name Server) 最高级别的 DNS 服务器,位于 **DNS 查询过程的最高层**,根 DNS 服务器中**存放着所有 "==顶级域 DNS 服务器=="的地址**。 > [!important] **互联网上所有 DNS 服务器中都保存着 "根域 DNS 服务器" 的地址** > > 因此,客户端**只要能够访问任意一台 DNS 服务器**,就可以通过它**找到根域 DNS 服务器**,然后再一路顺藤摸瓜找到位于下层的某台 DNS 服务器,最终**获取域名对应的 IP 地址**。 > ^bl0id3 #### 根域服务器 IP 地址 根域 DNS 服务器的 IP 地址**全球总共只有 13 个**,采用**任播技术**,允许单个 IP 地址在全球多个物理位置上被同时使用,因此**每一个 IP 背后实际上对应多个物理服务器**,在全球分布有多个服务器节点(物理实例)。 ![image-20231229093813847|536](_attachment/02-开发笔记/07-计算机网络/应用层/DNS%20相关.assets/IMG-DNS%20相关-90B1DBF846CD67A29DBBE2AB83FC82CB.png) 上面 13 个 IP 对应 A~M 编号,在中国,一共有 26 个根域名服务器的节点: - 北京市 I、L、J、K、F - 香港特别行政区 A、I、H、F、F、E、J - 台北市 I、E、F、F、K、L - 澳门特别行政区 E、F - 上海市 L - 杭州市 F - 郑州市 L - 武汉市 L - 西宁市 L - 贵阳市 K > [!faq] ❓ <font color="#c00000">为什么根服务器只有 13 个 IP 地址?</font> > > 在早期协议中,DNS 响应需要适应 UDP 的数据包大小限制(512 字节),要让**所有根服务器的 IP 地址**都能容纳在一个数据包中而**避免切片**,就只能放得下 13 个 IP 地址。(13 个 IP 地址共 `13*32=416` 字节,剩下 96 字节为协议信息等) > > **保持 DNS 响应小于 512 字节的限制可以避免在网络传输过程中的数据包分片**。分片会增加数据传输的复杂性,并可能导致更高的丢包率,影响 DNS 解析的可靠性。 > ### 顶级域 DNS 服务器 每个顶级域(如 `.com`, `.org`,`.net`以及 `.cn`,`.uk`,`.jp` 等) )都对应一个**顶级域服务器**, 其**管理某一特定顶级域下的所有域名信息**,**==负责返回下一层级的权威 DNS 服务器的地址==**。 ### 权威 DNS 服务器 权威 DNS 服务器**记录了其管辖范围内的域名和 IP 地址的对应关系**,位于 DNS 域名解析过程的最后一步,其**查询到的域名对应的 IP 地址作为最终结果==返回给本地 DNS 服务器,再由其返回给用户设备==。 ### 本地 DNS 服务器 本地 DNS 服务器:**用户端==请求域名解析==时所访问 DNS 服务器**。 本地 DNS 服务器通常会**缓存常用域名对应的 IP 地址**,以加快响应、减少每次用户请求时必须执行的步骤数量。 当本地 DNS 服务器收到用户端的域名解析请求时: - 若其**缓存有域名对应的 IP 地址**,则**直接该 IP 地址**; - 若其**未缓存请求的域名**,其会**首先向==根 DNS 服务器== 发起请求,而后依次==向各层级 DNS 服务器发起多次查询==**,得到最终 IP 地址后再返回给用户端。 本地 DNS 服务器通常以下列方式存在: - **由互联网服务运营商 ISP 提供**——ISP 通常会**为接入互联网的用户自动分配一个 DNS 服务器地址**; - **企业或教育机构**等大型网络中的**内部 DNS 服务器**; - **第三方提供的公共 DNS 服务**——如 Google DNS(`8.8.8.8` 和 `8.8.4.4` )、百度 DNS、阿里 DNS 等等。 ## 常用公共 DNS 服务器的 IP 地址 | DNS 服务器 | IPv4 | IPv6 | | ---------- | ----------------- | ------------------------------------------- | | 114DNS | 114.114.114.114 | | | 阿里 DNS | 223.5.5.5 | | | 百度 DNS | 180.76.76.76 | 2400:da00:: 6666 | | Google DNS | 8.8.8.8; 8.8.4.4 | 2001:4860:4860:: 8888; 2001:4860:4860:: 8844 | <br><br><br> # DNS 服务器中的记录表 DNS 服务器保存有如下的**记录表** [^4](P36),通过查表来**响应域名解析请求**。 ![[_attachment/02-开发笔记/07-计算机网络/应用层/DNS 相关.assets/IMG-DNS 相关-61C25A06903591D494F2E44ABB42B6E4.png|545]] ## DNS 记录类型 上表 "记录类型" 字段中,可选值如下: - **==A 记录==**(Address Record) - 用于将域名解析为**IPv4 地址**,如将`item.taobao.com`指定到`115.238.23.xxx`。 - A 记录可以**将多个域名解析到一个 IP 地址**,但是不能将一个域名解析到多个 IP 地址 - **AAAA 记录**(IPv6 Address Record) - 用于将域名解析为**IPv6 地址**,例如 `example.com` → `2606:2800:220:1:248:1893:25c8:1946`。 - **CNAME 记录**(Canonical Name Record) - 即**别名解析**,将一个域名解析为另一个域名(别名)。 - 可以为一个域名设置一个或者多个别名,如将 `aaa.com` 解析到 `bbb.net`、将 `ccc.com` 也解析到 `bbb.net`,其中 `bbb.net` 就是二者的别名。 - **MX 记录**(Mail Exchange Record) - 指定处理电子邮件的邮件交换服务器及其优先级。 - **==NS 记录==**(Name Server Record) - 指定**某个域名该由哪些 DNS 服务器**来解析。 - **PTR 记录**(Pointer Record) - 用于**反向 DNS 查找**,将 IP 地址解析为域名,例如: `34.216.184.93.in-addr.arpa` → `example.com` - **TXT 记录**(Text Record) - 存储任意文本信息,用于为某个主机名或域名设置说明,如可以为 `ddd.net` 设置 TXT 记录为 "这是 XXX 的博客"。该记录常用于验证域名所有权、电子邮件 SPF 记录等。 - **SRV 记录**(Service Record) - 用于指定提供特定服务的服务器及其端口号和优先级。例如 ` _ldap._tcp.example.com` → `server.example.com` - **SOA 记录**(Start of Authority Record) - 用于表示授权 DNS 区域的起始点,包含关于区域的重要信息,如 DNS 管理员的联系方式、区域更新频率等。 <br><br><br> # DNS 域名解析服务 **DNS 域名解析服务**——由 DNS 服务器提供,**以供查询 "域名" 对应的 IP 地址**。 ### 需求场景 最典型的应用场景:**网站访问** - 用户在浏览器**输入一个域名并尝试访问**时,其**设备会向 DNS 服务器发送查询请求**。 - **DNS 服务器查询其数据库,找到与该域名对应的 IP 地址**,返回给用户设备。 - 客户端浏览器根据得到的 IP 地址,连接到目标服务器并进行通信。 ![image-20230910113504287|432](_attachment/02-开发笔记/07-计算机网络/应用层/DNS%20相关.assets/IMG-DNS%20相关-941C2D21BB50887797D1790609A49223.png) ## DNS 域名解析工作流程 用户在其设备上输入一个域名后,DNS 域名解析过程及步骤顺序如下 - **检查==本机缓存==**,若存在缓存则直接返回 IP 地址,否则再请求本地 DNS 服务器进行域名解析 - **浏览器 DNS 缓存** - **系统本地 DNS 缓存** - **本机 `hosts` 文件** - **请求==本地 DNS 服务器==**,若域名有效则将获得对应的 IP 地址。 - 若其**缓存有域名对应的 IP 地址**,则**直接该 IP 地址**; - 若其**未缓存请求的域名**,其会**首先向==根 DNS 服务器== 发起请求,而后依次==向各层级 DNS 服务器发起多次查询==**,得到最终 IP 地址后再返回给用户端。 ![[02-开发笔记/07-计算机网络/应用层/DNS 相关#^bl0id3]] 完整流程示意图如下: ![image-20231229115010539|911](_attachment/02-开发笔记/07-计算机网络/应用层/DNS%20相关.assets/IMG-DNS%20相关-39DA042BB68132096D3A22BF18333ACF.png) 客户端**请求==本地 DNS 服务器==进行域名解析的流程**,如下图所示: ![image-20231228231500912|719](_attachment/02-开发笔记/07-计算机网络/应用层/DNS%20相关.assets/IMG-DNS%20相关-C58EDEDFD2FB9609600759AA514B1C94.png) <br><br><br> # DNS 缓存 DNS 缓存存在于多个地方[^3],包括: - **浏览器等应用程序中的 DNS 缓存** - **操作系统上的本地 DNS 缓存** - **`hosts` 文件中的静态配置** - **本地 DNS 服务器上的缓存** > [!NOTE] 除 `hosts` 静态配置以外的其他 DNS 缓存,其**缓存记录都有时效限制**,**过期==自动清除==** > > - 若缓存时效太长,**一旦域名被解析到的 IP 有变化,会导致被客户端缓存的域名无法解析到变化后的 IP 地址**,导致无法访问网站。 > - 若缓存时效太短,**会导致请求域名解析的次数更加频繁**。 > > <br> ## 浏览器中的 DNS 缓存 浏览器会**缓存==访问过的域名==及其对应的 IP 地址**。 当用户访问一个网址时,**浏览器首先检查其 DNS 缓存中是否已经有该网站的 IP 地址**。 ##### 时效限制 **浏览器中的 DNS 缓存有时效限制**(通常是几分钟到几小时),**通过 TTL 属性指定**,在 TTL 过期之后,记录会被删除。 ##### 缓存清理 这一缓存**可通过浏览器设置或访问特殊 URL** 进行**手动清理**。 例如,Chrome 中**访问 `chrome://net-internals/#dns` URL** 可以清理浏览器缓存的 DNS。 > 此外,服务器在响应头设置了 `Connection: keep-alive` 之后,客户端会跟服务器保持长连接,只要长连接不断开,页面在请求的时候就不会重新解析域名。 <br> ## 本地 DNS 缓存 操作系统中存储有**本地 DNS 缓存**,用于**保存==最近"解析过"的域名==和对应的 IP 地址**。 当 OS **向 DNS 服务器请求域名解析**并获得响应后,就会**将该条记录存储在系统本地 DNS 缓存中**。 这一缓存**存在于操作系统层面**,是网络配置的一部分。 本地 DNS 缓存的时效**由 DNS 记录的 TTL(Time To Live)值决定**,这一值由远端 DNS 服务器指定。一旦 TTL 到期,记录将被从缓存中自动清除。 ##### 查看/清空系统本地 DNS 缓存 - Window 上: - `ipconfig /displaydns` 命令可**查看本地 DNS 缓存以及 host 中静态配置的映射**。 - **显示结果包括 "系统本地 DNS 缓存的条目" 以及"hosts"文件中静态配置的映射** - `ipconfig /clushdns` 命令可清空本地 DNS 缓存 - Linux 系统可能没有统一的本地 DNS 缓存,这取决于是否运行了 nscd(名称服务缓存守护进程)或类似服务。 > [!NOTE] `ipconfig /displaydns` 命令显示内容包括**本地 DNS 缓存以及 host 中静态配置的映射** > > ![image-20231229124730845|641](_attachment/02-开发笔记/07-计算机网络/应用层/DNS%20相关.assets/IMG-DNS%20相关-621F01EC5700E934344E80ED0524CC88.png) > > ![image-20231229124737062|502](_attachment/02-开发笔记/07-计算机网络/应用层/DNS%20相关.assets/IMG-DNS%20相关-3CB05BBE8794AFD67B1C0D4E688D877F.png) <br> ## hosts 文件中的静态配置 "hosts" 文件是操作系统用于**存储静态域名到 IP 地址映射的系统文件**,是操作系统网络栈的一部分。 "hosts" 文件中的更改 **==不受 DNS 缓存刷新或 TTL 的约束==**,是 **==静态配置==**。 当用户访问一个网站时,**如果浏览器缓存和系统本地 DNS 缓存中都未找到条目,则系统将检查 "hosts" 文件**。 要**确保 hosts 文件中的更改立即生效,应当清空浏览器 DNS 缓存以及系统中本地 DNS 缓存**(例如使用`ipconfig /flushdns` 命令)。 #### hosts 文件路径 - Windows 下:通常位于 `C:\Windows\System32\drivers\etc\hosts` - Unix 和类 Unix 下:通常位于 `/etc/hosts` #### hosts 文件格式 "hosts" 文件的基本格式是**每行一个条目**,将一个域名映射到一个 IP 地址,二者之间由**至少一个空格分隔**,如: ```txt 140.82.114.3 github.com ``` #### hosts 文件的作用 1. **域名解析** 2. **==屏蔽网站==**:可用来**阻止访问特定网站**,方法是**将不想访问的网站域名映射到无效的 IP 地址**(如 `127.0.0.1`,即 localhost)。 3. **==绕过 DNS==**:提供了一种**绕过常规 DNS 解析**的方式,可以在 DNS 服务不可用或不稳定时使用。 4. **网络测试和开发**:开发人员经常使用 "hosts" 文件来测试网站,而无需更改 DNS 设置。这对于模拟网站在不同服务器上的行为非常有用。 ## 本地 DNS 服务器中的缓存 - 本地 DNS 服务器会缓存其查询过的域名-IP 映射对,这一缓存具有 TTL 属性,在到期后就会被清理。 - 本地 DNS 服务器也会 **==缓存 TLD 服务器的 IP 地址==**,因此**允许本地 DNS 服务器绕过查询链中的根服务器**。实际上,由于该缓存,**除了少数 DNS 查询以外,根服务器都被绕过了**。 # DNS 报文 略,参见《计算机网络:自顶向下方法》P87 <br><br><br> # Buffer ## 闪念 > sudden idea ## 候选资料 > Read it later # 参考资料 # Footnotes [^1]: [什么是DNS?为什么全球DNS 根服务器只有13台?给中国一台真的很难吗?-云社区-华为云](https://bbs.huaweicloud.com/blogs/379091) [^2]: [DNS根服务器是一种什么样的存在?](https://www.zhihu.com/question/24651682) [^3]: [DNS域名详细解析过程(最全面,看这一篇就够)\_dns解析-CSDN博客](https://blog.csdn.net/bangshao1989/article/details/121913780) [^4]: 《网络是怎样连接的》