TCP/IP提供了通过 IP地址 来连接到设备的功能,但对用户来讲,记住某台设备的IP地址是相当困难的,因此专门设计了一种字符串形式的主机命名机制,这些主机名与IP地址相对应。在IP地址与主机名之间需要有一种转换和查询机制,提供这种机制的系统就是域名系统DNS(Domain Name System)。
为什么要有DNS?
互联网中,一台计算机与其他计算机通信时,通过 IP地址 唯一的标志自己。此时的IP地址就类似于我们日常生活中的电话号码。但是,这种纯数字的标识是比较难记忆的,而且数量也比较庞大。例如,每个IPv4地址是一个32位长的二进制数字,或者采用点分十进制展示成192.168.1.1这种格式,有接近43亿个的IPv4地址。DNS的作用就是将人类可读的名称转换为机器识别的IP地址,供计算机相互连接。DNS的工作原理和电话簿相似,都是管理名称和数字之间的映射关系。就像我们日常打电话,一般使用人名查找,很少直接输入电话号码一样。当我们上网打开某个网页、视频时,也很少直接使用IP地址,而是在浏览器里输入的URL地址,例如:https://www.huawei.com,这其实使用的就是计算机的名字,一般称为域名。
域名的构成
最初设备的域名由字符序列组成、所有设备的域名组成一个未分级的域名结构。未分级的域名结构存在命名冲突、管理维护复杂的缺点。因此,TCP/IP把DNS的域名设计成了分级的树状结构。每个申请加入Internet的国家都要向NIC注册一个顶级域名,顶级域采用组织模式和地理模式的划分模式,如cn代表中国、us代表美国等。
常见的顶级域名如下表所示。NIC将顶级域的管理权分派给由其指定的管理机构,由这些管理机构再对被授权管理的域继续进行划分,从而形成了二级域。负责划分二级域的管理机构可以授权其下属的管理结构,由它们继续划分域。由此下去,便形成了层次型的Internet域名体系结构。
| 顶级Internet域名 | 含义 |
|---|---|
| com | 商业组织 |
| edu | 教育机构 |
| gov | 政府机构 |
| mil | 军事部门 |
| net | 主要网络支持中心 |
| int | 国际组织 |
| org | 其他组织 |
| 国家代码 | 国家(按照地理模式划分) |
从语法上讲,每一个域名都是有标号序列组成,而各标号之间用点(小数点)隔开。以www.huawei.com域名为例,从右到左依次是:
- com:顶级域名。代表商业组织。
- huawei:二级域名,归属于某个公司自己的域名。
- www:三级域名,表明某个公司提供的是什么服务,www代表普通网页。
DNS服务器、DNS客户端和DNS中继
网络中与DNS相关的设备角色包括DNS服务器、DNS客户端和DNS中继。
DNS服务器
DNS服务器是将域名指向对应IP地址的服务器。DNS服务器中保存了一张域名和与之相对应的IP地址的表,以解析消息的域名。
由于互联网连通的是全球资源,单一的域名服务器不足以支撑全部的地址转换操作,因此全球有多套域名服务器相互配合使用。
域名是分层结构,域名DNS服务器也是对应的层级结构。通过根域名服务器,依次请求顶级域名服务器和权威域名服务器,最终获取对应IP地址,并将该结果保存在本地域名服务器,以待下次DNS请求使用。当用户再次对同一域名发起访问时,可以直接从本地域名服务器获得结果,无需再次发起全球递归查询。
表1-2 DNS服务器的分类
| 分类 | 作用 |
|---|---|
| 根DNS服务器 | 根DNS服务器是最高层次的域名服务器,它知道所有顶级服务器的域名和IP地址,当本地域名服务器无法对域名进行解析时,首先对根域名服务器发起请求。 |
| 顶级域名服务器 | 顶级域名服务器负责管理该服务器下的所有二级域名,当收到DNS查询请求时,就会给权威域名服务器相应的回答。 |
| 权威域名服务器 | 负责某一个区域的域名服务器。当一个顶级域名服务器还不能给出最后查询回答时,就会告知下一步应当请求的权威域名服务器。 |
| 本地域名服务器 | 当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。每一个互联网服务提供者ISP都可以拥有一个本地域名服务器。当本地域名服务器无法给出应答时,就会请求最高级的根域名服务器。 |
DNS客户端
DNS客户端的作用是接收用户程序(User Program)的DNS请求,并对其作出回应。作为DNS客户端的设备上一般具备以下能力:
- 启动DNS解析 要使用DNS客户端功能,需要在设备上打开DNS解析的开关。
- 指定服务器的IP地址 要进行DNS域名解析,需要在设备上指定DNS服务器的IP地址。这样才能把查询请求发动到正确的DNS服务器上进行解析。
- 指定DNS域后缀搜索列表 DNS客户端所访问的一些服务器或主机的域名后缀往往都是相同的。用户可以预先设置一些域名后缀,在域名解析的时候,用户只需要输入域名的部分字段,系统会自动将输入域名加上不同的后缀进行解析。例如,用户想查询域名“huawei.com”,那么可以在后缀列表中配置com,然后输入“huawei”,系统会自动将输入域名与后缀连接成“huawei.com”进行查询。
DNS中继
当DNS服务器的IP地址发生变化时,用户网络中每个DNS客户端上的配置都需要改变,这样工作量极大并且容易出错。此时,可以通过部署DNS中继解决该问题。DNS客户端上配置DNS中继的IP地址,DNS服务器的IP地址在DNS中继上配置。之后,DNS客户端会将DNS请求报文直接发送给DNS中继,由DNS中继将收到的DNS请求报文转发至DNS服务器。由此,当DNS服务器的IP地址发生变化时,仅需改变DNS中继上的配置即可,简化了网络管理。
DNS中继的工作原理
- DNS客户端将DNS请求报文发送给DNS中继,即请求报文的目的地址为DNS中继的IP地址。
- DNS中继收到请求报文后,将报文转发给DNS服务器,通过DNS服务器进行域名解析。
DNS域名解析过程
通过域名获取对应IP地址的过程称为域名解析。DNS域名解析分为以下两种方式:
- 静态域名解析 静态域名解析是通过静态域名解析表进行的,即手动建立域名和IP地址之间的对应关系表,该表的作用可以将一些常用的域名放入表中。当DNS客户端需要域名所对应的IP地址时,即到静态域名解析表中去查找指定的域名,从而获得所对应的IP地址,提高域名解析的效率
- 动态域名解析 动态域名解析需要专用的域名解析服务器(DNS服务器)运行域名解析服务器程序,提供从域名到IP地址的映射关系,负责接收客户提出的域名解析请求。
为提高查询速度,在解析域名时,首先采用静态域名解析的方法,如果静态解析不成功,再采用动态域名解析的方法。
DNS的工作过程如下:
- 用户程序(如ping、telnet等)使用域名访问网络时,首先向DNS客户端的地址解析器发出DNS请求。
- 地址解析器收到DNS请求后,首先查询本地域名缓存。
- 如果本地域名缓存中存在该域名对应的映射表项,地址解析器就直接将域名对应的IP地址返回给用户程序。
- 如果本地域名缓存中不存在所要查找的映射表项,地址解析器就向DNS服务器发送查询请求报文。
- DNS服务器收到查询报文后,首先判断请求的域名是否处于自己被授权管理的子域里,再根据不同的判断结果,向DNS客户端发送相应的响应报文。
- 如果请求的域名在自己被授权管理的子域范围之内,该DNS服务器首先从自己的数据库中查找域名对应的IP地址。
- 如果请求的域名不在自己被授权管理的子域范围之内,该DNS服务器就将请求交给上一级的DNS服务器处理。DNS服务器完成解析后,将解析的结果返回给DNS客户端。
- DNS客户端的地址解析器接收并解析DNS服务器发回来的响应报文,将解析结果返回给用户程序。
每次动态解析成功的域名与IP地址的映射均存放在动态域名缓存区中,当下一次查询相同域名的时候,就可以直接从缓存区中读取,不用再向域名服务器进行请求。缓存区中的映射在一段时间后会被老化删除,以保证及时从域名服务器得到最新的内容。
DDNS客户端
利用DNS可以将域名解析为IP地址,从而实现使用域名来访问网络中的节点。但是,DNS仅提供了域名和IP地址之间的静态对应关系,当节点的IP地址发生变化时,DNS服务器无法动态地更新域名和IP地址的映射关系。此时,如果仍然使用域名访问该节点,通过域名解析得到的IP地址是错误的,从而导致访问失败。动态域名系统DDNS(Dynamic Domain Name System)用来动态更新DNS服务器上域名和IP地址之间的映射关系,保证通过域名解析到正确的IP地址。
PC需要通过域名访问提供应用层服务的设备DeviceA。DeviceA接入Internet的接口从网络运营商动态获取IP地址,由于每次获取到的IP地址不同,导致域名和IP地址的对应关系会发生变化。而传统的DNS无法动态更新域名和IP地址的对应关系,这就会导致PC访问DeviceA失败。此时,可通过部署DDNS服务器来解决该问题。
- DeviceA作为DDNS客户端,当IP地址变化时,向DDNS服务器发送更新域名和IP地址映射关系的DDNS更新请求。
- DDNS服务器接收到DDNS客户端的DDNS更新请求后,负责通知DNS服务器动态更新域名和IP地址之间的映射关系。从而保证即使设备的IP地址改变,Internet用户仍然可以通过同样的域名访问设备。
常见考点
DNS(Domain Name System)解析是前端工程师在网络性能优化、安全、浏览器请求流程等面试方向中不可忽视的知识点。
一、基础概念考察
| 考点 | 说明 |
|---|---|
| DNS 是什么? | 域名系统,用于将域名解析为 IP 地址 |
| 为什么需要 DNS? | 因为人记域名更方便,而网络通信需要 IP |
| DNS 的作用 | 类似“互联网电话簿”,域名 ↔ IP 映射 |
| DNS 属于哪个协议 | 应用层协议,默认使用 UDP(53 端口) |
二、DNS 解析流程(重点)
DNS 解析过程通常包含以下步骤:
- 浏览器缓存查询
- 操作系统缓存查询
- hosts 文件查询
- 本地 DNS 服务器(ISP 提供)查询
- 根域名服务器(.
.)返回顶级域名服务器地址 - 顶级域名服务器返回权威域名服务器地址
- 权威域名服务器返回目标域名对应 IP
- 本地 DNS 服务器将结果缓存并返回
递归查询 与 迭代查询:
- 递归查询:客户端向本地 DNS 请求,期望拿到最终 IP,其他查询步骤由 DNS 服务器完成。
- 迭代查询:DNS 服务器自己一步步查找其他服务器来获取结果。
三、DNS 缓存机制考察
| 缓存位置 | 特点 |
|---|---|
| 浏览器缓存 | 优先读取,缓存时间受 DNS TTL 控制 |
| 系统缓存 | 如 macOS 的 dscacheutil、Windows 的 DNS 缓存 |
| 本地 DNS 缓存 | 运营商提供,缓存命中高,减少外部请求 |
相关字段:
- TTL(Time To Live):DNS 记录生存时间,影响缓存有效期
四、DNS 查询性能优化(常考)
| 技术/策略 | 说明 |
|---|---|
| DNS 预获取 | <link rel="dns-prefetch" href="//example.com">,提前解析域名 |
| preconnect | <link rel="preconnect" href="https://example.com">,提前建立连接(包括 DNS + TCP + TLS) |
| 缓存优化 | 提高 DNS TTL,减少频繁解析 |
| 合理分域名访问资源 | 避免过多不同域名导致 DNS 查询阻塞 |
五、DNS 安全考察
| 威胁 | 说明 |
|---|---|
| DNS 劫持 | 恶意篡改解析结果,用户被引导至假冒网站 |
| DNS 投毒 | 缓存伪造 IP,污染 DNS 服务器结果 |
| 防护措施 | 使用 DNSSEC(域名系统安全扩展)验证响应签名;启用 HTTPS-DNS(DoH/DoT)加密 DNS 查询 |
| DoH(DNS over HTTPS) | 将 DNS 查询通过 HTTPS 发送,防止被监听或篡改 |
六、DNS 与前端的关联考察点
| 关联方向 | 说明 |
|---|---|
| 页面首次加载慢 | 可能由于 DNS 查询时间长,可使用 performance.getEntriesByType('resource') 检查 DNS 时间 |
| 域名切换带来的缓存失效 | 资源域名变化会触发新的 DNS 查询和重新建立连接 |
| 第三方资源加载慢 | 如字体、CDN、图标等域名没有预解析 |
| CNAME、CDN 解析过程 | CDN 域名背后也可能经过多次 DNS 跳转解析 |
七、面试常见问题示例
| 问题 | 涉及考点 |
|---|---|
| DNS 是什么?为什么需要它? | 基础原理 |
| DNS 查询的完整流程是怎样的? | 缓存、递归与迭代查询 |
| DNS 查询用的是哪个协议? | UDP(53 端口)为主 |
| 浏览器如何优化 DNS 性能? | DNS 预获取、预连接 |
| 什么是 DNS 劫持?如何防止? | 安全考察 |
| DNS TTL 的作用? | 缓存机制与刷新间隔 |
| 为什么首次加载慢?如何判断是 DNS 问题? | 前端性能分析工具使用 |