找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3317

积分

0

好友

457

主题
发表于 17 小时前 | 查看: 3| 回复: 0

本文详细介绍了 DNS 相关知识,包括 DNS 工作原理、如何提升域名解析速度、以及 DNS 记录与报文等内容。

1. 域名与域名服务器

我们在日常上网时,为了方便记忆,总是习惯在浏览器里输入网站的域名,而不是一串枯燥的IP地址。比如,访问百度我们会输入 www.baidu.com,而不是 202.108.22.5(或者百度网站的其他 IP 地址)。

但计算机网络通信真正识别和依赖的标识却是IP地址,因为它能提供主机在互联网中的确切位置信息,并且长度固定,更利于路由器等网络设备的快速处理。

域名与IP地址对应关系示意图

为了平衡人类的易记性与计算机的易处理性,DNSDomain Name System,域名系统)应运而生。它的核心任务,就是根据域名查出对应的 IP 地址

我们先来了解下域名和域名服务器的基本概念。

域名由若干个英文字符串组成(不区分大小写),各字符串之间用点号『.』分隔,越靠右的字符表示域名级别越高。
以百度域名 www.baidu.com 为例,其中 com 是顶级域名(一级域名),baidu 是二级域名,www 是三级域名。

域名层级结构示意图

域名服务器(也称为 DNS 服务器)则负责存储域名和 IP 地址的映射关系。当我们需要访问某个网站时,只需向域名服务器查询其域名对应的 IP 地址即可。

DNS基础查询示意图

由于全球域名数量极其庞大,如果全部集中存放在一台服务器上,不仅查询效率低下、服务器压力巨大,服务的可靠性也无法保障。因此,DNS 采用了分布式设计,大量的域名服务器通过层次化方式组织,分布在全球各地

通常,域名服务器可以分为以下四类:

  • 根域名服务器:最高层级的域名服务器,全球共有 13 组(以英文字母 A 到 M 依序命名,格式为[a~m].root-servers.net),每个根域名服务器都知道所有顶级域名服务器的 IP 地址,例如知道负责 .com 域的顶级域名服务器的地址。
  • 顶级域名服务器:负责管理特定的顶级域名,如 .com.org.edu 等。顶级域名服务器知道其所管理的所有权威域名服务器的 IP 地址,比如负责 .com 域的服务器知道负责 baidu.com 域的权威域名服务器的地址。
  • 权威域名服务器:网站的域名和 IP 地址最终会注册到其所属域的权威域名服务器中。例如,www.baidu.com 的映射关系就存储在负责 baidu.com 域的权威域名服务器中。
  • 本地域名服务器:它不属于上述层次结构,但对 DNS 解析至关重要。每个 ISP(如学校、公司)或网络都会有一个本地域名服务器(也叫默认域名服务器),它作为用户主机查询的“第一站”,具体作用我们下一节详述。

DNS服务器层级结构图

2. 域名解析流程

了解了基础概念后,我们来看一个具体的域名解析流程。以在浏览器输入百度域名 www.baidu.com 为例,看看我们的电脑究竟是如何得到其 IP 地址的。

一个完整的、未使用缓存的迭代查询过程通常如下(图中包含推广信息的图片已根据规则删除):

  1. 请求主机向本地域名服务器发送 DNS 查询报文,询问 www.baidu.com 的 IP 地址是什么;
  2. 本地域名服务器将此查询报文转发到根域名服务器
  3. 根域名服务器发现要查询的顶级域名为 .com,于是向本地域名服务器返回响应报文,报文中封装了负责 .com 域的顶级域名服务器的 IP 地址列表;
  4. 本地域名服务器收到响应后,选择其中一个顶级域名服务器的 IP 地址,并向其发送查询报文;
  5. 顶级域名服务器发现要查询的二级域名为 baidu,于是向本地域名服务器返回响应报文,报文中封装了负责 baidu.com 域的权威域名服务器的 IP 地址列表;
  6. 本地域名服务器收到响应后,选择其中一个权威域名服务器的 IP 地址,并向其发送查询报文;
  7. 权威域名服务器查询自身数据库,找到 www.baidu.com 的 IP 地址,并将此信息封装为响应报文,发送给本地域名服务器
  8. 本地域名服务器将最终得到的 IP 地址响应报文发送给原请求主机。至此,我们的主机知道了百度的 IP 地址,DNS 查询过程结束。

在这个过程中,请求主机与本地域名服务器之间的交互称为递归查询,而本地域名服务器与根、顶级、权威服务器之间的交互称为迭代查询

你可能会问:请求主机是如何知道本地域名服务器的 IP 地址的?
答案是:当电脑通过网线或 WiFi 连接到网络时,不仅会通过 DHCP 协议自动获取一个 IP 地址,同时也会获取到本地域名服务器的 IP 地址。

那么,本地域名服务器又是如何知道根域名服务器的 IP 地址的呢?
全球 13 组根域名服务器的 IP 地址是长期固定不变的,因此它们被直接“写死”在了操作系统或本地域名服务器的配置中,每台设备都能轻易找到它们。

注意到没有?为了解析一个百度的域名,竟然要发送 8 份 DNS 报文。如果每次访问网站都经历这样漫长的“寻址之旅”,上网体验将大打折扣。因此,必须有一些机制来提升域名解析的速度。

3. 提升域名解析速度

(1)传输协议的选择:TCP or UDP?

我们都知道,TCP 比 UDP 更可靠,但开销大、速度更慢

UDP与TCP协议特性对比表

DNS 该如何选择传输层协议呢?

  • 如果用 TCP,需要三次握手、拥塞控制,解析速度会非常慢。
  • 如果用 UDP,万一丢包了,域名解析失败,网站就打不开了。

实际上,DNS 主要使用 UDP 协议,端口号为 53,只在特殊情况下使用 TCP

为什么主要用 UDP?因为绝大多数 DNS 查询和响应报文都很小,可以装在一个 UDP 数据报中(通常限制为 512 字节)。既然只有一个包,就无需像 TCP 那样维护复杂的连接状态,直接在应用层处理超时和重传即可,这样效率更高。

那么,什么时候会用 TCP 呢?主要有两种情况:

  1. 当响应报文太大,超过 512 字节时,服务器会在报文中设置 TC(Truncated,截断)标志位,并只返回前 512 字节。客户端收到后,会改用 TCP/IP 协议重新发起查询,以获取完整响应。
  2. 在进行区域传输时(例如,辅助域名服务器从主域名服务器同步数据),由于传输的数据量较大,会使用 TCP 协议以保证可靠性。

(2)善用 DNS 缓存

即便使用 UDP,每次都从根服务器开始层层查询,速度仍然不理想,且会给高层级服务器带来巨大压力。

为了提升速度并减轻服务器负载,DNS 广泛使用了缓存技术。
当用户访问某个网站后,本地域名服务器会将解析出的域名与 IP 映射关系缓存一段时间(由资源记录中的 TTL 决定)。在缓存有效期内,如果同一用户或其他用户再次查询该域名,本地域名服务器就可以直接返回缓存的结果,无需再走一遍完整的迭代查询流程,这极大地减少了网络中的 DNS 报文数量。

实际上,缓存不仅存在于本地域名服务器,在用户的操作系统中也有 DNS 缓存。例如,在 Windows 系统上,访问百度后,可以通过 ipconfig /displaydns 命令查看当前缓存:

Windows系统DNS缓存查询结果示例

缓存虽好,但需注意一致性问题。因为网站的 IP 地址可能会变更,如果缓存时间过长,用户可能会拿到过期的 IP。因此,DNS 记录的 TTL 值不能设置得太大。在 Windows 上,你可以用 ipconfig /flushdns 命令来手动清空本机 DNS 缓存。

(3)选择合适的本地域名服务器

在进行域名解析时,主机首先向本地域名服务器发起递归查询。如果这台本地域名服务器本身性能不佳、网络延迟高或者缓存策略不好,就会成为整个上网过程的瓶颈。因此,选择一个响应速度快、稳定的本地域名服务器,是提升“冲浪”体验的有效方法之一

默认情况下,我们的电脑会通过网络自动获取一个 DNS 服务器地址。如果你想手动更换,以 Windows 为例,可以通过 控制面板 -> 网络和 Internet -> 网络和共享中心 -> 更改适配器设置 -> 右键“以太网”或“WLAN”选择属性 -> 双击“Internet 协议版本 4 (TCP/IPv4)” 来修改。

Windows系统TCP/IPv4属性设置窗口

互联网上有一些知名的公共 DNS 服务器,它们通常速度快、稳定性高,可以作为备选:

首选 DNS 服务器地址 备用 DNS 服务器地址
阿里 223.5.5.5 223.6.6.6
腾讯 (DNSPod) 119.29.29.29 182.254.116.116
百度 180.76.76.76
谷歌 8.8.8.8 8.8.4.4
114DNS 114.114.114.114 114.114.115.115

通常情况下,自动获取的本地 DNS(通常是你路由器的地址)由于物理距离近,速度已经很快。但如果你感觉网页打开缓慢,排除其他因素后,尝试更换为上述公共 DNS,或许会有意想不到的改善。

4. DNS 记录和报文

域名服务器里存储的不仅仅是简单的域名到 IP 的映射,而是一种称为资源记录(Resource Record, RR)的结构化数据。

一条资源记录通常包含四个字段:Name, Value, Type, TTL

  • TTL 是记录的生存时间,决定了该记录可以被缓存多久(单位:秒)。
  • NameValue 的含义根据 Type 的不同而变化,常见的类型有:
    • Type = AName 是主机名或域名,Value 是对应的 IPv4 地址。例如:(www.example.com, 93.184.216.34, A, 86400)
    • Type = NSName 是一个域(如 baidu.com),Value 是负责该域解析的权威域名服务器的主机名。例如:(baidu.com, ns1.baidu.com, NS, 172800)。这条记录是 DNS 层级查询的关键。

简单来说:如果一台服务器是某个域(如 example.com)的权威服务器,它就会保存该域下所有主机的 A 记录。如果一台服务器不是该域的权威服务器(例如,它是某个 ISP 的本地 DNS 服务器),但它需要告诉查询者“该去找谁”,那么它就会保存一条 NS 记录,以及这条 NS 记录中 Value 所指域名服务器的 A 记录(用于获取其 IP 地址)。

权威与非权威域名服务器记录示例图

接下来,我们看看 DNS 报文的具体格式。DNS 报文分为查询报文响应报文,二者结构相同:

DNS报文格式结构图

报文主要包含以下几个部分:

  • 事务 ID:16位标识符,用于匹配查询与响应。
  • 标志:包含若干标志位,例如 QR(0 为查询,1 为响应)、TC(截断标志)、RD(期望递归)等。
  • 数量字段:分别指明后面的问题回答权威附加部分各有多少条记录。
  • 问题区域:包含要查询的域名和查询类型(如 A 记录、MX 记录等)。
  • 回答区域:包含对查询问题的直接回答(资源记录)。
  • 权威区域:包含指向更权威域名服务器的资源记录(NS 记录)。
  • 附加区域:包含一些“锦上添花”的信息,例如权威域名服务器对应的 IP 地址(A 记录)。

最后,我们通过 Wireshark 抓包工具来看一个实际的 DNS 查询与响应例子:

查询报文:
DNS查询报文Wireshark抓包详情

响应报文:
DNS响应报文Wireshark抓包详情

从抓包中我们可以清晰地看到事务 ID (0xe258) 的对应关系,以及响应报文中返回的 IP 地址 (93.184.216.34) 和 TTL (300 秒) 等信息。

希望这篇关于 DNS 的详解,能帮助你更好地理解我们在浏览器中输入网址后,背后那套复杂而精妙的寻址系统是如何工作的。如果你想深入讨论更多网络技术细节,欢迎在云栈社区与大家交流。




上一篇:从零备战Java后端校招:非科班无实习如何斩获大厂Offer
下一篇:深度解析:从URL输入到页面显示,浏览器背后的七步核心流程
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-28 23:37 , Processed in 0.387371 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表