目录

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.1POST /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 OKHTTP/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-8application/jsonimage/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请求完整生命周期

  1. 域名解析:客户端通过DNS系统,将请求的域名解析为对应的IP地址与端口号,优先读取本地DNS缓存,无缓存则向上级DNS服务器发起查询。
  2. 连接建立:根据HTTP版本与协议类型,建立对应的传输层连接:HTTP建立TCP三次握手;HTTPS额外完成TLS 1.2/1.3加密握手,建立安全加密通道。
  3. 请求发送:客户端构建完整的HTTP请求报文,将其拆分为TCP数据包,通过已建立的连接发送到服务端。
  4. 服务端处理:服务端接收TCP数据包,重组为完整的HTTP请求报文,解析请求方法、URI、头部、请求体,路由到对应的业务处理程序,执行业务逻辑,生成响应报文。
  5. 响应返回:服务端将响应报文拆分为TCP数据包,通过连接发送回客户端。
  6. 连接管理:客户端与服务端根据Connection头部与协议版本,决定关闭TCP连接,还是保持连接复用后续请求。
  7. 客户端处理:客户端接收完整的响应报文,解析状态码、响应头、响应体,根据响应内容完成页面渲染、数据处理、资源缓存、重定向跳转等操作。