💻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):用于数据传输(快)
流程:
- TLS 握手时用非对称加密协商出对称密钥
- 后续数据传输用对称密钥加密
- 兼顾安全性和性能
为什么不全用非对称加密:
- 非对称加密比对称加密慢 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 · 计算机网络