直接跳到内容

HTTP

介绍

HTTP (Hypertext Transfer Protocol) 是一种应用层协议,用于在万维网上传输超文本数据。它基于客户端-服务器模型,通过请求和响应交换信息,支撑着网页浏览、API 调用等互联网应用。HTTP 设计简单、灵活,且独立于底层传输协议 (如 TCP),但随着互联网发展,其版本不断演进以提升性能和安全。

历史

HTTP 由蒂姆·伯纳斯-李于1989年提出,最初版本 HTTP/0.9 仅支持 GET 方法,用于获取纯文本资源。1996年,HTTP/1.0 引入状态码、头部字段和多方法支持,但每个请求需新建连接,效率低。HTTP/1.1 在1997年标准化,添加持久连接、管道化和缓存机制,成为多年主流。2015年,HTTP/2 推出,采用二进制分帧和多路复用,大幅提升性能。2022年,HTTP/3 基于 QUIC 协议,进一步优化延迟和可靠性。

版本概述

  • HTTP/0.9:极简协议,只支持 GET,无头部。
  • HTTP/1.0:添加方法 (如 POST)、状态码和头部,但连接不持久。
  • HTTP/1.1:引入持久连接、管道化、缓存控制和 Host 头部,解决 1.0 的瓶颈。
  • HTTP/2:二进制协议,支持多路复用、头部压缩和服务器推送,减少延迟。
  • HTTP/3:基于 UDP 的 QUIC 协议,内置加密,避免队头阻塞,提升移动网络性能。

核心特点

无状态性

HTTP 是无状态协议:每个请求独立,服务器不保存客户端上下文。这简化了服务器设计,但需依赖 Cookie 或 Session 管理状态。

客户端请求1 -> 服务器处理 -> 响应
客户端请求2 -> 服务器处理 -> 响应(无记忆前请求)

优点:可扩展性强;缺点:需额外机制 (如令牌) 维持会话。

请求-响应模型

客户端发送请求,服务器返回响应,形成典型循环。

客户端: [请求方法] [URL] [协议版本]
         [头部字段]
         [可选消息体]
服务器: [协议版本] [状态码] [原因短语]
         [头部字段]
         [消息体]

例如,浏览器请求页面,服务器返回 HTML。

可缓存性

HTTP 响应可被缓存 (客户端、代理或服务器),减少重复请求,提升性能。通过头部字段 (如 Cache-Control、ETag) 控制缓存策略。

请求 -> 检查缓存 -> 命中则返回缓存数据,否则转发请求 -> 服务器响应 -> 更新缓存

这降低带宽使用和延迟,尤其适用于静态资源。

方法多样性

HTTP 定义多种请求方法,指示操作意图:

  • GET:获取资源 (安全、幂等)。
  • POST:提交数据 (非幂等,如创建资源)。
  • PUT:更新资源 (幂等)。
  • DELETE:删除资源 (幂等)。
  • HEAD:获取头部,无体。
  • OPTIONS:查询服务器支持方法。 这些方法支持 RESTful 架构,使 API 设计清晰。

文本到二进制演进

早期 HTTP 基于文本,易调试但效率低。HTTP/2 转为二进制分帧,减少解析开销,支持多路复用:

HTTP/1.1: 文本流,请求1 -> 响应1 -> 请求2 -> 响应2(可能阻塞)
HTTP/2: 二进制帧,多个请求/响应交错传输,共享连接

示意图:

客户端: 帧[流1请求] + 帧[流2请求] -> 服务器
服务器: 帧[流1响应] + 帧[流2响应] -> 客户端

这解决队头阻塞,提升并发性能。

灵活性

HTTP 头部字段可扩展,支持自定义元数据 (如 User-Agent、Content-Type),适应各种应用场景。消息体格式不限 (HTML、JSON、二进制),与 MIME 类型结合。

安全增强

通过 HTTPS (HTTP over TLS) 加密传输,防止窃听和篡改。HTTP/2 和 HTTP/3 内置安全特性,如强制 TLS 和 QUIC 的加密。

工作原理

HTTP 通常运行在 TCP 之上 (HTTP/3 用 UDP),客户端 (如浏览器) 发起连接,发送请求,服务器处理并返回响应。过程如下:

  1. 解析 URL,提取协议、主机和路径。
  2. 建立传输层连接 (如 TCP 三次握手)。
  3. 发送 HTTP 请求。
  4. 服务器处理请求,访问资源。
  5. 返回 HTTP 响应。
  6. 客户端解析响应,渲染或处理数据。
  7. 连接可能关闭或重用 (持久连接)。

示例流程:

客户端 -> [TCP连接建立] -> 发送请求 -> 服务器处理 -> 返回响应 -> [连接关闭/保持]

在 HTTP/1.1 中,连接可重用;HTTP/2 中,多路复用允许并行流。

请求格式

HTTP 请求由起始行、头部和可选消息体组成。

  • 起始行:方法、请求 URL、协议版本 (如 GET /index.html HTTP/1.1)。
  • 头部:键值对,如 Host: www.example.comUser-Agent: Mozilla/5.0
  • 消息体:用于 POST 或 PUT,包含数据。

文本示意图:

GET /api/data HTTP/1.1
Host: example.com
Accept: application/json
(空行)
(无消息体)

或 POST 示例:

POST /submit HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 15

name=John&age=30

响应格式

HTTP 响应包括状态行、头部和可选消息体。

  • 状态行:协议版本、状态码、原因短语 (如 HTTP/1.1 200 OK)。
  • 头部:如 Content-Type: text/htmlCache-Control: max-age=3600
  • 消息体:资源数据或错误信息。

文本示意图:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

<html>...</html>

或错误响应:

HTTP/1.1 404 Not Found
Content-Type: text/plain

Resource not found.

状态码

状态码表示请求结果,分五类:

  • 1xx:信息性 (如 100 Continue)。
  • 2xx:成功 (如 200 OK、201 Created)。
  • 3xx:重定向 (如 301 Moved Permanently、304 Not Modified)。
  • 4xx:客户端错误 (如 400 Bad Request、404 Not Found)。
  • 5xx:服务器错误 (如 500 Internal Server Error)。

常见代码示例:

200: 请求成功
404: 资源未找到
500: 服务器内部错误

这些代码帮助客户端处理响应,结合头部实现缓存和重定向。

缓存机制

HTTP 缓存通过头部字段控制,减少网络流量。例如:

  • Cache-Control: max-age=3600:资源缓存 1 小时。
  • ETag: "abc123":资源标识,用于验证。 流程:
客户端请求 -> 检查本地缓存 -> 如果新鲜,直接使用;否则发送条件请求(If-None-Match) -> 服务器返回304或新数据

这提升用户体验,尤其在高延迟网络中。

安全考虑

HTTP 默认不加密,易受中间人攻击。HTTPS 通过 TLS/SSL 加密数据,确保机密性和完整性。示意图:

HTTP: 明文传输 -> 风险
HTTPS: [TLS握手] -> 加密通道 -> 安全传输

现代 HTTP 版本推动全站 HTTPS,HTTP/3 的 QUIC 内置加密,进一步强化安全。

HTTP已经加载完毕