HTTP 协议详解
HTTP(HyperText Transfer Protocol,超文本传输协议)是万维网的数据通信基础协议,用于在客户端(通常是浏览器)和服务器之间传输超文本。定义在 RFC 9110(HTTP Semantics)等系列标准中。
1. HTTP 协议概述
基本概念
- 作用:Web 页面、API 数据传输
- 端口:80(HTTP),443(HTTPS)
- 传输层:基于TCP(HTTP/1.x),QUIC(HTTP/3)
- 无状态:每次请求独立,需要Cookie等机制维护会话
- 请求-响应:客户端发起请求,服务器返回响应
HTTP 版本演进
版本 | 发布年份 | 主要特性 |
---|
HTTP/0.9 | 1991 | 简单GET请求,无头部 |
HTTP/1.0 | 1996 | 请求方法、状态码、头部 |
HTTP/1.1 | 1997/1999 | 持久连接、分块传输、虚拟主机 |
HTTP/2 | 2015 | 二进制、多路复用、头部压缩 |
HTTP/3 | 2022 | QUIC协议,0-RTT,更快连接 |
2. HTTP 请求格式
请求行(Request Line)
方法 请求URI HTTP版本
GET /index.html HTTP/1.1
主要HTTP方法
方法 | 语义 | 幂等性 | 安全 |
---|
GET | 获取资源 | 是 | 是 |
POST | 创建资源 | 否 | 否 |
PUT | 更新/创建资源 | 是 | 否 |
DELETE | 删除资源 | 是 | 否 |
PATCH | 部分更新 | 否 | 否 |
HEAD | 获取头部信息 | 是 | 是 |
OPTIONS | 查询支持方法 | 是 | 是 |
TRACE | 诊断(回环) | 是 | 是 |
请求头部(Headers)
头部 | 说明 | 示例 |
---|
Host | 虚拟主机 | Host: example.com |
User-Agent | 客户端信息 | User-Agent: Mozilla/5.0... |
Accept | 接受的内容类型 | Accept: text/html,application/xhtml+xml |
Authorization | 认证信息 | Authorization: Bearer token123 |
Content-Type | 请求体类型 | Content-Type: application/json |
Content-Length | 请求体长度 | Content-Length: 1234 |
3. HTTP 响应格式
状态行(Status Line)
HTTP版本 状态码 原因短语
HTTP/1.1 200 OK
状态码分类
分类 | 范围 | 含义 |
---|
1xx | 信息响应 | 请求已接收,继续处理 |
2xx | 成功 | 请求成功处理 |
3xx | 重定向 | 需要进一步操作 |
4xx | 客户端错误 | 请求错误 |
5xx | 服务器错误 | 服务器处理失败 |
常用状态码
状态码 | 含义 | 场景 |
---|
200 | OK | 成功 |
201 | Created | 资源创建成功 |
204 | No Content | 成功但无内容 |
301 | Moved Permanently | 永久重定向 |
302 | Found | 临时重定向 |
304 | Not Modified | 资源未修改 |
400 | Bad Request | 请求语法错误 |
401 | Unauthorized | 未认证 |
403 | Forbidden | 禁止访问 |
404 | Not Found | 资源不存在 |
500 | Internal Server Error | 服务器内部错误 |
502 | Bad Gateway | 网关错误 |
503 | Service Unavailable | 服务不可用 |
响应头部
头部 | 说明 | 示例 |
---|
Content-Type | 响应内容类型 | text/html; charset=utf-8 |
Content-Length | 响应体长度 | Content-Length: 1234 |
Set-Cookie | 设置Cookie | Set-Cookie: session=abc123 |
Location | 重定向位置 | Location: /new-url |
Cache-Control | 缓存控制 | Cache-Control: max-age=3600 |
ETag | 实体标签 | ETag: "686897696a7c876b7e" |
4. HTTP/1.1 特性
持久连接(Keep-Alive)
Connection: keep-alive
- 重用TCP连接,减少握手开销
- 通过
Connection: close
关闭
分块传输编码(Chunked Transfer)
Transfer-Encoding: chunked
1a
Hello World
0
- 流式传输,无需预知内容长度
- 每个块以十六进制长度前缀
管道化(Pipelining)
- 在同一TCP连接上连续发送多个请求
- 服务器必须按序响应
- 实际使用中因队头阻塞问题很少使用
5. HTTP/2 特性
二进制协议
多路复用
客户端请求1 → 服务器响应1
↕
客户端请求2 → 服务器响应2 (并行)
头部压缩(HPACK)
服务器推送
:method: GET
:path: /index.html
服务器主动推送相关资源:
:method: GET
:path: /style.css
:status: 200
流控制和优先级
6. HTTP/3 和 QUIC
QUIC 协议特性
- 基于UDP:避免TCP队头阻塞
- 0-RTT:快速连接建立
- 多路复用:内置流隔离
- 连接迁移:支持网络切换
- 内置加密:强制TLS 1.3
HTTP/3 帧类型
帧类型 | 说明 |
---|
DATA | 数据帧 |
HEADERS | 头部帧 |
SETTINGS | 配置参数 |
PUSH_PROMISE | 推送承诺 |
7. Cookie 和会话管理
Cookie 机制
Set-Cookie: sessionId=abc123; Path=/; Domain=example.com; Max-Age=3600; Secure; HttpOnly
Cookie 属性
属性 | 说明 |
---|
Domain | 适用域名 |
Path | 适用路径 |
Max-Age | 生存时间(秒) |
Secure | 仅HTTPS |
HttpOnly | 禁止JS访问 |
SameSite | CSRF防护(Strict/Lax/None) |
8. 缓存机制
缓存头部
Cache-Control: public, max-age=3600, must-revalidate
Expires: Wed, 21 Oct 2025 07:28:00 GMT
ETag: "686897696a7c876b7e"
Last-Modified: Tue, 21 Oct 2024 07:28:00 GMT
验证缓存
If-None-Match: "686897696a7c876b7e"
If-Modified-Since: Tue, 21 Oct 2024 07:28:00 GMT
304 Not Modified 响应
9. 安全相关头部
常用安全头部
头部 | 作用 |
---|
Strict-Transport-Security | 强制HTTPS |
X-Content-Type-Options | 防止MIME嗅探 |
X-Frame-Options | 防止点击劫持 |
Content-Security-Policy | 内容安全策略 |
Referrer-Policy | Referer控制 |
HSTS 示例
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
10. RESTful API 设计
HTTP 方法语义
GET /users # 获取用户列表
GET /users/123 # 获取用户123
POST /users # 创建新用户
PUT /users/123 # 更新用户123
PATCH /users/123 # 部分更新用户123
DELETE /users/123 # 删除用户123
状态码使用
// 201 Created
{
"id": 123,
"name": "John Doe",
"created_at": "2025-01-01T00:00:00Z"
}
// 400 Bad Request
{
"error": "Validation failed",
"details": {
"email": "Invalid format"
}
}
11. HTTPS 和 TLS
TLS 握手流程
- ClientHello:支持的协议版本、密码套件
- ServerHello:选择协议版本、密码套件
- 证书交换:服务器证书验证
- 密钥交换:协商会话密钥
- 完成握手:加密通信开始
TLS 1.3 改进
- 减少往返次数(1-RTT)
- 强制前向保密
- 更安全的密码套件
12. 编程实现示例
Python 使用 requests
import requests
# GET 请求
response = requests.get('https://api.example.com/users',
headers={'Authorization': 'Bearer token'},
params={'page': 1})
# POST 请求
data = {'name': 'John', 'email': 'john@example.com'}
response = requests.post('https://api.example.com/users',
json=data,
headers={'Content-Type': 'application/json'})
print(response.status_code)
print(response.json())
Node.js 使用 fetch
// GET 请求
fetch('https://api.example.com/users', {
method: 'GET',
headers: {
'Authorization': 'Bearer token123',
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
// POST 请求
fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({name: 'John', email: 'john@example.com'})
});
13. 性能优化
压缩
Accept-Encoding: gzip, deflate, br
Content-Encoding: br
连接池
CDN 使用
14. 调试和工具
常见工具
- curl:命令行HTTP客户端
- Postman:API测试工具
- Wireshark:网络抓包
- 浏览器DevTools:网络面板
curl 示例
# GET 请求
curl -v https://example.com
# POST JSON
curl -X POST -H "Content-Type: application/json" \
-d '{"name":"John"}' https://api.example.com/users
# 带认证
curl -u username:password https://api.example.com/protected
常见问题诊断
- CORS:跨域资源共享错误
- TLS握手失败:证书问题
- 504 Gateway Timeout:上游服务超时
- 429 Too Many Requests:限流
HTTP 协议从简单文本协议演进为现代高性能、安全的Web通信基础。通过HTTP/2和HTTP/3的改进,以及HTTPS的普及,HTTP已成为构建现代Web应用和API的核心技术。