# HTTP/HTTPS 协议详解

作者：星苒鸭（xingranya）
发布日期：2026-02-02
更新时间：2026-02-02
原文：https://blog.xran.uk/http-https-protocol-guide/

每次你在浏览器地址栏输入一个网址，按下回车，短短几百毫秒内，一个完整的网页就呈现在你眼前。但你有没有想过，这背后发生了什么？今天我们就来深入了解一下 Web 世界的基础——HTTP 和 HTTPS 协议。

### HTTP 请求响应流程

HTTP（HyperText Transfer Protocol，超文本传输协议）是 Web 世界的基础语言。当你在浏览器访问一个网站时，大致会经历这样的流程：

```
客户端                      服务器
  |                          |
  |-------- 1. 请求 -------->|
  |      GET /index.html     |
  |                          |
  |<------- 2. 响应 ---------|
  |    200 OK + HTML内容     |
  |                          |
  |-------- 3. 请求 -------->|
  |      GET /style.css      |
  |                          |
  |<------- 4. 响应 ---------|
  |    200 OK + CSS内容      |
```

一个简单的 HTTP 请求示例：

```http
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
```

对应的响应：

```http
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Date: Mon, 01 Jan 2026 00:00:00 GMT

<!DOCTYPE html>
<html>
<head><title>欢迎</title></head>
<body>
  <h1>Hello, World!</h1>
</body>
</html>
```

### 请求方法

HTTP 定义了多种请求方法，最常用的是这几个：

**GET - 获取资源**

```bash
# 获取页面内容
GET /index.html HTTP/1.1

# 带参数的请求
GET /search?q=hello&page=1 HTTP/1.1
```

GET 请求的特点：

- 参数在 URL 中可见
- 可以被缓存
- 可以被收藏为书签
- 不应该用于修改服务器数据

**POST - 提交数据**

```http
POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "username": "admin",
  "password": "secret"
}
```

POST 请求的特点：

- 数据在请求体中
- 不会被缓存
- 常用于表单提交、API 调用
- 可以提交大量数据

**其他方法**

| 方法      | 描述           | 示例             |
| --------- | -------------- | ---------------- |
| `PUT`     | 更新资源       | 更新用户资料     |
| `PATCH`   | 部分更新       | 修改文章标题     |
| `DELETE`  | 删除资源       | 删除一条评论     |
| `HEAD`    | 获取响应头     | 检查资源是否存在 |
| `OPTIONS` | 查询支持的方法 | CORS 预检请求    |

### 状态码详解

每次 HTTP 响应都会带有一个状态码，告诉你请求的结果。

**2xx - 成功**

| 状态码         | 含义     | 说明                  |
| -------------- | -------- | --------------------- |
| 200 OK         | 请求成功 | 最常见的成功状态      |
| 201 Created    | 已创建   | POST 请求成功创建资源 |
| 204 No Content | 无内容   | 成功但无返回内容      |

**3xx - 重定向**

| 状态码                | 含义       | 说明                   |
| --------------------- | ---------- | ---------------------- |
| 301 Moved Permanently | 永久重定向 | 资源已永久移动到新 URL |
| 302 Found             | 临时重定向 | 资源临时移动           |
| 304 Not Modified      | 未修改     | 资源未改变，可使用缓存 |

**4xx - 客户端错误**

| 状态码                | 含义     | 说明               |
| --------------------- | -------- | ------------------ |
| 400 Bad Request       | 请求错误 | 请求格式有问题     |
| 401 Unauthorized      | 未授权   | 需要登录           |
| 403 Forbidden         | 禁止访问 | 登录了但权限不够   |
| 404 Not Found         | 未找到   | 最常见！资源不存在 |
| 429 Too Many Requests | 请求过多 | 被限流了           |

**5xx - 服务器错误**

| 状态码                    | 含义           | 说明               |
| ------------------------- | -------------- | ------------------ |
| 500 Internal Server Error | 服务器内部错误 | 服务器出 bug 了    |
| 502 Bad Gateway           | 网关错误       | 上游服务器无响应   |
| 503 Service Unavailable   | 服务不可用     | 服务器过载或维护中 |
| 504 Gateway Timeout       | 网关超时       | 上游服务器响应太慢 |

> **小技巧**：看到 4xx 错误，先检查自己的请求是否有问题；看到 5xx 错误，那基本是服务器的问题，只能等管理员修复了哈哈哈哈。

### HTTPS 与 SSL/TLS 原理

HTTP 是明文传输的，这意味着数据在传输过程中可能被窃听、篡改。HTTPS（HTTP Secure）通过 SSL/TLS 加密解决了这个问题。

**HTTPS 的工作原理**

```
客户端                              服务器
  |                                  |
  |-------- 1. ClientHello -------->|
  |      (支持的加密方法)              |
  |                                  |
  |<------- 2. ServerHello ---------|
  |   (选择的加密方法 + 证书)          |
  |                                  |
  |-------- 3. 验证证书 ------------->|
  |   (检查证书是否可信)              |
  |                                  |
  |<------- 4. 密钥交换 -------------|
  |   (协商会话密钥)                  |
  |                                  |
  |======== 5. 加密通信 =============>|
  |   (使用会话密钥加密数据)          |
```

**SSL/TLS 握手过程简化版**

1. 客户端告诉服务器自己支持的加密套件
2. 服务器选择一个加密套件，并发送数字证书
3. 客户端验证证书（由 CA 签名，包含公钥）
4. 客户端生成随机密钥，用服务器公钥加密发送
5. 服务器用私钥解密得到随机密钥
6. 双方使用这个密钥进行对称加密通信

### 证书申请与配置

**申请免费 SSL 证书（Let's Encrypt + Certbot）**

```bash
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx

# 申请证书（自动配置 Nginx）
sudo certbot --nginx -d example.com -d www.example.com

# 只申请证书（手动配置）
sudo certbot certonly --nginx -d example.com
```

**Nginx 配置 HTTPS**

```nginx
server {
    listen 443 ssl http2;
    server_name example.com;

    # SSL 证书路径
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL 协议和加密套件
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # SSL 会话缓存
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        root /var/www/html;
        index index.html;
    }
}

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}
```

**证书自动续签**

Let's Encrypt 的证书有效期为 90 天，需要定期续签。Certbot 会自动创建一个定时任务，你也可以手动测试：

```bash
# 测试续签（不实际续签）
sudo certbot renew --dry-run

# 手动续签
sudo certbot renew
```

### HTTP/2 和 HTTP/3 介绍

**HTTP/2**

HTTP/2 在 2015 年发布，主要改进：

- **多路复用**：一个 TCP 连接可以并发传输多个请求
- **头部压缩**：减少传输的数据量
- **服务器推送**：服务器可以主动推送资源
- **二进制协议**：更高效的数据传输

在 Nginx 中启用 HTTP/2：

```nginx
server {
    listen 443 ssl http2;  # 添加 http2 即可
    # ... 其他配置
}
```

**HTTP/3（QUIC）**

HTTP/3 是最新的版本，基于 QUIC 协议（基于 UDP）：

- **解决队头阻塞**：HTTP/2 在 TCP 层面仍有队头阻塞问题
- **更快的连接建立**：0-RTT 连接建立
- **更好的网络切换**：移动设备网络切换更流畅

```nginx
# Nginx 支持 HTTP/3 需要额外配置
server {
    listen 443 quic;
    listen 443 ssl http2;
    # ... 其他配置
}
```

### 总结

HTTP/HTTPS 是 Web 开发的基础，理解它们能让你：

1. **更好地调试**：知道状态码的含义，快速定位问题
2. **优化性能**：理解缓存、连接复用等机制
3. **保障安全**：知道 HTTPS 的重要性，正确配置证书
4. **选择合适协议**：了解 HTTP/2 和 HTTP/3 的优势

关键知识点回顾：

- **HTTP 方法**：GET 获取数据，POST 提交数据，PUT 更新，DELETE 删除
- **状态码**：2xx 成功，3xx 重定向，4xx 客户端错误，5xx 服务器错误
- **HTTPS**：通过 SSL/TLS 加密，保护数据安全
- **HTTP/2/3**：不断演进，追求更快的速度

掌握了这些，你对 Web 通信的理解就上了一个新台阶。接下来可以深入了解：

- HTTP 缓存机制
- CORS 跨域问题
- WebSocket 实时通信
- HTTP 压缩和优化技巧

记住，HTTP 就像快递系统，你下单（请求），商家发货（响应），快递员送到。理解了这个流程，Web 开发的很多问题就迎刃而解了！
