Skip to content

HTTP 与 HTTPS:请求、响应、状态码与安全通信

HTTPHTTPS 是最常见、也最容易被“会用但没讲透”的协议。

如果压缩成一句话:

  1. HTTP 解决 客户端和服务端如何按统一请求/响应语义交换数据
  2. HTTPS 解决 在 HTTP 基础上,如何让通信具备加密、完整性保护和身份认证能力

1. HTTP 到底在解决什么问题

浏览器访问页面、前端调接口、服务之间调用 API,本质上都需要一套应用层语义:

  1. 请求怎么表达
  2. 响应怎么表达
  3. 方法、路径、头、状态码是什么意思

HTTP 正是在解决这类问题。

它主要负责:

  1. 定义请求报文和响应报文结构
  2. 定义常见方法,例如 GETPOST
  3. 定义状态码和头部语义

它不负责的是:

  1. 不自己提供底层可靠传输
  2. 不自己完成机器寻址

这些能力分别依赖 TCPIP


2. 一个 HTTP 请求大致长什么样

下面是一段很典型的 HTTP 请求示意:

http
GET /api/users/1001 HTTP/1.1
Host: example.com
Accept: application/json
Authorization: Bearer token-demo

响应示意:

http
HTTP/1.1 200 OK
Content-Type: application/json

{"id":1001,"name":"Alice"}

从这里可以看出:

  1. 方法表达动作
  2. 路径表达资源或入口
  3. 请求头和响应头表达附加语义
  4. 状态码表达结果

3. 一个浏览器请求从发起到收到响应,大致会经历什么

如果只看请求报文和响应报文,还是容易把 HTTP 理解成“写完头就直接飞过去”。

更完整的主线通常是:

  1. 浏览器先解析 URL
  2. 如果目标是域名,先走 DNS
  3. 建立 TCP 连接
  4. 如果是 HTTPS,继续做 TLS 握手
  5. 浏览器构造 HTTP 请求行、请求头和请求体
  6. 请求通过底层连接发给服务端
  7. 服务端 Web 服务器或框架解析请求
  8. 应用执行业务逻辑
  9. 服务端组装状态码、响应头和响应体
  10. 响应通过同一连接返回给浏览器
  11. 浏览器解析响应,再决定缓存、渲染、跳转还是继续拉资源

也就是说,HTTP 真正处在这条链路的“应用语义层”,它不是独立脱离其他层单独工作的。


4. 一张更完整的 HTTP/HTTPS 请求响应流程图

mermaid
sequenceDiagram
    participant Browser as 浏览器
    participant DNS as DNS
    participant Server as 服务端

    Browser->>DNS: 解析 example.com
    DNS-->>Browser: 返回目标 IP
    Browser->>Server: TCP 三次握手
    alt HTTPS
        Browser->>Server: TLS 握手
        Server-->>Browser: 证书与协商结果
    end
    Browser->>Server: 发送 HTTP 请求行 / 请求头 / 请求体
    Server->>Server: 解析请求并处理业务
    Server-->>Browser: 返回状态行 / 响应头 / 响应体
    Browser->>Browser: 解析响应、缓存、渲染或继续发后续请求

这张图最值得看的不是“每一步都出现了什么名词”,而是:

  1. DNS 在前
  2. TCP / TLS 是承载过程
  3. HTTP 真正关心的是请求和响应语义

5. HTTP 的能力边界

3.1 HTTP 负责什么

  1. 定义请求/响应语义
  2. 定义资源访问和状态表达方式
  3. 定义头部和缓存、内容协商等应用层规则

3.2 HTTP 不负责什么

  1. 不负责可靠传输
  2. 不负责路由到目标机器
  3. 不默认提供加密

这也是为什么只用 HTTP 时,通信内容可能被中间人看到或篡改。


6. HTTPS 是什么

很多人会说 HTTPS = HTTP + SSL,现在更准确的说法应该是:

HTTPS = HTTP + TLS

它的核心价值是:

  1. 加密传输内容
  2. 校验通信完整性
  3. 通过证书帮助验证服务端身份

所以 HTTPS 不是新协议把 HTTP 全推翻了,而是:

在 HTTP 下面插入一层安全通信能力,让原本明文的应用层请求变成受保护的传输。


7. TLS 在这里解决什么问题

TLS 主要解决的是三件事:

  1. 机密性:别人看不懂明文
  2. 完整性:别人难以悄悄篡改内容
  3. 身份认证:客户端能更有依据地确认自己连的是目标服务

如果没有它,纯 HTTP 面对公网时会有明显问题:

  1. 请求和响应内容可能被窃听
  2. 返回内容可能被篡改
  3. 用户可能被引到伪装网站

8. 在服务端视角里,HTTP 请求和响应分别是怎么被处理的

站在服务端角度,一次请求大致是这样流动的:

  1. 网关、反向代理或 Web 服务器先接住连接
  2. 解析请求行、请求头和请求体
  3. 把请求分发给对应路由或处理器
  4. 业务代码读取参数、访问数据库或其他服务
  5. 处理结果被封装成响应状态码、响应头和响应体
  6. 响应写回连接,返回给客户端

例如在 Spring MVC 或 Node.js Web 框架里,你平时写的控制器、路由处理函数,通常都在第 4 步和第 5 步附近工作。

所以工程上理解 HTTP 的重点,不只是知道报文长什么样,还要知道:

  1. 它如何进入服务端框架
  2. 它如何最终变成响应

9. HTTP 常见方法和状态码怎么理解

6.1 方法

常见方法包括:

  1. GET:读取资源
  2. POST:提交新数据
  3. PUT:整体更新
  4. PATCH:局部更新
  5. DELETE:删除资源

6.2 状态码

可以按大类理解:

  1. 2xx:成功
  2. 3xx:重定向
  3. 4xx:客户端请求问题
  4. 5xx:服务端处理问题

最重要的不是背全,而是知道状态码表达的是响应结果语义。


10. 一个最常见的调试示例

bash
curl -v https://example.com/api/users/1001

这个命令很适合帮助理解:

  1. 请求头怎么发
  2. 响应头怎么回
  3. 状态码是什么
  4. HTTPS 连接是怎么建立的

11. HTTP 与 HTTPS 的关系和边界

协议主要负责什么主要边界
HTTP请求/响应语义不提供默认加密
HTTPS在 HTTP 上补 TLS 安全层仍然不是底层传输协议

所以:

  1. HTTP 不是“更老的 TCP”
  2. HTTPS 不是“HTTP 换了个端口就结束”
  3. 它们都属于应用层

12. 常见误区

12.1 以为用了 HTTPS 就绝对安全

不准确。

它主要解决链路传输安全,不等于应用本身没有鉴权、注入、逻辑漏洞问题。

12.2 以为 HTTP 只属于浏览器网页

不是。

大量服务间 API、移动端接口、微服务调用网关入口都在使用 HTTP 语义。

12.3 以为状态码只是前端展示用

不是。

它本质上是协议结果语义的一部分。


13. 一句话总结

HTTP/HTTPS 这条主线,本质上是在解决 应用如何以统一的请求/响应模型交换数据,以及在公网环境下如何通过 TLS 保护这条通信链路。

基于 VitePress 构建的个人技术笔记。