面试题手册

梳理高频技术问题,帮助你按主题复习和查漏补缺。

服务端阅读 05月29日 22:48

DNS 服务器有哪些类型?各自什么作用?

四类:递归解析器(Resolver)——用户端入口,代替客户端从根到权威逐级查询,8.8.8.8/1.1.1.1 就是这类;根域名服务器——13 组,返回 TLD 服务器地址;TLD 服务器——管理 .com/.org/.cn 等顶级域,返回权威服务器地址;权威服务器——存储域名最终记录(A/CNAME/MX 等),由域名所有者配置。查询链路:Resolver → 根 → TLD → 权威,每级缓存减少重复查询。追问13 组根服务器够用吗?13 是早期 UDP 包大小限制的结果。实际远不止 13 台——用 Anycast 技术,每组根有数百个实例分布全球。递归解析器会缓存多久?按记录的 TTL 决定。但解析器可以自行调整最低 TTL(如 BIND 默认 5 分钟),防止频繁回源。权威服务器和解析器可以是同一台吗?技术上可以(BIND 同时支持),生产环境不推荐。混合部署互相影响性能和安全。为什么不直接问权威服务器?你需要知道问哪个权威服务器——这就是根和 TLD 的作用:告诉你下一步问谁。DoH 和传统 DNS 有什么区别?传统 DNS 明文传输(UDP 53),可被监听和篡改。DoH 用 HTTPS(443)加密查询,防止中间人。代价是延迟略高。Chrome/Firefox 默认对部分用户开启。
服务端阅读 05月29日 22:48

Service Worker 如何实现离线访问?

SW 拦截 fetch 请求,命中缓存直接返回,未命中则网络请求并缓存响应。三种策略:Cache First(优先缓存,适合静态资源)、Network First(优先网络,适合 API)、Stale-While-Revalidate(返回缓存同时后台更新)。注册 SW 后监听 install 事件预缓存核心文件,fetch 事件中根据策略匹配缓存。追问首次访问能离线吗?不能。SW 注册后首次 install 才缓存资源,首次访问本身还没 SW。解决方案:用 App Shell 模式预缓存核心 HTML/CSS/JS,首次加载完成后后续访问即可离线。哪些资源适合 Cache First?带 hash 的静态资源(/static/app.3a2b.js)、字体、图片——内容不变可以长期缓存。API 响应用 Network First,避免数据过期。离线时表单提交怎么办?存入 IndexedDB 队列,监听 online 事件或用 Background Sync API 在网络恢复后自动重放。Workbox 的 workbox-background-sync 封装了这个逻辑。缓存版本怎么管理?cacheName 带版本号:my-app-v1→v2。activate 事件中遍历 caches.keys(),删除旧版本缓存。PWA 离线和原生 App 离线体验差距大吗?核心差距在后台任务:原生 App 可后台同步/推送,PWA 的 Background Sync 和 Push API 支持度有限(iOS Safari 部分支持)。但基本离线浏览、表单暂存体验已经很接近。
服务端阅读 05月29日 22:48

cURL 如何处理 Cookie 和会话管理?

发送 Cookie:-b "name=value" 发单个,-b cookies.txt 从文件读。保存 Cookie:-c cookies.txt 把响应 Set-Cookie 写入文件。同时发送和保存:-b cookies.txt -c cookies.txt(同一文件读写维持会话)。会话管理就是循环请求时每次 -b -c 同一个 cookie 文件,服务器通过 session_id 识别用户。追问-b 和 -H Cookie 有什么区别?-b "key=val" 自动生成 Cookie 头,更简洁。-H "Cookie: key=val" 手动写原始头,适合精确控制。多个 Cookie:-b "a=1" -b "b=2" 或 -H "Cookie: a=1; b=2"。Cookie 文件格式是什么?Netscape 格式:每行 tab 分隔 7 个字段——domain\tflag\tpath\tsecure\texpiration\tname\tvalue。由 -c 自动生成。如何模拟登录后访问受保护页面?curl -c cookies.txt -X POST login-url -d user=xxx -d pass=xxx,然后 curl -b cookies.txt protected-url。JWT 认证则不同——登录响应里的 token 需手动提取放到 Authorization 头。Cookie 和 Session 有什么区别?Cookie 存客户端,Session 存服务器端。Cookie 里的 session_id 是钥匙,服务器用这把钥匙找 Session 数据。cURL 模拟的是 Cookie 传输层。如何调试 Cookie 问题?加 -v 查看 Cookie 和 Set-Cookie:curl -v -b cookies.txt URL 2>&1 | grep -i cookie。常见问题:Domain/Path 不匹配、Secure 标记在 HTTP 下不发送、SameSite 跨站不携带。
服务端阅读 05月29日 22:48

DNS 为什么用 UDP 又用 TCP?各自什么场景?

标准查询用 UDP 53(快、无连接、适合小报文),区域传送(zone transfer)和超过 512 字节的响应用 TCP 53(可靠、支持大报文)。EDNS0 扩展后 UDP 响应可达 4096 字节,超过仍切 TCP。UDP 无需握手一个包搞定查询延迟最低;TCP 需要三次握手,适合需要可靠传输的场景。追问为什么不全部用 TCP?TCP 三次握手增加延迟——DNS 查询通常一个 UDP 包就够,用 TCP 慢 2-3 倍。DNS 查询量巨大,TCP 的连接开销对 DNS 服务器是灾难。UDP 丢包了怎么办?客户端设超时重试(2-5 秒),换个解析器再查。DNS 设计上幂等——重复查询结果一样,丢包重试即可。什么情况响应会超过 512 字节?大量 CNAME 链、DNSSEC 签名记录(很大)、大量 MX 记录。DNSSEC 几乎总是触发 TCP fallback。区域传送为什么必须 TCP?区域传送同步整个 zone 数据可能几百 KB,必须可靠完整。TCP 的有序可靠传输正好满足。DoH/DoT 对 UDP/TCP 的影响?DoH 和 DoT 都用 TCP/TLS 加密。HTTP/3 用 QUIC(基于 UDP),又回到 UDP 但加了加密和可靠传输。传统 DNS 用 UDP 求快,安全场景用 TCP 加密求稳。
服务端阅读 05月29日 22:48

cURL 如何处理大文件下载和断点续传?

断点续传:curl -C - -O URL(-C - 自动检测已下载部分继续)。原理:cURL 发 Range 头请求剩余部分,服务器返回 206 Partial Content。首次下载中断后重新执行同一命令即可续传。大文件优化:--limit-rate 2M 限速、--max-time 3600 超时保护、-# 显示进度条。前提:服务器必须支持 Range 头。追问怎么判断服务器是否支持断点续传?curl -I URL 看响应头:Accept-Ranges: bytes 表示支持,没有则不支持。下载中断后文件名不对怎么办?-O 用 URL 最后一段作为文件名,重定向后可能不对。用 -o 指定文件名,或 -L 跟随重定向后再用 -O。如何并行下载大文件?cURL 本身不支持分段并行下载。用 aria2c -x 16 -s 16 URL(16 连接并行)。或手动分段 curl -r 并合并。下载到一半磁盘满了怎么办?cURL 不会自动清理部分文件。脚本中 df -h 检查磁盘空间,超过 90% 停止下载并告警。大文件场景用 --max-filesize 限制大小。如何验证下载文件完整性?curl URL -o file && shasum -a 256 -c checksum.txt。或 curl URL | sha256sum 对比预期哈希。
服务端阅读 05月29日 22:48

DNS 递归查询和迭代查询有什么区别?

递归查询:客户端问解析器,解析器负责从头到尾查完返回最终结果——客户端只发一次请求。迭代查询:解析器问根服务器拿到 TLD 地址,再问 TLD 拿到权威地址,再问权威拿到最终 IP——解析器自己一步步问。实际流程:客户端→解析器是递归,解析器→根/TLD/权威是迭代。追问为什么不全用递归?根/TLD 服务器不提供递归服务——它们服务全球数十亿客户端,每个递归请求都打到根服务器扛不住。根只告诉你下一步问谁(迭代),解析器负责串联。解析器怎么知道根服务器地址?内置的根提示文件(root hints),包含 13 组根服务器的 IP。BIND/Unbound 等软件自带此文件。递归查询的性能瓶颈在哪?冷启动(缓存全空)需要 4 次 RTT:解析器→根→TLD→权威→拿到 IP。热缓存时 1 次 RTT 甚至 0(本地缓存命中)。解析器缓存命中率是核心指标——正常 >90%。什么是转发解析器?不直接迭代查询,而是把请求转发给上游解析器(如企业 DNS 转发给 8.8.8.8)。减少出口 IP 方便防火墙管理。缺点:多一跳延迟,上游故障全部影响。DNS 预取(Prefetching)是什么?解析器在 TTL 即将过期前主动刷新缓存,避免用户请求命中过期缓存触发完整迭代查询。用户无感知,缓存保持热度。
服务端阅读 05月29日 22:48

DNS 根服务器是什么?全球有多少个?

根服务器是 DNS 层级最顶端,返回所有 TLD(.com/.org/.cn 等)的服务器地址。全球 13 组根服务器(A-M),13 是早期 UDP 512 字节包大小限制的结果。每组通过 Anycast 技术在全球部署数百个实例,实际根服务器节点超过 1000 个。追问只有 13 组不会单点故障吗?Anycast 解决——同一 IP 全球数百个节点,请求自动路由到最近的。某节点故障流量自动切到其他节点。加上解析器缓存,根服务器实际负载不高。根服务器被攻击会怎样?2015 年 DDoS 攻击导致部分根服务器离线数小时,用户基本无感知——解析器有缓存 TTL 未过期前不需要问根。长期(>48h)离线才会影响新域名首次解析。谁在管理根服务器?12 个组织(A-M 各一个),受 ICANN 的 IANA 监督。2016 年根区文件管理权从美国移交 ICANN。中国有根服务器吗?有镜像节点(Anycast 实例),但不是运营方。2019 年引入 F/I/K/L 四组根的镜像,提升国内解析速度和抗断网能力。根区文件仍由 ICANN 管理。如果 13 组全挂了怎么办?解析器缓存能撑数小时到数天。顶级域 TLD 缓存同理。短期全挂影响有限,长期需本地部署替代根区。
服务端阅读 05月29日 22:48

DNS 负载均衡怎么实现?有哪些方案?

DNS 负载均衡就是同一域名返回多个 IP,客户端随机选一个访问。三种方案:轮询(Round Robin)——权威服务器按顺序返回不同 IP,简单但无法感知服务器负载;加权 DNS——不同 IP 返回不同比例,权重控制流量分配;GeoDNS——根据客户端 IP 所在地区返回最近的服务器 IP,CDN 核心技术。局限:无法做健康检查、受 TTL 缓存影响切换慢、客户端可能缓存某个 IP 不轮询。追问DNS 负载均衡和 Nginx 负载均衡有什么区别?DNS 在域名解析层分配 IP,客户端直连服务器——无中间层延迟但无法精细控制。Nginx 在应用层代理——可做健康检查、会话保持、权重动态调整,但增加一跳延迟。生产环境常组合:DNS 做全局负载(多机房),Nginx 做单机房内负载。TTL 设多少合适?负载均衡场景一般 60-300 秒。故障切换时临时改 TTL 为 30 秒。注意运营商 DNS 可能强制延长最低 TTL。如何实现 DNS 健康检查?DNS 本身不做健康检查。需要外部系统:监控服务检测后端可用性,故障时调用 DNS API 删除该 IP 记录。Route53/Cloudflare DNS 都有内置健康检查+自动故障切换。GeoDNS 的原理?权威服务器根据请求来源 IP 判断地理位置(用 GeoIP 数据库),返回该地区最近的服务器 IP。实际用 Anycast + EDNS Client Subnet(ECS)传递客户端子网信息。DNS 负载均衡能做灰度发布吗?能但粗糙——给新版本分配 5% 的 IP 权重逐步提升。粒度太粗且受 TTL 缓存影响。精细灰度用 Istio/Nginx 按请求头/cookie 路由。
服务端阅读 05月29日 22:48

如何用 cURL 编写 API 自动化测试脚本?

cURL 测试脚本 = cURL 命令 + shell 判断 + 状态码/响应体验证。核心模式:curl -s -o /dev/null -w "%{http_code}" URL 拿状态码;curl -s URL | jq .field 提取响应体字段;for/while 循环批量测试。进阶:--fail 返回非零表示 HTTP 错误、--max-time 10 超时控制、--retry 3 重试。追问cURL 和 Postman 做测试哪个好?cURL 适合 CI/CD 管道和脚本化——轻量、无 GUI 依赖、易版本控制。Postman 适合手动探索和团队协作。生产环境两者结合:开发用 Postman 调试,CI 用 cURL 验证。怎么验证响应体内容?curl -s URL | jq -e .status==200,-e 让 jq 在结果为 false 时返回 exit code 1。多字段验证:jq -e ".status==200 and .data.id != null"。如何做性能基准测试?curl -s -w "timetotal: %{timetotal}s\n" -o /dev/null URL。批量测用循环+awk 算平均值。注意 cURL 不含 DNS 缓存预热,首次请求偏慢。怎么处理需要登录的接口?先 curl 登录拿 token:TOKEN=$(curl -s -X POST login-url -d user/pass | jq -r .token),后续带 -H "Authorization: Bearer $TOKEN"。cURL 脚本的缺点?无测试报告、无并行执行、错误定位不友好。超过 20 个接口建议上专用测试框架(pytest+requests/Jest+supertest),cURL 适合轻量级冒烟测试和 CI 快速验证。
服务端阅读 05月29日 22:48

DNS 缓存怎么工作?TTL 起什么作用?

DNS 查询每级都缓存:浏览器缓存(Chrome 约 1 分钟)→ 操作系统缓存(TTL 决定)→ 本地解析器缓存(运营商/企业 DNS)→ 权威服务器。TTL(Time To Live)是权威服务器设定的缓存有效期,单位秒。TTL=300 表示缓存 5 分钟内可直接使用,过期后必须重新查询。越短数据越新但查询越多,越长越快但变更延迟越大。追问浏览器 DNS 缓存怎么看?Chrome 地址栏输入 chrome://net-internals/#dns 查看缓存条目和过期时间。运营商会篡改 TTL 吗?会。部分运营商 DNS 强制最低 TTL(5 分钟甚至 1 小时),无视权威设定的短 TTL。对策:用权威 DNS 服务商的低 TTL + 多地探测验证。负 DNS 缓存是什么?缓存 NXDOMAIN(域名不存在)结果,TTL 由 SOA 的 minimum 字段决定。防止频繁查询不存在的域名。域名刚注册后负缓存未过期,部分地区仍解析失败——等 TTL 过期即可。如何强制刷新 DNS 缓存?macOS:sudo dscacheutil -flushcache。Linux:sudo systemd-resolve --flush-caches。Windows:ipconfig /flushdns。运营商缓存无法控制,只能等 TTL 过期。TTL 设为 0 会怎样?每次查询都穿透到权威服务器,不缓存。生产环境最低建议 60 秒。CDN 场景通常 300-3600 秒。