Computer NetworkNotes

第 34 章:面试题精讲

zjc 于 2026-02-03 发布

这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 计算机网络面试最怕“名词都听过,追问三层就断”。本章按答题框架整理高频问题:先给出核心答案,再补常见追问和易错点。

34.1 答题框架

回答网络问题时使用四步:

1. 定位层次:物理、链路、网络、传输、应用
2. 讲机制:协议怎么工作
3. 讲取舍:解决了什么,付出了什么
4. 讲实践:如何验证和排障

例如被问 TCP 和 UDP 区别,不要只列表格,可以补充:UDP 适合实时场景但可靠性转移到应用层,QUIC 就是基于 UDP 实现可靠流和拥塞控制的例子。

34.2 分层与地址

问题 1:OSI 七层和 TCP/IP 模型有什么区别?

OSI 是理论分层:物理、链路、网络、传输、会话、表示、应用。TCP/IP 更接近工程实现,常简化为应用、传输、网络、链路、物理。

加分点:

  1. TLS 在严格分层中常归为表示层安全能力,工程上放在应用层讨论;
  2. QUIC 基于 UDP,却在用户态实现传输层能力;
  3. 分层的价值是职责边界和排障定位,而不是僵化教条。

问题 2:MAC 地址和 IP 地址的区别?

地址 作用
MAC 链路层 同一局域网内标识接口
IP 网络层 跨网络全局寻址和路由

跨网段通信时,目的 IP 通常保持不变,下一跳 MAC 逐跳变化。

问题 3:ARP 工作流程是什么?

查缓存
  -> 未命中广播 ARP Request
     -> 目标主机回复 ARP Reply
        -> 写入缓存并封装帧

追问:跨网段访问时 ARP 请求谁?通常请求网关,而不是最终目标服务器。

34.3 TCP 与 UDP

问题 4:为什么 TCP 三次握手?

三次握手用于:

  1. 同步双方初始序列号;
  2. 确认双方收发能力;
  3. 防止历史 SYN 造成错误连接;
  4. 协商 MSS、窗口缩放、SACK 等选项。

两次无法确认服务端发送和客户端接收能力,也无法可靠完成序列号同步。

问题 5:为什么四次挥手?

TCP 全双工,两个方向分别关闭。被动方收到 FIN 后可能还要发送数据,因此 ACK 和 FIN 可以分开。

问题 6:TIME_WAIT 过多怎么办?

TIME_WAIT 出现在主动关闭方,用于等待旧报文消失和保证最后 ACK。

优先处理:

  1. 连接复用;
  2. HTTP Keep-Alive;
  3. 数据库和 RPC 连接池;
  4. 降低重试频率。

易错点:不要盲目使用端口重用,更不要复活 tcp_tw_recycle

问题 7:CLOSE_WAIT 过多说明什么?

CLOSE_WAIT 出现在被动关闭方,表示对端已关闭但本方应用没有调用 close。通常是连接泄漏,应排查响应体关闭、异常 finally、连接池生命周期和线程阻塞。

问题 8:TCP 如何保证可靠?

机制:

  1. 序列号和确认号;
  2. 超时重传;
  3. 快速重传;
  4. SACK;
  5. 滑动窗口;
  6. 校验和;
  7. 连接状态管理;
  8. 拥塞控制。

追问:TCP 可靠是否等于业务可靠?不等于。请求可能处理失败,重试可能重复,应用仍需要超时、幂等和业务确认。

问题 9:流量控制和拥塞控制区别?

rwnd:保护接收方
cwnd:保护网络
send window = min(rwnd, cwnd)

慢启动指数增长,拥塞避免线性增长,丢包后窗口下降。CUBIC 和 BBR 的差异要能说出:CUBIC 以丢包为核心信号,BBR 估算瓶颈带宽和最小 RTT。

问题 10:UDP 为什么不可靠,为什么 QUIC 还用它?

UDP 无连接、不确认、不排序、不流控,但延迟低、实现简单、易于用户态演进。QUIC 在 UDP 之上实现可靠流、流级别独立交付、TLS 1.3、连接迁移和可插拔拥塞控制。

34.4 HTTP 与 HTTPS

问题 11:GET 和 POST 的区别?

GET 语义是读取资源,安全且幂等;POST 语义是创建或执行动作,不保证幂等。GET 可以被缓存和预取,POST 通常需要幂等键才能安全重试。

易错点:URL 长度限制来自浏览器和服务器实现,不是 HTTP 协议本身定义的固定值。

问题 12:401 和 403 的区别?

401 是未认证或认证无效;403 是身份已知但没有权限。

问题 13:什么是 HTTPS?

HTTPS 是 HTTP over TLS,提供身份认证、机密性和完整性。

核心流程:

证书链校验
  -> 密钥交换
     -> 协商对称密钥
        -> 加密应用数据

TLS 1.3 通常 1 RTT,支持 0-RTT,但 0-RTT 有重放风险。

问题 14:SNI 和 ALPN 分别是什么?

SNI 在 ClientHello 中告诉服务器要访问的域名,用于单 IP 多证书选择。ALPN 协商应用协议,例如 h2、http/1.1、h3。

问题 15:HTTP/2 解决了什么问题?

二进制分帧、流多路复用、HPACK 头部压缩和连接级/流级流量控制。它解决了 HTTP 层请求排队和头部重复问题,但仍有 TCP 层队头阻塞。

问题 16:HTTP/3 为什么基于 QUIC?

QUIC 基于 UDP,实现:

  1. 流独立交付,减少传输层队头阻塞;
  2. 集成 TLS 1.3;
  3. 连接迁移;
  4. 0-RTT;
  5. 用户态快速迭代。

部署需要 UDP 443、客户端、CDN、LB 和防火墙支持。

34.5 DNS 与 CDN

问题 17:DNS 解析流程是什么?

本地缓存
  -> Stub Resolver
     -> Recursive DNS
        -> Root
           -> TLD
              -> Authoritative

常见追问:TTL 如何影响切换?TTL 越短切换越快,但递归查询压力越大。生产切换前应先降 TTL。

问题 18:CDN 为什么能加速?

  1. 就近接入;
  2. 边缘缓存;
  3. TLS 终止和连接复用;
  4. 内部骨干网回源;
  5. 吸收攻击流量。

追问:动态接口能否缓存?不能直接缓存,但可以通过就近接入、链路优化和连接复用做动态加速,需实测。

34.6 架构与生产

问题 19:四层和七层负载均衡区别?

L4 基于 IP 和端口转发,性能高但语义少;L7 基于 HTTP 路径、Header、Cookie、域名路由,可做灰度、重写、限流和鉴权。

问题 20:X-Forwarded-For 如何安全使用?

只有可信代理链设置的值可信。入口代理必须覆盖外部传入值,后端按可信代理跳数解析真实 IP。

问题 21:偶发请求超时如何排查?

先拆分:

DNS / TCP / TLS / TTFB / transfer

再看:

  1. mtr 丢包和延迟;
  2. ss -i RTT 和重传;
  3. LB upstream 耗时;
  4. 后端线程池和日志;
  5. 安全策略和容量;
  6. 是否重试风暴。

问题 22:大包卡住小包正常说明什么?

优先怀疑 MTU / MSS / PMTUD 问题,尤其在 VPN、overlay、容器和专线场景。

ping -M do -s 1472 <target>
tracepath <target>

问题 23:NAT 端口耗尽怎么办?

原因是大量短连接访问同一个目标且五元组不可复用。处理是连接池、长连接、降低重试、拆分 NAT 网关或 EIP、多目标域名和限流。

问题 24:epoll 为什么适合大量连接?

epoll 通过事件通知避免 select/poll 的全量线性扫描,且大量空闲连接不会带来每轮扫描成本。常见模型是主从 Reactor。

追问:非阻塞 read 返回 EAGAIN 怎么办?注册读事件并返回,不能忙轮询。

34.7 场景题

场景 1:某地区用户访问慢

排查:

  1. 用户运营商和地区;
  2. DNS 调度结果;
  3. CDN 节点和命中率;
  4. mtr 路径;
  5. TLS 和 TTFB;
  6. 后端地域部署;
  7. 其他地区对比。

处理:

  1. 切换 CDN;
  2. 调整调度;
  3. 回源链路;
  4. 开启就近接入;
  5. 客户端重试备用域名。

场景 2:服务发布期间 502

检查:

  1. readiness;
  2. preStop;
  3. 优雅关闭;
  4. LB 摘除延迟;
  5. 长连接 draining;
  6. 连接池刷新;
  7. 健康检查路径。

场景 3:WebSocket 半小时断开

常见原因是 LB、NAT 或防火墙空闲超时。应让应用心跳间隔小于最短空闲超时,并设置服务端读空闲、客户端重连和退避。

34.8 高频易错点

  1. TCP 可靠代表请求成功:不准确;
  2. TIME_WAIT 是异常:不一定,短连接场景常见;
  3. ping 不通代表服务不可用:可能禁 ICMP;
  4. HTTPS 绝对安全:仍需证书治理、授权和 WAF;
  5. CDN 缓存所有请求:私有数据不能公共缓存;
  6. HTTP/2 完全消除队头阻塞:只消除 HTTP 层,TCP 层仍存在;
  7. 内网默认可信:零信任下不成立;
  8. 连接数越大越好:会带来内存、调度和容量风险;
  9. DNS 权重调度精确:受缓存和 Local DNS 位置影响;
  10. 平均延迟代表体验:长尾更关键。

本章小结

网络面试应先定位层次,再讲机制、取舍和生产验证。TCP 重点掌握握手挥手、状态机、可靠传输、流量和拥塞控制;HTTP 重点掌握语义、幂等、缓存、TLS、HTTP/2 和 HTTP/3;生产题要能拆延迟、看路径、抓证据并给出止血与长期方案。

思考题

  1. 为什么三次握手不能是两次?
  2. TIME_WAIT 和 CLOSE_WAIT 分别如何治理?
  3. HTTP/2 和 HTTP/3 的队头阻塞差异是什么?
  4. 如何安全获取客户端真实 IP?
  5. 把一次线上网络故障整理成面试案例。