Skip to content

HTTP 与 HTTPS

HTTP 报文结构

HTTP/1.1 是文本报文;HTTP/2、HTTP/3 在语义上仍有方法、头部、状态码和主体,但采用二进制帧传输。

请求报文

http
POST /api/orders?preview=true HTTP/1.1
Host: api.example.com
Accept: application/json
Content-Type: application/json
Content-Length: 18
Authorization: Bearer <token>
Cookie: session_id=abc

{"productId": 42}

组成:请求行(方法、目标、版本)→ 请求头 → 空行 → 可选请求体。

常见请求头:

字段含义
Host目标主机;HTTP/1.1 中必需,用于虚拟主机路由
Accept / Accept-Encoding可接受的媒体类型 / 压缩编码
Content-Type / Content-Length请求体格式 / 长度
Authorization身份认证信息
Cookie请求携带的 Cookie
If-None-Match / If-Modified-Since协商缓存条件
ConnectionHTTP/1.x 连接管理,如 keep-aliveclose

响应报文

http
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: /api/orders/9527
Cache-Control: no-store
Set-Cookie: session_id=abc; HttpOnly; Secure; SameSite=Lax

{"id": 9527}

组成:状态行(版本、状态码、原因短语)→ 响应头 → 空行 → 可选响应体。

常见响应头:Content-TypeContent-LengthCache-ControlETagLast-ModifiedLocationSet-CookieAccess-Control-Allow-OriginContent-Encoding

方法、语义与幂等性

方法常见用途安全(不改变资源语义)幂等
GET获取资源
HEAD仅获取响应头
POST创建资源、提交动作通常否
PUT整体替换指定资源
PATCH部分更新不保证
DELETE删除资源通常是
OPTIONS查询通信选项、CORS 预检

GET 与 POST:避免常见误解

  • GET 的参数通常在 URL 查询串中;POST 的数据通常在请求体中,但 HTTP 规范并不禁止其他形式。
  • URL 更容易出现在历史记录、日志、书签和 Referer 中;但 POST 并不天然安全。传输保密依赖 HTTPS,敏感数据也不应记录在日志中。
  • URL 长度受客户端、代理和服务器限制;POST 请求体也受服务器、网关和配置限制,不是“无限大”。
  • GET 可缓存;POST 也可在明确响应缓存策略时被缓存,只是实践中较少。

常见状态码

分类常用状态码含义
1xx100 Continue请求处理中间响应
2xx200201202204206成功、已创建、已接受、无内容、范围响应
3xx301302304307308永久/临时重定向、缓存未修改、保留方法的重定向
4xx400401403404405429请求错误、需认证、禁止、未找到、方法不允许、限流
5xx500501502503504内部错误、未实现、坏网关、不可用、网关超时

401 表示需要认证(一般伴随 WWW-Authenticate);403 表示服务器理解请求但拒绝授权。304 是协商缓存结果,通常不带响应体,不是重定向。

HTTP 缓存

强缓存

浏览器在缓存仍新鲜时直接使用本地副本,不请求服务器。现代实践以 Cache-Control 为主:

http
Cache-Control: public, max-age=31536000, immutable

Expires 是绝对时间,受客户端时钟影响,已被 max-age 取代但仍可为兼容性保留。常见指令还有 no-store(不存储)、no-cache(可存储但复用前必须验证)、privates-maxage

协商缓存

强缓存过期或策略要求验证时,客户端带条件请求:

http
If-None-Match: "a1b2c3"          # 对应 ETag,优先级更高
If-Modified-Since: Tue, 01 Jul 2025 12:00:00 GMT

资源未变化时服务端返回 304 Not Modified;否则返回 200 和新响应体。Last-Modified 的精度和“内容没变但修改时间变了”会造成误判;ETag 是资源版本标识,通常更精确,但生成成本由服务端决定。

HTTP 版本演进

版本关键能力限制/说明
HTTP/1.0默认短连接可借 Connection: keep-alive 复用连接
HTTP/1.1默认持久连接、Host、分块传输、Range管道化理论可用但部署少;同一连接响应顺序导致队头阻塞
HTTP/2二进制分帧、多路复用、HPACK、流优先级、服务端推送解决 HTTP 层队头阻塞,但 TCP 丢包仍会阻塞同连接中的流;服务端推送现已较少使用
HTTP/3HTTP 语义运行于 QUIC流独立可靠传输,单流丢包不阻塞其他流

HTTPS 与 TLS

HTTPS = HTTP 运行在 TLS 保护的安全通道上,通常用 443 端口(HTTP 常用 80)。TLS 提供:

  • 机密性:对称加密保护传输内容;
  • 完整性:AEAD/MAC 防篡改;
  • 身份认证:客户端验证服务器证书与域名,确认服务端身份。

现代 TLS(如 TLS 1.3)一般使用(EC)DHE 协商临时共享密钥,服务器用证书私钥签名证明身份;不是简单地“客户端生成对称密钥,再用服务器公钥加密发送”。握手后双方用协商出的会话密钥加密 HTTP 数据。证书验证包括证书链、有效期、域名和撤销状态等检查。

使用 Markdown 与 VitePress 构建