HTTP 协议

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.91991简单GET请求,无头部
HTTP/1.01996请求方法、状态码、头部
HTTP/1.11997/1999持久连接、分块传输、虚拟主机
HTTP/22015二进制、多路复用、头部压缩
HTTP/32022QUIC协议,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服务器错误服务器处理失败

常用状态码

状态码含义场景
200OK成功
201Created资源创建成功
204No Content成功但无内容
301Moved Permanently永久重定向
302Found临时重定向
304Not Modified资源未修改
400Bad Request请求语法错误
401Unauthorized未认证
403Forbidden禁止访问
404Not Found资源不存在
500Internal Server Error服务器内部错误
502Bad Gateway网关错误
503Service Unavailable服务不可用

响应头部

头部说明示例
Content-Type响应内容类型text/html; charset=utf-8
Content-Length响应体长度Content-Length: 1234
Set-Cookie设置CookieSet-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 (并行)
  • 单个TCP连接支持多请求并行
  • 消除队头阻塞

头部压缩(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访问
SameSiteCSRF防护(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-PolicyReferer控制

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 握手流程

  1. ClientHello:支持的协议版本、密码套件
  2. ServerHello:选择协议版本、密码套件
  3. 证书交换:服务器证书验证
  4. 密钥交换:协商会话密钥
  5. 完成握手:加密通信开始

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

连接池

  • 重用TCP连接
  • 减少握手开销

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的核心技术。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注