💻CS 计算机网络

HTTP 与 HTTPS

难度:⭐ | 高频指数:🔥🔥

面试回答

常见问法

  • HTTP 1.0、1.1、2.0、3.0 有什么区别?
  • HTTPS 和 HTTP 有什么区别?
  • TLS 握手的过程是什么?
  • 常见的 HTTP 状态码有哪些?
  • HTTPS 怎么保证安全的?证书验证流程是什么?

回答

HTTP 版本演进:

版本关键特性解决的问题
HTTP/1.0短连接,每次请求新建 TCP 连接基础功能
HTTP/1.1长连接(Keep-Alive)、管线化、分块传输减少连接开销
HTTP/2多路复用、头部压缩、服务器推送、二进制帧队头阻塞(应用层)
HTTP/3基于 QUIC(UDP)、0-RTT、无队头阻塞TCP 队头阻塞

HTTPS = HTTP + TLS

  • HTTP 明文传输,不安全
  • HTTPS 在 HTTP 和 TCP 之间加了 TLS 层,提供加密、认证、完整性保护
  • 默认端口:HTTP 80,HTTPS 443

常见状态码:

  • 200 OK、201 Created、204 No Content
  • 301 永久重定向、302 临时重定向、304 Not Modified
  • 400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found
  • 500 Internal Server Error、502 Bad Gateway、503 Service Unavailable

追问

1. HTTP/1.1 的队头阻塞问题?

HTTP/1.1 虽然支持管线化(一次发多个请求),但响应必须按请求顺序返回。如果第一个请求处理慢,后面的响应都要等着。HTTP/2 通过多路复用解决了这个问题。

2. HTTP/2 的多路复用是什么?

在一个 TCP 连接上同时传输多个请求和响应,每个请求/响应是一个独立的”流”(stream),互不阻塞。通过帧(frame)来标识属于哪个流。

3. HTTP/3 为什么用 UDP?

TCP 有传输层队头阻塞:一个包丢失,后面所有包都要等重传。HTTP/2 的多路复用在 TCP 上仍然受此影响。QUIC 基于 UDP,每个流独立,一个流丢包不影响其他流。


原理展开

1. HTTP/1.1 的关键改进

长连接(Keep-Alive):

HTTP/1.0:请求1 → 建TCP → 传数据 → 断TCP → 请求2 → 建TCP → ...
HTTP/1.1:建TCP → 请求1 → 请求2 → 请求3 → ... → 断TCP

其他改进:

  • Host 头部:支持虚拟主机(一个 IP 多个域名)
  • 分块传输编码(chunked):不需要预先知道内容长度
  • 缓存控制:Cache-Control、ETag、If-None-Match

2. HTTP/2 核心特性

二进制帧:

  • HTTP/1.x 是文本协议,HTTP/2 是二进制协议
  • 更高效的解析,更少的错误

多路复用:

HTTP/1.1(串行):
连接1:请求A → 响应A → 请求B → 响应B
连接2:请求C → 响应C

HTTP/2(并行):
连接1:帧A1 帧C1 帧B1 帧A2 帧C2 帧B2 ...
(多个流的帧交错传输)

头部压缩(HPACK):

  • HTTP 头部有大量重复(Cookie、User-Agent 等)
  • HPACK 用静态表 + 动态表 + 哈夫曼编码压缩
  • 减少 80%+ 的头部大小

服务器推送:

  • 服务器可以主动推送客户端可能需要的资源
  • 如请求 HTML 时主动推送 CSS 和 JS

3. TLS 握手过程(TLS 1.2)

客户端                          服务端
  │                              │
  │── ClientHello ──────────────→│  支持的加密套件、随机数
  │                              │
  │←── ServerHello ──────────────│  选定的加密套件、随机数
  │←── Certificate ──────────────│  服务端证书
  │←── ServerHelloDone ──────────│
  │                              │
  │── ClientKeyExchange ────────→│  预主密钥(用服务端公钥加密)
  │── ChangeCipherSpec ─────────→│  切换到加密通信
  │── Finished ─────────────────→│
  │                              │
  │←── ChangeCipherSpec ─────────│
  │←── Finished ─────────────────│
  │                              │
  │     加密通信开始              │

TLS 1.3 的改进:

  • 握手从 2-RTT 减少到 1-RTT
  • 支持 0-RTT(恢复会话时)
  • 移除不安全的加密算法
  • 更简洁的握手流程

4. 证书验证流程

1. 服务端发送证书链(服务端证书 + 中间 CA 证书)
2. 客户端用中间 CA 的公钥验证服务端证书的签名
3. 客户端用根 CA 的公钥验证中间 CA 证书的签名
4. 根 CA 证书预装在操作系统/浏览器中
5. 检查证书有效期、域名匹配、是否被吊销(CRL/OCSP)

证书链:

根 CA(预装在系统中,自签名)
  └── 中间 CA(根 CA 签发)
        └── 服务端证书(中间 CA 签发)

5. HTTPS 的加密方式

混合加密:

  • 非对称加密(RSA/ECDHE):用于密钥交换(慢但安全)
  • 对称加密(AES):用于数据传输(快)

流程:

  1. TLS 握手时用非对称加密协商出对称密钥
  2. 后续数据传输用对称密钥加密
  3. 兼顾安全性和性能

为什么不全用非对称加密:

  • 非对称加密比对称加密慢 100-1000 倍
  • 不适合大量数据传输

6. HTTP 缓存机制

强缓存:

  • Cache-Control: max-age=3600:缓存 1 小时
  • Expires:过期时间(HTTP/1.0,已过时)
  • 命中强缓存直接用本地缓存,不发请求

协商缓存:

  • ETag / If-None-Match:基于内容哈希
  • Last-Modified / If-Modified-Since:基于修改时间
  • 发请求问服务器,返回 304 表示没变化

7. HTTP 方法语义

方法语义幂等安全
GET获取资源
POST创建资源
PUT替换资源
DELETE删除资源
PATCH部分更新
HEAD获取头部
OPTIONS查询支持的方法

易错点

  • 说”HTTPS 比 HTTP 慢很多”——现代硬件下 TLS 开销很小,主要是握手多 1-2 RTT。
  • 混淆对称加密和非对称加密的用途——非对称用于密钥交换,对称用于数据传输。
  • 说”HTTP/2 解决了所有队头阻塞”——HTTP/2 解决了应用层队头阻塞,但 TCP 层的队头阻塞仍在。
  • 不知道 HTTP/3 基于 QUIC/UDP——这是近年面试热点。
  • 混淆 301 和 302——301 永久重定向(浏览器缓存),302 临时重定向。
  • 说”证书是用来加密的”——证书是用来认证身份的,加密是通过协商的对称密钥完成的。

记忆技巧

  • HTTP 版本演进:短连接 → 长连接 → 多路复用 → 换 UDP
  • HTTPS 一句话:非对称换密钥,对称传数据,证书验身份
  • TLS 握手记忆:Hello 交换参数 → 证书验身份 → 密钥交换 → 加密开始
  • 状态码分类:2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误
  • HTTP/2 三大特性:多路复用、头部压缩、服务器推送

面试速答版

HTTP/1.1 引入长连接和管线化,HTTP/2 引入多路复用、头部压缩和二进制帧解决应用层队头阻塞,HTTP/3 基于 QUIC(UDP)解决 TCP 层队头阻塞。HTTPS = HTTP + TLS,通过非对称加密交换对称密钥,然后用对称密钥加密数据传输。TLS 握手过程:交换支持的加密套件和随机数、服务端发证书、客户端验证证书并交换密钥、双方切换到加密通信。证书验证是沿证书链逐级验签,直到预装的根 CA。

Related · 计算机网络