这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 计算机网络面试最怕“名词都听过,追问三层就断”。本章按答题框架整理高频问题:先给出核心答案,再补常见追问和易错点。
34.1 答题框架
回答网络问题时使用四步:
1. 定位层次:物理、链路、网络、传输、应用
2. 讲机制:协议怎么工作
3. 讲取舍:解决了什么,付出了什么
4. 讲实践:如何验证和排障
例如被问 TCP 和 UDP 区别,不要只列表格,可以补充:UDP 适合实时场景但可靠性转移到应用层,QUIC 就是基于 UDP 实现可靠流和拥塞控制的例子。
34.2 分层与地址
问题 1:OSI 七层和 TCP/IP 模型有什么区别?
OSI 是理论分层:物理、链路、网络、传输、会话、表示、应用。TCP/IP 更接近工程实现,常简化为应用、传输、网络、链路、物理。
加分点:
- TLS 在严格分层中常归为表示层安全能力,工程上放在应用层讨论;
- QUIC 基于 UDP,却在用户态实现传输层能力;
- 分层的价值是职责边界和排障定位,而不是僵化教条。
问题 2:MAC 地址和 IP 地址的区别?
| 地址 | 层 | 作用 |
|---|---|---|
| MAC | 链路层 | 同一局域网内标识接口 |
| IP | 网络层 | 跨网络全局寻址和路由 |
跨网段通信时,目的 IP 通常保持不变,下一跳 MAC 逐跳变化。
问题 3:ARP 工作流程是什么?
查缓存
-> 未命中广播 ARP Request
-> 目标主机回复 ARP Reply
-> 写入缓存并封装帧
追问:跨网段访问时 ARP 请求谁?通常请求网关,而不是最终目标服务器。
34.3 TCP 与 UDP
问题 4:为什么 TCP 三次握手?
三次握手用于:
- 同步双方初始序列号;
- 确认双方收发能力;
- 防止历史 SYN 造成错误连接;
- 协商 MSS、窗口缩放、SACK 等选项。
两次无法确认服务端发送和客户端接收能力,也无法可靠完成序列号同步。
问题 5:为什么四次挥手?
TCP 全双工,两个方向分别关闭。被动方收到 FIN 后可能还要发送数据,因此 ACK 和 FIN 可以分开。
问题 6:TIME_WAIT 过多怎么办?
TIME_WAIT 出现在主动关闭方,用于等待旧报文消失和保证最后 ACK。
优先处理:
- 连接复用;
- HTTP Keep-Alive;
- 数据库和 RPC 连接池;
- 降低重试频率。
易错点:不要盲目使用端口重用,更不要复活 tcp_tw_recycle。
问题 7:CLOSE_WAIT 过多说明什么?
CLOSE_WAIT 出现在被动关闭方,表示对端已关闭但本方应用没有调用 close。通常是连接泄漏,应排查响应体关闭、异常 finally、连接池生命周期和线程阻塞。
问题 8:TCP 如何保证可靠?
机制:
- 序列号和确认号;
- 超时重传;
- 快速重传;
- SACK;
- 滑动窗口;
- 校验和;
- 连接状态管理;
- 拥塞控制。
追问: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,实现:
- 流独立交付,减少传输层队头阻塞;
- 集成 TLS 1.3;
- 连接迁移;
- 0-RTT;
- 用户态快速迭代。
部署需要 UDP 443、客户端、CDN、LB 和防火墙支持。
34.5 DNS 与 CDN
问题 17:DNS 解析流程是什么?
本地缓存
-> Stub Resolver
-> Recursive DNS
-> Root
-> TLD
-> Authoritative
常见追问:TTL 如何影响切换?TTL 越短切换越快,但递归查询压力越大。生产切换前应先降 TTL。
问题 18:CDN 为什么能加速?
- 就近接入;
- 边缘缓存;
- TLS 终止和连接复用;
- 内部骨干网回源;
- 吸收攻击流量。
追问:动态接口能否缓存?不能直接缓存,但可以通过就近接入、链路优化和连接复用做动态加速,需实测。
34.6 架构与生产
问题 19:四层和七层负载均衡区别?
L4 基于 IP 和端口转发,性能高但语义少;L7 基于 HTTP 路径、Header、Cookie、域名路由,可做灰度、重写、限流和鉴权。
问题 20:X-Forwarded-For 如何安全使用?
只有可信代理链设置的值可信。入口代理必须覆盖外部传入值,后端按可信代理跳数解析真实 IP。
问题 21:偶发请求超时如何排查?
先拆分:
DNS / TCP / TLS / TTFB / transfer
再看:
mtr丢包和延迟;ss -iRTT 和重传;- LB upstream 耗时;
- 后端线程池和日志;
- 安全策略和容量;
- 是否重试风暴。
问题 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:某地区用户访问慢
排查:
- 用户运营商和地区;
- DNS 调度结果;
- CDN 节点和命中率;
- mtr 路径;
- TLS 和 TTFB;
- 后端地域部署;
- 其他地区对比。
处理:
- 切换 CDN;
- 调整调度;
- 回源链路;
- 开启就近接入;
- 客户端重试备用域名。
场景 2:服务发布期间 502
检查:
- readiness;
- preStop;
- 优雅关闭;
- LB 摘除延迟;
- 长连接 draining;
- 连接池刷新;
- 健康检查路径。
场景 3:WebSocket 半小时断开
常见原因是 LB、NAT 或防火墙空闲超时。应让应用心跳间隔小于最短空闲超时,并设置服务端读空闲、客户端重连和退避。
34.8 高频易错点
- TCP 可靠代表请求成功:不准确;
- TIME_WAIT 是异常:不一定,短连接场景常见;
- ping 不通代表服务不可用:可能禁 ICMP;
- HTTPS 绝对安全:仍需证书治理、授权和 WAF;
- CDN 缓存所有请求:私有数据不能公共缓存;
- HTTP/2 完全消除队头阻塞:只消除 HTTP 层,TCP 层仍存在;
- 内网默认可信:零信任下不成立;
- 连接数越大越好:会带来内存、调度和容量风险;
- DNS 权重调度精确:受缓存和 Local DNS 位置影响;
- 平均延迟代表体验:长尾更关键。
本章小结
网络面试应先定位层次,再讲机制、取舍和生产验证。TCP 重点掌握握手挥手、状态机、可靠传输、流量和拥塞控制;HTTP 重点掌握语义、幂等、缓存、TLS、HTTP/2 和 HTTP/3;生产题要能拆延迟、看路径、抓证据并给出止血与长期方案。
思考题
- 为什么三次握手不能是两次?
- TIME_WAIT 和 CLOSE_WAIT 分别如何治理?
- HTTP/2 和 HTTP/3 的队头阻塞差异是什么?
- 如何安全获取客户端真实 IP?
- 把一次线上网络故障整理成面试案例。