了解DNS工作原理有助于深入理解互联网通信的基础机制,对于网络运维、开发以及优化网站访问速度至关重要。它能帮助解决域名解析问题,提升用户体验,同时对于网络安全和防护也具有重要意义。本文博主反反复复、前前后后斟酌了三天,就为了让大家更容易看懂。
1. DNS产生背景
TCP/IP协议要求互联网中的计算机具有唯一的IP地址,并基于IP地址进行通信。然而,直接使用IP地址有很多不便。
- 记忆困难:IP地址由数字组成,对于人类来说记忆起来较为困难。例如,百度的IP地址"36.155.132.3",腾讯QQ网站的IP地址"183.194.238.19"。
- 动态性问题:随着互联网的发展,许多设备(如移动设备)需要频繁地更换IP地址,这给网络管理带来了不便。
为了克服上述问题,1983年,美国国家科学基金会(NSF)引入了域名系统(DNS)作为IP地址的替代方案。
2. 因特网的域名结构
因特网采用了层次树状结构的命名方法。任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名。域名中的『域』是名字空间中一个可被管理的划分,域可以划分为子域(进一步划分为子域的子域),这就形成了顶级域、二级域、三级域等。
域名的结构由标号序列组成,各标号之间用点隔开,格式如下:
... .三级域名.二级域名.顶级域名
3. DNS定义介绍
DNS系统(域名系统)使用易于记忆的字符来表示网络和主机,通过一系列的服务器进行解析,将这些字符转换为对应的IP地址。DNS的引入极大地提高了互联网的可访问性和可管理性,使得互联网能够以更高效、更便捷的方式服务于全球用户。
4. DNS分类介绍
DNS(域名系统)服务器根据其在域名解析过程中的作用和位置,可以分为以下四种类型:
- 根域名服务器
- 顶级域名服务器(简称TLD服务器)
- 权限域名服务器
- 本地域名服务器
本地域名服务器并不属于上图中的层次结构,但它对域名系统同样重要。因为当一个主机发出域名查询请求时,这个查询请求首先会发送给本地域名服务器。
4.1. 根域名服务器(Root Name Server)
负责解析顶级域名(如.com、.org、.net等)的请求。全球共有13个根域名服务器(A~M,其中 A 根是主根,由美国公司 Verisign 管理。B 到 M 根称为辅根,负责同步 A 根的内容。),分别由不同的组织运营。因为历史原因,13个根域名服务器没有一个落在中国。具体的分布信息如下表:
不过我国有几十个根镜像域名服务器,均从根服务器同步过来,由我国自行管理。
随着网络攻击方式的多样化,针对根域名服务器的安全威胁也日益增加。DDoS攻击、缓存投毒、数据篡改等均可能对DNS系统的正常运转造成影响。因此,根域名服务器的运营机构采取了多种措施来增强其安全性。
由于根域名服务器在DNS中的地位特殊,因此对根域名服务器会有许多具体要求,具体可以参阅 RFC 2870。
4.2. 顶级域名服务器(Top-Level Domain Name Server)
顶级域名服务器常简称为TLD服务器,它负责解析特定顶级域名的请求,如.com、.cn、.org等。
每个顶级域名都有一组顶级域名服务器,用于管理在该顶级域名服务器注册的所有二级域名。常用的顶级域名主要有以下两大类:
- 通用顶级域名(gTLD) :gTLD用于表示组织的职能或用途,例如:
- .com:商业公司
- .org:非营利性组织
- .net:网络服务机构
- .edu:教育机构
- .gov:政府部门
- .mil:军事部门
- 国家顶级域名(ccTLD) :ccTLD用于表示特定国家或地区,cc是country code的简写,例如:
- .cn:中国
- .us:美国
- .uk:英国
4.3. 权威域名服务器(Authoritative Name Server)
负责存储和提供某个域名(如baidu.com)的完整信息,即该域名的资源记录(如A记录、MX记录等)。当DNS客户端请求解析某个域名时,会首先查询该域名的权威域名服务器。
4.4. 本地域名服务器(Local Name Server)
在本地网络中运行的DNS服务器,用于解析本地网络内的域名请求。本地域名服务器是电脑解析时的默认域名服务器,即电脑中设置的首选 DNS 服务器和备选 DNS 服务器。常见的有电信、联通、谷歌、阿里等的本地 DNS 服务。
5. 域名解析流程
在不考虑本地DNS缓存(浏览器缓存、操作系统缓存)的情况下,完整的一次域名解析会经过下图中8个步骤。
解析说明:
-
客户端主机将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果。
-
若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向根域名服务器进行查询。
-
根域名服务器是最高层次的,它并不会直接指明这个域名对应的 IP 地址,而是返回顶级域名服务器的地址。
-
本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求;
-
本地域名服务器获取到顶级域名服务器获返回的限威域名服务器的地址;
-
本地域名服务器向权威域名服务器发起请求;
-
本地域名服务器最终得到该域名对应的 IP 地址;
-
本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来。
以上域名解析过程有两种查询方式:
1) 递归查询
递归查询是由客户端发起的,客户端(通常是用户或应用程序)向本地DNS服务器发送一个查询请求,要求本地DNS服务器完成整个查询过程,并将查询结果返回给客户端。
以下是递归查询的基本流程:
- 客户端发起查询请求:客户端向本地DNS服务器发送查询请求。
- 本地DNS服务器响应:如果本地DNS服务器缓存中有查询结果,则直接返回给客户端;如果没有,则开始递归查询。
- 递归查询:本地DNS服务器代替客户端向其他DNS服务器查询,包括根DNS服务器、顶级域名(TLD)服务器和权威DNS服务器。
- 结果返回:一旦找到结果,本地DNS服务器将结果返回给客户端。
递归查询的特点是客户端不需要参与查询过程(只发出请求即可),所有查询工作都由本地DNS服务器完成。
2)迭代查询
迭代查询通常发生在DNS服务器之间。当本地DNS服务器无法直接解析域名时,它会向其他DNS服务器发送迭代查询请求。
以下是迭代查询的基本流程:
- 本地DNS服务器请求:本地DNS服务器向根DNS服务器发送查询请求。
- 根DNS服务器响应:根DNS服务器不会直接返回查询结果,而是返回一个指向下一个可能解析该域名的DNS服务器的IP地址。
- 迭代查询:本地DNS服务器根据根DNS服务器的响应,向下一个DNS服务器发送查询请求。
- 重复迭代:这个过程会重复进行,每次都会向下一个DNS服务器发送请求,直到找到权威DNS服务器。
- 结果返回:一旦找到权威DNS服务器,并获取到查询结果,本地DNS服务器将结果返回给客户端。
迭代查询的特点是本地DNS服务器会逐步引导客户端向其他DNS服务器查询,直到找到最终结果。
6. 扩展:DNS的本地缓存方式及查询顺序介绍
计算机中 DNS 记录在本地有三种缓存方式,即浏览器缓存、操作系统缓存和本地hosts文件,浏览器与非浏览器的查询顺序有略微差异,具体如下:
- 浏览器查询顺序:
浏览器缓存 > 操作系统缓存 > 本地hosts文件 > DNS服务器查询
- 非浏览器查询顺序:比如在CMD命令行中执行ping命令,查询顺序为
本地Hosts文件 > 操作系统缓存 > DNS服务器查询
注:浏览器缓存DNS记录是为了提高网页加载速度,因为浏览器需要频繁解析大量的域名;命令行工具(如ping)更依赖于操作系统的DNS解析顺序,以确保结果的一致性和可控性。
6.1. 浏览器缓存
浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的 DNS 缓存时间,如 Chrome 的过期时间是 1 分钟,在这个期限内不会重新请求 DNS。
6.2. 操作系统缓存
操作系统维护一个DNS缓存,以减少对DNS服务器的查询次数。可以使用以下命令查看和清除操作系统的DNS缓存:
- Windows :
- 查看DNS缓存:
ipconfig /displaydns
- 清除DNS缓存:
ipconfig /flushdns
- 查看DNS缓存:
- Linux :
- 查看DNS缓存:
sudo systemd-resolve --statistics
- 清除DNS缓存:
sudo systemd-resolve --flush-caches
- 查看DNS缓存:
举例 :Windows环境下使用命令ipconfig /displaydns
查询本机的DNS缓存。执行上述命令后,你会看到以下信息:
- 记录名称:查询的 DNS 名称及其相关记录,比如地址;
- 记录类型:表示记录类型的数字,每种 DNS 协议都有一个对应的数字;
- 生存时间:缓存条目的有效期(TTL 秒数);
- 数据长度:数据的字节长度,例如 IPv4 地址是 4 个字节,IPv6 地址是 16 个字节;
- 部分:查询的答案;
- XXX 记录:记录类型的规范名称。
6.3. 本地hosts文件
用户自己本机配置的 hosts 文件:
- Windows :
C:\Windows\System32\drivers\etc\hosts
- Linux :
/etc/hosts