DNS(Domain Name System,域名系统)
1. 核心定位与价值
DNS 是 TCP/IP 协议栈中应用层的分布式域名解析系统 ,核心作用是将人类易记的域名(如www.baidu.com)映射为计算机可识别的 IP 地址(如 115.239.210.27) 。
TCP/IP 通信依赖 IP 地址定位主机,但 IP 地址(如 203.0.113.10)无意义、难记忆,而域名(如www.google.com)具备语义化、易传播的特点。DNS 本质是 "互联网的地址簿",解决了 "IP 难记、域名难解析" 的矛盾。
2. 发展背景:从 hosts 文件到 DNS 系统
在 DNS 出现前,网络依赖hosts文件管理域名与 IP 的映射:
- 原理:每台主机本地存储一个文本文件,记录 "主机名 - IP" 对应关系(如
host-a 172.20.2.1); - 弊端:
- 扩展性差:新主机接入或 IP 变更需手动更新所有主机的 hosts 文件;
- 维护成本高:依赖中心机构(SRI-NIC)统一管理,更新不及时。
为解决这些问题,DNS 系统应运而生:
- 分布式管理:每个组织自行维护内部 "域名 - IP" 映射,注册到 DNS 数据库;
- 自动查询:用户输入域名时,主机自动向 DNS 服务器查询,无需手动更新本地文件;
- 兼容性保留:至今主机仍保留 hosts 文件,域名解析时优先查询 hosts 文件,再查询 DNS 服务器。
3. 域名的结构
域名采用分层结构 (树状结构),用.分隔各级域名,从右到左层级递增:

(1)结构拆解(以www.baidu.com为例)
| 域名部分 | 层级 | 含义 |
|---|---|---|
. |
根域 | 域名系统的最顶层,全球共 13 组根服务器(由 ICANN 管理),默认省略不写 |
.com |
顶级域(TLD) | 最高级域名,分为两类:- 通用顶级域(.com 企业、.net 网络服务、.org 非盈利组织);- 国家 / 地区顶级域(.cn 中国、.uk 英国、.jp 日本) |
baidu |
二级域 | 企业 / 组织的唯一标识,需向域名注册商(如阿里云、万网)申请注册 |
www |
三级域(主机名) | 习惯用法,用于标识主机功能(如 www 代表 web 服务器、ftp 代表文件服务器),可自定义 |
(2)核心特点
- 唯一性:同一顶级域下的二级域唯一(如.com 下只有一个 baidu);
- 灵活性:三级及以下域名可由企业自行管理(如mail.baidu.com、map.baidu.com)。
4. 域名解析过程:从域名到 IP 的查询链路
DNS 解析是 "递归查询 + 迭代查询" 结合的过程,核心是通过分层服务器逐级定位目标 IP,以下是详细步骤(以查询www.baidu.com为例):

(1)关键角色
客户端:发起域名查询的主机(如你的电脑、手机);
本地 DNS 服务器:用户设备(电脑、手机等)优先查询域名的 "就近 DNS 节点",相当于 "家门口的互联网地址簿管理员"------ 你查域名时,会先把请求发给它,它要么用自己的缓存直接返回结果,要么帮你去根服务器、顶级域服务器等逐级查询,最后把 IP 地址给你,一般运营商会提供、企业 / 学校内部也有自己维护的本地 DNS
根服务器:全球 13 组,存储所有顶级域服务器的 IP 地址;
顶级域服务器(如.com 服务器):存储该顶级域下所有二级域服务器的 IP 地址;
权威服务器 (如baidu.com服务器):存储目标域名的最终 "域名 - IP" 映射(或 CNAME 映射)。
(2)解析步骤
客户端本地查询:客户端先查自身缓存(浏览器缓存、系统缓存),再查 hosts 文件,若有对应 IP 直接返回,无需后续步骤;
递归查询本地 DNS :若本地无缓存,客户端向本地 DNS 服务器发送 "递归查询请求"("帮我找到www.baidu.com的 IP");
本地 DNS 查询根服务器 :本地 DNS 向根服务器发送 "迭代查询请求"("www.baidu.com的 IP 是什么?"),根服务器返回.com顶级域服务器的 IP;
本地 DNS 查询顶级域服务器 :本地 DNS 向.com服务器发送请求,.com服务器返回baidu.com权威服务器的 IP;
本地 DNS 查询权威服务器 :本地 DNS 向baidu.com权威服务器发送请求,权威服务器返回解析结果(可能是 CNAME 记录或 IP);
例:文档中 dig 结果显示,www.baidu.com先解析为www.a.shifen.com(CNAME 记录,域名别名),再解析为 115.239.210.27 和 115.239.211.112(A 记录,IPv4 地址);
结果返回与缓存:本地 DNS 将最终 IP 返回给客户端,同时缓存该解析结果(过期时间由 TTL 控制),后续同类查询可直接复用缓存。
(3)核心概念补充
- 递归查询:客户端→本地 DNS,"你帮我查到底",本地 DNS 需返回最终结果;
- 迭代查询:本地 DNS→根服务器→顶级域服务器→权威服务器,"你告诉我下一个该查谁",每一步只返回下一级服务器地址;
- TTL(Time To Live):解析结果的缓存有效期(如文档中为 40 秒、1057 秒),过期后需重新查询。
5. DNS 工具:dig
dig 是 Linux/Unix 下的 DNS 查询工具,可直观查看解析过程和结果,文档中给出了使用示例,以下是关键说明:
(1)安装与基础使用
- 安装:
yum install bind-utils(CentOS/RHEL)或apt install dnsutils(Ubuntu); - 基础命令:
dig www.baidu.com(查询指定域名的 IPv4 地址)。
(2)结果拆解
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41628
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 1057 IN CNAME www.a.shifen.com.
www.a.shifen.com. 40 IN A 115.239.210.27
www.a.shifen.com. 40 IN A 115.239.211.112
;; Query time: 0 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Sep 26 00:05:25 CST 2018
;; MSG SIZE rcvd: 90
- HEADER 部分:
status: NOERROR表示查询成功;qr=1表示是响应包,rd=1表示启用递归,ra=1表示服务器支持递归; - QUESTION SECTION:查询目标(
www.baidu.com),IN A表示查询 IPv4 地址(A 记录); - ANSWER SECTION:解析结果(3 条记录),分别是 CNAME 别名和两个 A 记录,数字(1057、40)是 TTL 值;
- 统计信息:
Query time是查询耗时,SERVER是提供解析的 DNS 服务器 IP(端口 53 是 DNS 默认端口)。
6. DNS 缓存
DNS 缓存分为三级,目的是减少重复查询,提升解析效率:
- 浏览器缓存:浏览器存储近期解析的域名,有效期较短(如几分钟到几小时);
- 系统缓存:操作系统层面的缓存(Windows 用
ipconfig /displaydns查看,Linux 用systemd-resolve --statistics查看); - 本地 DNS 服务器缓存:缓存时间最长(由 TTL 控制),是整个网络解析的核心缓存节点。
7.CNAME
CNAME 是 DNS(域名系统)里的 域名别名记录(全称 Canonical Name),核心是给一个域名 "起别名"------ 让一个域名(别名域名)直接指向另一个域名(主域名),而不是像 A 记录那样直接绑定到 IP 地址。
比如你常用的 "www.baidu.com",其实是个 "别名":通过 DNS 查询会发现,www.baidu.com的 CNAME 记录指向www.a.shifen.com(这是百度的主域名);之后再查www.a.shifen.com的 A 记录,才能得到具体的 IP 地址。相当于 "先找别名对应的主名字,再通过主名字找实际地址"。
简化多域名管理
如果你的网站有多个子域名(比如www.xxx.com、mail.xxx.com、blog.xxx.com),都需要指向同一台服务器:
- 不用给每个子域名都设置 A 记录(直接绑 IP),只需让所有子域名CNAME 指向主域名(如
xxx.com); - 后续服务器 IP 变更时,只需要修改主域名的 A 记录,所有别名域名会自动同步,不用逐个调整,大幅减少维护成本。
关键注意点
CNAME 记录不能和 A 记录同时存在:一个域名要么用 CNAME 指向其他域名,要么用 A 记录绑定 IP,二者只能选其一。
8.A记录是什么
A 记录是 DNS(域名系统)中最基础的IPv4 地址记录(全称 Address Record),核心作用是把域名直接绑定到具体的 IPv4 地址------ 当用户访问该域名时,DNS 服务器会直接返回对应的 IP 地址,让设备能定位到目标主机。
比如你有一个域名www.example.com,对应的服务器 IP 是192.168.1.100:
- 你在 DNS 服务商(如阿里云)里给
www.example.com配置一条 A 记录,将其 "值" 设为192.168.1.100; - 当用户访问
www.example.com时,DNS 查询会直接返回192.168.1.100,用户设备就能直接连接到这台服务器。
CNAME出来后查出来多条A记录是怎么回事
"CNAME 出来后有多条 A 记录",核心逻辑是:CNAME 本身不会直接对应 A 记录,多条 A 记录是 "CNAME 指向的主域名" 的配置------ 解析流程是 "别名域名→主域名→多个 IP",多条A记录是主域名为了负载均衡 / 高可用配置的多 IP,不是 CNAME 直接生成的。
先理清解析的完整流程
以之前看到的 dig 查询结果为例:
- 你查询
www.baidu.com(别名域名),DNS 先返回一条CNAME 记录 :www.baidu.com → www.a.shifen.com(主域名); - 因为 CNAME 只指向主域名,不直接对应 IP,所以 DNS 会自动 "接着查询主域名
www.a.shifen.com的 A 记录"; - 主域名
www.a.shifen.com配置了两条 A 记录 (比如115.239.210.27和115.239.211.112),所以最终返回这两条 A 记录。
你看到的 "CNAME + 两条 A 记录",是 "别名→主名→多 IP" 的解析结果叠加,两条 A 记录属于主域名,不是 CNAME 本身的记录。
为什么主域名会配置两条 A 记录
主域名(比如www.a.shifen.com)设置多条 A 记录,本质是为了负载均衡和高可用,这是大型网站的常见配置:
- 负载均衡:两条 A 记录对应两台(或两组)相同的服务器,用户访问时,DNS 会随机返回其中一个 IP,把访问流量分散到不同服务器上 ------ 避免单台服务器压力过大(比如百度每天亿级访问,不可能靠一台服务器扛);
- 高可用 :如果其中一台服务器故障(比如 IP
115.239.210.27对应的服务器宕机),DNS 会检测到不可用,自动把用户引导到正常的 IP(115.239.211.112),保证网站不会整体瘫痪。
不是CNAME 出来两条 A 记录",而是 "主域名的 A 记录被连带查询出来
很多人会误以为 "CNAME 对应了两条 A 记录",其实是误解:
- CNAME 的作用只有一个:告诉 DNS"这个别名的主名是 XXX,去查 XXX 的 IP";
- A 记录的作用:只负责 "域名→IP" 的直接映射,这里的两条 A 记录是主域名的配置,和 CNAME 本身无关;
- 你看到的 "两条 A 记录",是 DNS 自动完成 "CNAME 跳转后,查询主域名 A 记录" 的结果,是解析流程的 "第二步输出"。
你看到的这种基于多 A 记录的 DNS 负载均衡是完全自动完成的,不需要你手动写任何代码 ------ 核心是 DNS 服务器内置了负载均衡策略,你只需要在 DNS 服务商后台配置好多条 A 记录即可。
具体怎么 "自动" 工作?
以百度的www.a.shifen.com配置两条 A 记录为例:
- 你只需要做配置(不用写代码) :在 DNS 服务商(比如阿里云、百度自己的 DNS 服务器)后台,给
www.a.shifen.com添加两条 A 记录(对应两个 IP),这个操作是 "点按钮 / 填表单" 式的配置,不是写代码; - DNS 服务器自动分发 IP :当有用户查询
www.a.shifen.com的 IP 时,DNS 服务器会按内置策略(最常见的是轮询 ,也可能是随机、权重等),自动给不同用户返回不同的 IP:- 第一个用户来查 → 返回
115.239.210.27; - 第二个用户来查 → 返回
115.239.211.112; - 第三个用户来查 → 又返回
115.239.210.27; - 以此类推,自动把访问流量分散到不同 IP 对应的服务器上。
- 第一个用户来查 → 返回
ICMP
ICMP(Internet Control Message Protocol,互联网控制消息协议)是网络层协议,基于 IP 协议工作(ICMP 报文封装在 IP 数据报中传输),核心作用是:
- 诊断网络连通性(如验证主机是否可达);
- 通知 IP 数据报传输中的错误(如丢包原因、目标不可达);
- 补充 IP 协议的不足:IP 协议是 "无连接、不可靠" 的,不提供差错控制和状态反馈,ICMP 恰好弥补了这一缺陷。
2. 关键特性
- 依赖 IP 传输:ICMP 报文本身不直接传输,需封装在 IP 数据报中(IP 头部的 "协议字段" 设为 1,表示承载的是 ICMP 报文);
- 无端口号:ICMP 工作在网络层,他直接绕过了传输层,上面就是应用层,,端口号是传输层(TCP/UDP)的概念,因此 ICMP 不涉及端口;
- 兼容性:仅适用于 IPv4,IPv6 中对应的替代协议是 ICMPv6。
3. ICMP 报文类型:诊断查询与错误通知
ICMP 报文分为两大类,文档中列出了核心类型码,以下是常用类型的详细说明:
| 类型码(十进制) | 报文类型 | 类别 | 核心作用 |
|---|---|---|---|
| 0 | 回送应答(Echo Reply) | 诊断查询 | 响应 "回送请求" 报文(如 ping 命令的应答包),表示目标主机可达 |
| 3 | 目标不可达(Destination Unreachable) | 错误通知 | 当 IP 数据报无法送达目标时发送(如主机断电、端口未开放、路由不可达),细分 16 个子类型 |
| 8 | 回送请求(Echo Request) | 诊断查询 | 主动探测目标主机是否可达(如 ping 命令发送的请求包) |
| 11 | 超时(Time Exceeded) | 错误通知 | 数据报 TTL(生存周期)减为 0 时发送(如路由环路导致 TTL 耗尽),或分片未按时组装完成 |
| 5 | 重定向(Redirect) | 错误通知 | 路由器告知源主机 "存在更优路由",让主机更新路由表 |
| 18 | 地址子网应答(Address Mask Reply) | 诊断查询 | 响应 "地址子网请求",返回目标网络的子网掩码 |
4. 常用 ICMP 工具:ping 与 traceroute
(1)ping 命令:验证网络连通性
ping 是最常用的 ICMP 工具,基于 "回送请求(类型 8)" 和 "回送应答(类型 0)" 实现:
工作原理
- 源主机发送 ICMP Echo Request 报文(携带 32 字节测试数据、序列号、时间戳);
- 目标主机收到后,返回 ICMP Echo Reply 报文(携带相同的测试数据);
- 源主机计算往返时间(RTT),并统计丢包率,判断网络连通性。
面试坑点
- 问题:"ping 使用哪个端口?"
- 答案:ping 基于 ICMP 协议(网络层),端口号是传输层(TCP/UDP)的概念,因此 ping不涉及任何端口!
(2)traceroute 命令:追踪路由路径
traceroute(Windows 下为 tracert)是基于 ICMP 超时机制(类型 11)的工具,核心作用是显示源主机到目标主机的所有路由节点(路由器) 。
① 工作原理
- 源主机向目标主机发送一系列 IP 数据报,封装 ICMP Echo Request 报文;
- 第一个数据报的 TTL 设为 1,经过第一个路由器后 TTL 减为 0,路由器返回 ICMP 超时报文,源主机记录该路由器 IP;
- 第二个数据报的 TTL 设为 2,经过第二个路由器后 TTL 减为 0,路由器返回超时报文,源主机记录第二个路由器 IP;
- 重复上述过程,直到 TTL 足够大,数据报到达目标主机,目标主机返回 ICMP Echo Reply 报文,追踪结束。