HTTP 协议详细总结
HTTP协议超详细总结
HTTP(HyperText Transfer Protocol,超文本传输协议)是基于TCP/IP协议族的应用层通信协议,是万维网(WWW)数据交互的基石,定义了客户端(浏览器、App、爬虫等)与服务端之间的报文格式、交互规则与通信流程。它是一种请求-响应模式、无状态、通用可扩展的协议,默认使用80端口(HTTP)、443端口(HTTPS),核心设计理念是资源导向——互联网上所有内容都可被视为资源,通过URL(统一资源定位符)唯一标识与寻址。
一、HTTP协议版本演进全历程
HTTP从诞生至今经历了5个核心版本迭代,核心优化方向始终围绕降低延迟、提升性能、增强安全、解决队头阻塞展开。
| 版本 | 发布时间 | 核心规范 | 核心特性 | 解决的核心问题 | 遗留缺陷 |
|---|---|---|---|---|---|
| HTTP/0.9 | 1991年 | 无正式RFC | 仅支持GET方法;无请求头/响应头/状态码;仅支持HTML传输;短连接,请求完成立即关闭TCP连接 | 实现实验室环境下的超文本文件传输 | 功能极度简陋,无任何扩展性 |
| HTTP/1.0 | 1996年 | RFC 1945 | 引入版本号、状态码、Header头部体系;支持图片、视频、二进制等多种数据类型;新增POST、HEAD方法;可选长连接 | 实现标准化的Web通信,支持丰富的媒体类型 | 默认短连接,每个请求都需新建/销毁TCP连接,握手开销极大,网络利用率极低 |
| HTTP/1.1 | 1997/1999年 | RFC 2616 → RFC 7230-7235 | 默认开启持久连接(Keep-Alive);支持管道化请求;强制Host头部(实现虚拟主机);分块传输(Chunked);增强缓存控制(Cache-Control/ETag);新增PUT/DELETE/OPTIONS/CONNECT/TRACE方法 | 解决1.0版本连接频繁创建销毁的开销,大幅提升传输效率 | 应用层队头阻塞(HoL):同一TCP连接中,请求必须按顺序响应,单个慢请求会阻塞后续所有请求 |
| HTTP/2 | 2015年 | RFC 7540 | 二进制帧传输替代明文文本;单TCP连接多路复用;HPACK头部压缩;服务器主动推送;流优先级控制 | 彻底解决应用层队头阻塞,大幅降低头部冗余,提升高并发场景性能 | 底层TCP协议仍存在队头阻塞,TCP丢包会阻塞连接内所有流 |
| HTTP/3 | 2022年 | RFC 9114 | 基于QUIC协议(UDP封装);彻底解决全链路队头阻塞;0-RTT/1-RTT快速握手;内置TLS 1.3加密;支持连接迁移 | 解决TCP层队头阻塞,大幅降低握手延迟,提升弱网/网络切换场景的稳定性 | 部分老旧设备、网络环境对UDP的支持与优化不足 |
二、HTTP核心报文结构
HTTP报文分为请求报文(客户端→服务端)和响应报文(服务端→客户端),两者结构高度一致,均由4部分组成,核心差异在于首行格式与头部字段语义。
1. 请求报文结构
# 请求行(必填,唯一一行)
<请求方法> <请求URI> <HTTP版本>
# 请求头(0个或多个,每行一个键值对)
Header-Name1: Value1
Header-Name2: Value2
...
# 空行(必填,CRLF回车换行,标识头部结束)
# 请求体(可选,GET/HEAD方法通常无请求体)
请求数据(JSON/表单/文件等)- 请求行:定义请求的核心意图,示例:
GET /api/user?id=1 HTTP/1.1、POST /api/login HTTP/1.1 - 请求头:控制请求行为、传递客户端信息、认证凭证等,是HTTP可扩展性的核心载体
- 空行:是头部与请求体的唯一分隔符,缺失会导致服务端解析失败
- 请求体:用于提交大量数据,仅POST/PUT/PATCH等方法携带,格式由
Content-Type指定
2. 响应报文结构
# 状态行(必填,唯一一行)
<HTTP版本> <状态码> <状态描述>
# 响应头(0个或多个,每行一个键值对)
Header-Name1: Value1
Header-Name2: Value2
...
# 空行(必填,CRLF回车换行,标识头部结束)
# 响应体(可选,204/304等状态码无响应体)
响应数据(HTML/JSON/图片/视频等)- 状态行:定义请求的处理结果,示例:
HTTP/1.1 200 OK、HTTP/1.1 404 Not Found - 响应头:控制响应行为、传递服务端信息、资源元数据、缓存规则等
- 空行:分隔头部与响应体,解析规则与请求报文一致
- 响应体:服务端返回的核心资源数据,是客户端请求的最终目标
三、HTTP标准请求方法详解
HTTP请求方法(也叫HTTP动词)是客户端向服务端声明的操作意图,每个方法都有严格约定的语义与使用规范,核心分为安全方法、幂等方法两大维度:
- 安全方法:仅获取资源,不会修改服务端状态、产生副作用,包括GET、HEAD、OPTIONS
- 幂等方法:多次执行完全相同的请求,最终结果一致,无额外副作用,包括GET、HEAD、PUT、DELETE、OPTIONS、TRACE
| 方法 | 核心用途 | 安全/幂等 | 核心使用场景 | 关键特性 |
|---|---|---|---|---|
| GET | 从服务端获取指定资源 | 安全/幂等 | 页面加载、数据查询、资源获取 | 参数拼接在URL中,无请求体;浏览器默认缓存;URL长度受浏览器/服务端限制(通常建议不超过2KB) |
| HEAD | 与GET完全一致,但仅返回响应头,无响应体 | 安全/幂等 | 检查资源是否存在、校验缓存有效性、探测资源大小 | 无需下载完整资源,可快速获取元数据 |
| POST | 向服务端提交实体数据,通常用于创建资源 | 非安全/非幂等 | 用户注册、表单提交、文件上传、订单创建 | 数据放在请求体中,无长度限制;浏览器默认不缓存;多次提交可能产生重复数据 |
| PUT | 用请求体全量替换目标资源的所有内容 | 非安全/幂等 | 全量更新用户信息、替换完整文件 | 多次执行结果完全一致,要求请求体包含资源的完整数据 |
| DELETE | 删除指定的目标资源 | 非安全/幂等 | 删除用户、删除文件、注销订单 | 多次删除同一资源,最终结果一致,服务端通常返回204无内容 |
| PATCH | 对目标资源进行部分增量修改 | 非安全/通常非幂等 | 更新用户昵称、修改商品库存 | 区别于PUT的全量替换,仅需传递要修改的字段,减少传输数据量 |
| CONNECT | 建立到目标资源的TCP隧道 | 非安全/非幂等 | HTTPS正向代理、VPN穿透 | 让代理服务器转发客户端与目标服务器的TCP通信,实现隧道穿透 |
| OPTIONS | 获取目标资源支持的通信选项与能力 | 安全/幂等 | 跨域CORS预检请求、探测服务端支持的方法 | 服务端通过Allow头部返回支持的请求方法,无需身份认证即可发起 |
| TRACE | 回显服务端收到的原始请求报文 | 安全/幂等 | 网络诊断、排查代理服务器修改请求的问题 | 服务端将收到的请求原封不动返回,客户端可对比校验请求是否被篡改 |
四、HTTP状态码全分类与核心场景
HTTP状态码是3位数字,用于服务端向客户端明确告知请求的处理结果,第一位数字定义状态码的类别,共分为5大类,覆盖了从请求接收、处理成功、重定向、客户端错误到服务端错误的全场景。
1xx:信息性状态码(请求已接收,正在处理)
用于临时响应,告知客户端请求已被服务端接收,需等待后续处理,HTTP/1.0不支持1xx状态码。
- 100 Continue:服务端已接收请求头,客户端应继续发送请求体,用于大文件上传场景的预检
- 101 Switching Protocols:服务端已同意客户端的协议升级请求(通过Upgrade头部),即将切换协议,常用于HTTP切换WebSocket
- 103 Early Hints:提前返回部分响应头,允许客户端预加载资源,优化页面首屏加载性能
2xx:成功状态码(请求已成功处理)
- 200 OK:请求完全成功,服务端已返回对应资源,是最常用的成功状态码
- 201 Created:资源创建成功,通常对应POST/PUT请求,响应头Location会返回新资源的URI
- 204 No Content:请求成功,但无响应体,常用于删除、更新操作成功的场景
- 206 Partial Content:范围请求成功,仅返回资源的一部分,对应断点续传、视频分片加载场景
3xx:重定向状态码(需客户端进一步操作完成请求)
- 301 Moved Permanently:永久重定向,资源URI已永久变更,搜索引擎会更新索引,浏览器会缓存重定向结果
- 302 Found:临时重定向,资源URI临时变更,客户端应继续使用原URI访问
- 304 Not Modified:资源未修改,协商缓存命中,客户端直接使用本地缓存,无响应体
- 307 Temporary Redirect:临时重定向,严格保留原请求方法与请求体(302可能会将POST转为GET)
- 308 Permanent Redirect:永久重定向,严格保留原请求方法与请求体
4xx:客户端错误状态码(请求有误,服务端无法/拒绝处理)
- 400 Bad Request:请求语法错误、参数无效,服务端无法理解与处理
- 401 Unauthorized:未认证,客户端需携带有效的身份凭证(登录、Token)才能访问资源
- 403 Forbidden:服务端拒绝访问,客户端已认证,但无对应资源的操作权限
- 404 Not Found:资源不存在,请求的URI无效或资源已被删除
- 405 Method Not Allowed:请求方法不被目标资源支持,服务端会通过Allow头部返回支持的方法
- 408 Request Timeout:请求超时,服务端等待客户端发送完整请求的时间超出限制
- 409 Conflict:请求冲突,通常是资源已存在、版本冲突、数据状态不匹配
- 413 Payload Too Large:请求体过大,超出服务端处理上限,拒绝处理
- 429 Too Many Requests:客户端请求频率超限,被服务端限流拦截
5xx:服务端错误状态码(服务端处理请求时发生异常)
- 500 Internal Server Error:服务端内部未知错误,是最通用的服务端错误码
- 501 Not Implemented:服务端不支持请求的方法,无法完成处理
- 502 Bad Gateway:网关/代理服务器收到上游服务端的无效响应
- 503 Service Unavailable:服务端暂时不可用,通常是服务过载、停机维护、熔断降级
- 504 Gateway Timeout:网关/代理服务器请求上游服务端超时,未在规定时间内收到响应
五、核心HTTP头部字段分类详解
HTTP头部(Header)是键值对格式的扩展字段,是HTTP协议灵活性与可扩展性的核心,分为4大类,覆盖了连接管理、缓存控制、内容协商、身份认证、安全防护等全场景。
1. 通用头部(请求/响应报文均可使用)
| 字段名 | 核心作用 | 常见取值 |
|---|---|---|
| Connection | 控制TCP连接的复用行为 | keep-alive(持久连接)、close(请求完成关闭连接)、upgrade(协议升级) |
| Cache-Control | 全局缓存策略控制,优先级最高 | max-age=xxx(强缓存有效期)、no-cache(强制协商缓存)、no-store(禁止缓存)、public/private(缓存范围) |
| Date | 报文创建的时间 | 标准GMT格式,例:Date: Tue, 15 Apr 2025 07:28:00 GMT |
| Upgrade | 协议升级声明 | HTTP/2.0、websocket、TLS/1.3 |
| Via | 报文经过的代理/网关路径 | 用于追踪请求转发链路,防止循环转发 |
2. 请求头部(仅请求报文使用)
| 字段名 | 核心作用 | 关键说明 |
|---|---|---|
| Host | 目标主机域名与端口 | HTTP/1.1强制必填字段,实现单IP服务器托管多个域名(虚拟主机) |
| User-Agent | 客户端标识 | 包含浏览器、操作系统、设备信息,用于服务端适配、爬虫识别 |
| Accept | 客户端可接收的媒体类型 | 例:text/html,application/json;q=0.9,q值为权重,0~1之间 |
| Accept-Encoding | 客户端支持的压缩编码 | 例:gzip, deflate, br,用于减少传输数据量 |
| Accept-Language | 客户端偏好的自然语言 | 例:zh-CN,zh;q=0.9,en;q=0.8,用于多语言内容协商 |
| Authorization | 身份认证凭证 | 常用格式:Bearer <Token>、Basic <base64编码的账号密码> |
| Cookie | 客户端携带的会话Cookie | 服务端通过Set-Cookie设置,后续请求自动携带,用于维持会话状态 |
| Referer | 发起请求的源页面URI | 用于防盗链、访问统计、CSRF防护 |
| If-Modified-Since/If-None-Match | 缓存协商校验字段 | 分别对应Last-Modified和ETag,用于校验资源是否更新 |
3. 响应头部(仅响应报文使用)
| 字段名 | 核心作用 | 关键说明 |
|---|---|---|
| Server | 服务端软件标识 | 例:nginx、Apache、Tomcat,可自定义隐藏以提升安全性 |
| Content-Type | 响应体的媒体类型与字符集 | 例:text/html; charset=utf-8、application/json、image/png |
| Content-Length | 响应体的字节长度 | 用于客户端识别响应体的结束位置,分块传输时不使用该字段 |
| Content-Encoding | 响应体的压缩编码 | 对应客户端Accept-Encoding,告知客户端解压方式 |
| Location | 重定向目标URI | 配合3xx状态码使用,告知客户端跳转地址 |
| Set-Cookie | 服务端向客户端设置Cookie | 可配置过期时间、域名、路径、HttpOnly、Secure、SameSite等属性 |
| ETag | 资源的唯一标识 | 用于协商缓存,优先级高于Last-Modified,解决时间精度不足的问题 |
| Last-Modified | 资源的最后修改时间 | 用于协商缓存,基于时间判断资源是否更新 |
| Access-Control-Allow-* | CORS跨域控制字段 | 例:Access-Control-Allow-Origin,控制跨域请求的权限 |
| Content-Disposition | 响应体的展示方式 | inline(内联展示)、attachment; filename=“xxx.zip”(附件下载) |
六、HTTP核心工作机制
1. 缓存机制
HTTP缓存是提升Web性能的核心机制,核心目标是减少重复网络请求、降低服务器压力、缩短页面加载时间,分为强缓存和协商缓存两级。
- 强缓存:客户端不发送任何请求到服务端,直接读取本地缓存资源。
- 控制字段:
Expires(HTTP/1.0,绝对时间,易受客户端时间影响)、Cache-Control: max-age=xxx(HTTP/1.1,相对时间,优先级更高) - 命中条件:缓存未过期,直接返回200 OK (from disk cache/memory cache)
- 控制字段:
- 协商缓存:强缓存失效后,客户端发送请求到服务端,校验资源是否更新。
- 校验字段:
Last-Modified/If-Modified-Since(基于时间戳)、ETag/If-None-Match(基于资源哈希唯一标识,优先级更高) - 命中结果:资源未更新,服务端返回304 Not Modified,客户端使用本地缓存;资源已更新,服务端返回200 OK和新的资源与缓存规则
- 校验字段:
2. 连接管理
HTTP连接管理的核心是减少TCP连接建立与销毁的开销,降低网络延迟,不同版本的连接模型差异巨大。
- 短连接:HTTP/1.0默认模式,每个请求对应一个独立的TCP连接,请求完成立即关闭连接,三次握手+四次挥手开销极大,仅适用于单次资源请求场景。
- 长连接(持久连接):HTTP/1.1默认模式,通过
Connection: keep-alive实现,一个TCP连接可连续传输多个请求/响应,避免重复的TCP握手与慢启动,大幅提升网络利用率。 - 管道化:HTTP/1.1可选特性,允许客户端在一个TCP连接中并行发送多个请求,无需等待前一个响应返回。但服务端必须按请求顺序返回响应,仍存在队头阻塞,实际生产环境几乎不启用。
- 多路复用:HTTP/2核心特性,将TCP连接拆分为多个独立的二进制流,每个流对应一个请求/响应,流之间并行传输、互不干扰,彻底解决应用层队头阻塞,单连接即可实现高并发请求。
- QUIC连接:HTTP/3核心特性,基于UDP协议封装,流之间完全独立,单个流的丢包重传不会影响其他流,彻底解决传输层队头阻塞;同时支持0-RTT快速握手、连接迁移(WiFi切移动网不中断连接)。
3. 内容协商机制
内容协商是客户端与服务端协商资源的最佳表示形式的机制,核心是通过Accept*请求头与Content-*响应头匹配,确保客户端收到最合适的资源内容。
- 媒体类型协商:
Accept请求头 ↔Content-Type响应头 - 编码协商:
Accept-Encoding请求头 ↔Content-Encoding响应头 - 语言协商:
Accept-Language请求头 ↔Content-Language响应头 - 优先级控制:通过
q值(权重)指定偏好程度,取值范围0~1,值越高优先级越高,未指定则默认q=1.0。
4. 会话管理机制
HTTP协议本身是无状态的,服务端不会存储客户端的任何历史请求信息,每个请求都是完全独立的。为了实现用户登录、购物车等有状态的交互场景,HTTP通过以下三种核心机制实现会话管理。
- Cookie:服务端通过
Set-Cookie响应头向客户端设置会话信息,客户端后续请求会自动在Cookie头中携带对应数据,存储在客户端本地。可通过HttpOnly防止XSS攻击读取、Secure限制仅HTTPS传输、SameSite防止CSRF攻击。 - Session:基于Cookie实现的服务端会话方案,服务端存储完整的会话数据,仅向客户端下发唯一的
Session ID,客户端后续请求携带该ID,服务端即可匹配到对应的会话信息,安全性高于纯Cookie方案。 - Token:无状态会话方案,最常用的是JWT(JSON Web Token),服务端不存储任何会话数据,Token中携带加密的用户信息与签名,客户端将Token放在
Authorization请求头中携带,服务端通过校验签名即可完成身份认证,适用于分布式系统、前后端分离架构。
七、HTTPS与HTTP安全
1. HTTPS核心原理
HTTPS = HTTP + TLS/SSL,默认端口443,RFC 2818标准定义,核心解决HTTP明文传输的三大安全风险:窃听、篡改、冒充。
- 加密:混合加密机制,使用非对称加密(RSA/ECC)安全交换对称密钥,使用对称加密(AES/ChaCha20)加密传输的业务数据,兼顾安全性与传输效率。
- 认证:基于CA机构颁发的数字证书,验证服务端的真实身份,防止中间人攻击伪造服务端。
- 完整性:通过MAC摘要、哈希算法校验传输数据,确保数据在传输过程中未被篡改。
- TLS版本演进:SSL 3.0 → TLS 1.0 → TLS 1.1 → TLS 1.2 → TLS 1.3,当前主流使用TLS 1.2,推荐使用TLS 1.3,握手更快、安全性更高。
2. HTTP常见安全风险与防护方案
| 安全风险 | 核心原理 | 核心防护方案 |
|---|---|---|
| XSS跨站脚本攻击 | 攻击者注入恶意脚本到页面,窃取用户Cookie、伪造用户操作 | 开启CSP内容安全策略;Cookie设置HttpOnly;输入输出内容过滤与转义 |
| CSRF跨站请求伪造 | 攻击者诱导用户在已登录状态下,发起非预期的恶意请求 | Cookie设置SameSite属性;使用Token替代Cookie认证;添加CSRF Token校验 |
| 中间人攻击 | 攻击者拦截客户端与服务端的通信,窃听、篡改传输数据 | 全程使用HTTPS;校验服务端证书合法性;禁用不安全的TLS版本与加密套件 |
| HTTP头注入 | 攻击者在请求头中注入恶意字符,篡改响应头、触发缓存投毒 | 严格校验请求头参数;过滤换行符等特殊字符;禁用危险的头部配置 |
| 敏感信息泄露 | HTTP明文传输账号密码、Token、用户隐私数据 | 全程使用HTTPS;敏感数据加密传输;禁止在URL中携带敏感信息 |
八、HTTP请求完整生命周期
- 域名解析:客户端通过DNS系统,将请求的域名解析为对应的IP地址与端口号,优先读取本地DNS缓存,无缓存则向上级DNS服务器发起查询。
- 连接建立:根据HTTP版本与协议类型,建立对应的传输层连接:HTTP建立TCP三次握手;HTTPS额外完成TLS 1.2/1.3加密握手,建立安全加密通道。
- 请求发送:客户端构建完整的HTTP请求报文,将其拆分为TCP数据包,通过已建立的连接发送到服务端。
- 服务端处理:服务端接收TCP数据包,重组为完整的HTTP请求报文,解析请求方法、URI、头部、请求体,路由到对应的业务处理程序,执行业务逻辑,生成响应报文。
- 响应返回:服务端将响应报文拆分为TCP数据包,通过连接发送回客户端。
- 连接管理:客户端与服务端根据
Connection头部与协议版本,决定关闭TCP连接,还是保持连接复用后续请求。 - 客户端处理:客户端接收完整的响应报文,解析状态码、响应头、响应体,根据响应内容完成页面渲染、数据处理、资源缓存、重定向跳转等操作。