深色模式
05 · DNS 与 ARP:两个"翻译官"
这两个协议都很小,但它们是"一次请求"链条上的两个必经环节。面试常以"顺便问一句"的形式出现,答不上来很掉分。
一句话本质
- DNS:把域名翻译成 IP(人记名字,机器认地址)。
- ARP:把 IP 翻译成 MAC(跨网络找路用 IP,同一局域网内送达用 MAC)。
生活类比:查地址簿与问路
| 协议 | 场景 |
|---|---|
| DNS | 你要寄快递给"张三",得先查地址簿把他的名字变成"某某路 8 号" |
| DNS 缓存 | 你常寄的那几个人,地址你记在手机里,不用每次都翻地址簿 |
| DNS 递归查询 | 你让快递公司帮你查到底,你只要结果 |
| DNS 迭代查询 | 你一级一级问:先问总台,总台说"去问 3 号窗口",3 号说"去问 7 号" |
| ARP | 你到了小区门口,只知道楼号(IP),得问保安"3 号楼是哪一栋"(MAC) |
| ARP 缓存 | 保安记住了,下次不用再问 |
核心机制
一、DNS 的层级结构
根域名服务器(.)
/ | \
.com 顶级域 .cn 顶级域 .org
/ |
example.com baidu.com
|
www.example.com(权威服务器)四种服务器:
| 类型 | 作用 |
|---|---|
| 根服务器 | 只知道"顶级域在哪",全球 13 组(任播,实际上千台) |
| 顶级域(TLD) | 管 .com / .cn 这些,知道"二级域的权威服务器在哪" |
| 权威服务器 | 真正存着 www.example.com > 1.2.3.4 这条记录 |
| 本地 DNS(递归服务器) | 你运营商/公司配的那个,替你去问,问到了缓存起来 |
二、递归查询 vs 迭代查询
递归查询(客户端 > 本地DNS):
客户端:"www.example.com 的 IP 是多少?"
本地DNS:"你等着,我去查。" < 客户端只问一次,等结果
迭代查询(本地DNS > 各级服务器):
本地DNS > 根:"www.example.com 多少?"
根 > "我不知道,但 .com 的服务器在 1.1.1.1,你去问它"
本地DNS > .com:"www.example.com 多少?"
.com > "我不知道,但 example.com 的权威在 2.2.2.2"
本地DNS > 权威:"www.example.com 多少?"
权威 > "1.2.3.4"记住这个分工:客户端对本地 DNS 是递归(你帮我查到底),本地 DNS 对上级是迭代(你告诉我下一步问谁)。
三、DNS 的完整缓存链
浏览器 DNS 缓存(Chrome 有自己的,chrome://net-internals/#dns)
v 没有
操作系统 DNS 缓存(Windows: ipconfig /displaydns;Linux 通常没有)
v 没有
hosts 文件(/etc/hosts、C:\Windows\System32\drivers\etc\hosts)
v 没有
本地 DNS 服务器(运营商 / 8.8.8.8 / 223.5.5.5)
v 没有
根 > 顶级域 > 权威(迭代查询)TTL 决定缓存多久。TTL 太长 > 改了 IP 要等很久才生效;太短 > DNS 查询压力大。这是运维常调的参数。
四、DNS 用的什么协议
普通 DNS:UDP 53 端口
为什么用 UDP:查询报文很小(通常 < 512 字节),一次往返就够,
TCP 的三次握手反而是浪费
什么时候用 TCP:
① 响应超过 512 字节(现在很常见,所以要 EDNS0 扩展)
② 区域传送(主从同步,数据量大)
③ DoT(DNS over TLS)新增的加密方案:
- DoH(DNS over HTTPS):把 DNS 查询塞进 HTTPS,端口 443,中间人看不到你查什么域名。
- DoT(DNS over TLS):端口 853,专用协议。
- 代价:企业内网无法审计 DNS,所以很多公司禁用。
五、ARP:同一局域网内怎么找到对方
主机 A 知道 B 的 IP(192.168.1.5),但不知道 B 的 MAC
v
A 广播:"谁是 192.168.1.5?请告诉我你的 MAC"(发给局域网内所有人)
v
只有 B 回应:"我是,我的 MAC 是 aa:bb:cc:dd:ee:ff"(单播回复)
v
A 把这条映射写进 ARP 缓存(通常 20 分钟过期)关键点:
- ARP 请求是广播(FF:FF:FF:FF:FF:FF),响应是单播。
- ARP 只在同一个广播域内有效,跨网段用不了——所以网关必须知道下一跳的 MAC。
- ARP 缓存会被投毒:攻击者伪造 ARP 响应,声称"网关的 MAC 是我",就能中间人劫持。这是内网渗透的经典手法(ARP Spoofing)。
六、把两者串进"一次请求"
① 浏览器:我要访问 www.example.com
② DNS 查询(本篇):域名 > 1.2.3.4
③ 查路由表:1.2.3.4 不在本网段 > 走默认网关 192.168.1.1
④ ARP 查询(本篇):192.168.1.1 的 MAC 是多少 > aa:bb:...
⑤ 封装:目的 IP = 1.2.3.4,目的 MAC = 网关 MAC
⑥ 发给网关,网关再查路由,逐跳转发注意第 ④ 步:ARP 查的是网关的 MAC,不是目标服务器的 MAC。因为你只需要把包交给下一跳。
为什么这么设计
反事实 1:如果没有 DNS
你得记住每个网站的 IP。百度的 IP 变了,所有人都得改书签。而且一个 IP 上可能有几千个网站(虚拟主机),光靠 IP 根本区分不了——所以 HTTP/1.1 必须加 Host 头。
反事实 2:如果 DNS 用 TCP
每次查询都要三次握手,网页打开要多花一个 RTT。一个页面有 20 个域名要解析,就是 20 个 RTT,慢到无法接受。
反事实 3:如果没有 ARP
在局域网内,你不知道"3 号楼是哪一栋",只能把包广播给所有人——所有人都要处理每个包,网络直接瘫痪。ARP 把广播收敛成"问一次,之后用缓存"。
面试怎么问
Q:DNS 查询过程?
按缓存链答:浏览器缓存 > 系统缓存 > hosts > 本地 DNS > (迭代)根 > 顶级域 > 权威。 加分:说清"客户端对本地 DNS 是递归,本地 DNS 对上级是迭代"。
Q:DNS 为什么用 UDP?
报文小、一次往返就够,TCP 握手反而更慢。响应超过 512 字节或做区域传送时改用 TCP。
Q:DNS 会被劫持吗?怎么防?
会。明文 UDP 很容易被中间人伪造响应(甚至抢先回复)。防御:DoH/DoT 加密、DNSSEC 签名验证、使用可信的递归服务器。
Q:ARP 的作用?ARP 攻击是什么?
把 IP 解析成 MAC,只在局域网内有效。攻击是伪造 ARP 响应做投毒,让流量经过攻击者(中间人)。防御:静态 ARP 绑定、DAI(动态 ARP 检测)。
追问链:
输入 URL 后第一步做什么?
> DNS 怎么查?(缓存 > hosts > 本地DNS > 迭代)
> 为什么用 UDP?(小、快)
> 拿到 IP 之后呢?(查路由表,决定下一跳)
> 下一跳的 MAC 怎么来?(ARP)
> ARP 为什么只能局域网用?(广播域限制)
> 跨网段怎么办?(交给网关,网关再 ARP 下一跳)和其他知识的连接
- < 来自 分层模型与一次请求的一生:DNS 是应用层协议,ARP 在链路层与网络层之间
- < 来自 HTTP / HTTPS 与缓存:
Host头让一个 IP 承载多个域名,这是 DNS 之外的另一半解法 - > 影响 工程实践:CDN 靠 DNS 调度(返回离你最近的节点 IP);灰度发布靠 DNS 权重;
dig/nslookup是排障第一步 - > 影响 安全:DNS 劫持、DNS 污染、ARP 投毒,都是内网/公网攻击的常见入口
自测 3 问
Q1:为什么说"客户端对本地 DNS 是递归,本地 DNS 对上级是迭代"?
点开看答案
因为责任不同:
- 递归:我把问题交给你,你负责给出最终答案(或者明确的失败)。客户端只发一次请求,剩下的全由本地 DNS 搞定。客户端不需要知道根服务器在哪。
- 迭代:我问你,你告诉我"下一步去问谁",我自己去问。本地 DNS 一级级问下去,每次都拿到"下一步的地址",直到拿到最终答案。
为什么要这样设计:如果根服务器也做递归,它要替全球所有查询跑完全程,负载无法承受。迭代让每级只回答"我知道的那一点",压力分散。
Q2:ARP 查的是目标服务器的 MAC 吗?
点开看答案
不是。查的是下一跳的 MAC。
如果目标在同一个局域网(同网段),下一跳就是目标本身,此时确实查目标的 MAC。 如果目标在别的网段(绝大多数情况),下一跳是默认网关,查的是网关的 MAC。
因为链路层只负责"把帧交给相邻的下一台设备",它根本不知道最终目标在哪。最终寻址是 IP 层的事。
这也是为什么"MAC 每跳都变,IP 全程不变"。
Q3:为什么改了 DNS 记录,要等很久才生效?
点开看答案
因为 DNS 有缓存,缓存时间由 TTL 决定。
各级缓存(浏览器、系统、本地 DNS、甚至某些中间代理)都会保存这条记录,直到 TTL 到期才重新查询。如果 TTL 设成 24 小时,你改了记录,全球的缓存可能要 24 小时才陆续过期。
工程做法:
- 迁移前先把 TTL 调小(比如 300 秒),等旧 TTL 过期后再改记录,改完很快生效。
- 改完稳定后再把 TTL 调回大值,减少查询压力。
这就是"DNS 切换要提前一天准备"的原因。
类比失效处 / 易错点
- "地址簿"类比会让人以为 DNS 只有一层。实际是四级结构 + 多层缓存,还可能有 CDN 的智能调度。
- DNS 不是"一个数据库",是分布式系统:根、顶级、权威各自管一段,靠委派(delegation)连起来。
- ARP 不跨网段。别答"ARP 找到目标服务器的 MAC"——跨网段时你根本 ARP 不到对方。
ping通不代表网页能打开。ICMP 和 TCP 80/443 是不同的事,中间可能有防火墙只放行 ICMP。同理,DNS 解析成功也不代表能连上。- DNS 轮询不是负载均衡。它只是返回多个 IP,客户端选哪个、健不健康,DNS 都不知道。
✅ 验收清单
- 能画出 DNS 的四级结构(根 / 顶级 / 权威 / 本地),并说出每级管什么
- 能说清递归查询和迭代查询的区别,以及"谁对谁是递归"
- 能背出 DNS 的完整缓存链(浏览器 > 系统 > hosts > 本地 DNS > 迭代)
- 能解释 DNS 为什么用 UDP,以及什么情况下改用 TCP
- 能说清 ARP 的请求/响应方式(广播请求、单播响应),以及它为什么不跨网段
- 能指出"ARP 查的是下一跳而不是目标服务器"这个易错点
- 能解释"改 DNS 为什么要等",并说出 TTL 的调优做法
- 合上书,用自己的话讲 3 分钟,中途不卡壳