HTTP 面试真题补充
本篇整理自 7.HTTP面试真题-62页.pdf,按 PDF 中出现的协议分层、报文、缓存、TLS、CDN、DNS、WebSocket 和 URL 链路补充高频场景。
HTTP 面试真题补充
本篇整理自
7.HTTP面试真题-62页.pdf,按 PDF 中出现的协议分层、报文、缓存、TLS、CDN、DNS、WebSocket 和 URL 链路补充高频场景。
一、OSI、TCP/IP 与一次请求
OSI 七层是理论模型;工程中常用 TCP/IP 四层(应用、传输、网络、网络接口)。HTTP、DNS、SMTP 属于应用层,TCP/UDP 属于传输层,IP 属于网络层。回答分层题时要说明“模型用于理解职责,真实协议栈不一定严格按七层实现”。
一次典型 HTTPS 请求可概括为:应用层构造 HTTP 报文 -> TCP 建立可靠连接 -> IP 负责寻址和路由 -> 链路层封装成帧。接收端按相反方向解封装。(知识点:数据传输过程)
二、GET/POST 的 wire format
PDF 用报文对比了参数位置:
GET /index.html?name=alice&age=22 HTTP/1.1
Host: example.com
POST /index.html HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
name=alice&age=22
GET 的查询参数位于 URL,POST 的数据通常位于 body;这不等于“GET 一定安全、POST 一定安全”。两者都可能被窃听,真正的保密性来自 HTTPS;幂等性、缓存和业务语义才是方法选择的核心。(知识点:GET 与 POST 的区别对比)
三、TCP 连接管理对 HTTP 的影响
三次握手用 SYN/SYN-ACK/ACK 同步双方初始序列号;关闭连接时,双方的发送方向可以独立结束,因此通常看到 FIN、ACK、FIN、ACK 四个报文。主动关闭方会经历 TIME_WAIT,用于等待旧报文消失和重传最终 ACK。
HTTP/1.1 的 Connection: keep-alive 允许同一 TCP 连接承载多个请求,减少反复握手;连接池和合理超时通常比盲目调小 TIME_WAIT 更可靠。HTTP/2 的多路复用把多个 stream 放在同一连接上,但底层 TCP 丢包仍可能造成连接级队头阻塞。(知识点:TCP 连接管理)
四、协商缓存:四个头部如何配合
PDF 同时列出时间和实体标签两套校验方式:
| 首次响应 | 后续请求 | 命中时响应 |
|---|---|---|
Last-Modified |
If-Modified-Since |
304 Not Modified |
ETag |
If-None-Match |
304 Not Modified |
ETag 通常比时间戳更精确,适合内容可能在同一秒内变化的资源;Cache-Control/Expires 决定是否可以直接使用新鲜缓存,只有需要服务器再次验证时才会出现条件请求。 304 不携带完整资源体,客户端继续使用本地副本。
Cookie 则是另一条状态链:服务端用 Set-Cookie 下发,后续请求用 Cookie 回传。会话 Cookie 应结合 Secure、HttpOnly、SameSite 和过期时间配置,不能把它和 HTTP 缓存头混为一谈。(知识点:协商缓存)
五、HTTP 版本追问
- HTTP/1.0 默认短连接,常需每个请求重新建立 TCP。
- HTTP/1.1 默认持久连接,增加 Host、分块传输和更多方法;管道化实际部署有限,队头阻塞仍明显。
- HTTP/2 使用二进制分帧、stream 多路复用和 HPACK 头部压缩;一个页面的 CSS/JS 请求可共享连接,不必为每个资源新建 TCP。
版本升级不会自动解决所有性能问题:大响应仍需压缩/缓存,丢包场景下 HTTP/2 仍受 TCP 影响。是否启用某版本还要看 TLS、代理和客户端协商能力。(知识点:HTTP/3 与 QUIC)
六、HTTPS 的安全边界
TLS 握手阶段,客户端验证服务端证书和域名,双方通过非对称密码学协商会话密钥;握手完成后通常用对称加密传输数据,并通过认证码保证完整性。HTTPS 提供机密性、身份认证和完整性,但不会替应用层校验权限,也不能阻止服务端主动泄露数据。
证书校验失败、过期或域名不匹配时不能简单“忽略错误”;生产环境应使用可信 CA、限制 TLS 版本,并启用 HSTS 评估降级风险。(知识点:数字证书验证)
七、CDN 与 DNS 调度
PDF 的链路是“业务域名 CNAME 到 CDN 域名 -> CDN DNS 根据地域/网络返回边缘节点 IP -> 边缘节点命中缓存或回源”:
- 本地 DNS 递归查询 CNAME 和 A/AAAA 记录。
- CDN DNS 根据客户端网络、地域和节点健康度选择边缘 IP。
- 边缘节点检查 TTL 内的缓存;未命中时向源站回源并缓存响应。
CDN 加速的是靠近用户的静态/可缓存内容;带用户身份的动态响应要设置正确的缓存键和 Cache-Control,否则可能泄露跨用户数据。排查“域名能解析但访问慢”时分别测 DNS、到边缘节点的 RTT、缓存命中率和回源耗时。(知识点:CDN 多级缓存架构)
八、DNS、hosts 与地址栏链路
域名解析通常先查浏览器/系统缓存和 hosts,再由递归 DNS 服务器向权威 DNS 查询。 hosts 命中时可以绕过公网 DNS,因此常用于本地联调,也可能造成“只有本机访问异常”。
地址栏输入 URL 后的面试回答顺序可以是:解析协议和主机名 -> DNS 得到 IP -> TCP 三次握手 -> HTTPS 时进行 TLS 握手 -> 发送请求行/头/body -> 接收状态码/头/body -> 根据 HTML/CSS/JS 继续发起子资源请求并渲染。(知识点:DNS 完整查询流程)
九、WebSocket 握手与长连接
WebSocket 先用 HTTP Upgrade 建立连接。典型请求包含 Upgrade: websocket、Connection: Upgrade、Sec-WebSocket-Key 和版本号,服务端成功后返回 101 Switching Protocols 以及 Sec-WebSocket-Accept。之后协议切换为 WebSocket 帧,不再为每条消息重复发送完整 HTTP 请求头。
ws://example.com/chat # 明文 TCP
wss://example.com/chat # WebSocket over TLS
生产实现要处理心跳 Ping/Pong、断线重连、连接上限和鉴权;wss 只保护传输链路,消息仍需校验权限和长度。(知识点:连接管理)
十、场景题速答
为什么请求状态是 304 但页面仍显示旧内容?
304 的含义就是“验证后资源未修改”,浏览器应复用本地副本。先检查缓存键、ETag/Last-Modified 是否由代理改写,再确认发布是否更新了资源版本或文件名。(知识点:协商缓存)
HTTP/2 仍然卡顿怎么查?
检查单个 TCP 连接的丢包和 RTT、是否存在单个超大的未压缩响应、服务端是否阻塞,以及 CDN/浏览器缓存是否命中。不要只把问题归因于“HTTP/2 多路复用”。(知识点:HTTP/2 的队头阻塞问题)