一、HTTP 协议概述

HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 通信的基础协议。 它工作在 OSI 模型的应用层,基于客户端-服务端模型,通过请求-响应模式进行通信。 HTTP/1.1 之前默认使用短连接,HTTP/1.1 起默认使用持久连接(Keep-Alive),HTTP/2 引入了多路复用,HTTP/3 则基于 QUIC(UDP)。

💡 HTTP 的本质

HTTP 本质上是一个基于 TCP 的文本协议(HTTP/2 之前)。请求和响应都是纯文本,用特定的格式组织。理解了报文格式,就理解了 HTTP 的核心。

二、HTTP 通信过程

一个完整的 HTTP 通信过程分为四步:

HTTP 请求-响应通信过程 Browser (客户端) Server (服务端) ① TCP 三次握手 ② HTTP 请求 ③ HTTP 响应 ④ 连接关闭/复用
图 1 — HTTP 通信完整过程:建立 TCP 连接 → 发送请求 → 接收响应 → 关闭或复用连接

三、HTTP 请求报文结构

HTTP 请求报文由四部分组成:请求行、请求头部、空行、请求体。

HTTP 请求报文结构 GET /api/users?id=123 HTTP/1.1 ← 请求行: 方法 + URI + 版本 Request Line Host: example.com User-Agent: Mozilla/5.0 (Windows NT 10.0) Accept: text/html, application/json Accept-Language: zh-CN, zh Accept-Encoding: gzip, deflate Connection: keep-alive Cookie: session_id=abc123 Headers 空行 CRLF (请求体 - GET 请求通常没有 body) POST 请求: {"username":"admin","password":"***"} Body
图 2 — HTTP 请求报文:请求行、头部、空行、请求体(GET 请求通常无 body)

常用请求方法

方法语义是否安全幂等性
GET获取资源安全(不改服务器数据)幂等
POST提交数据 / 创建资源不安全不幂等
PUT更新资源(整体替换)不安全幂等
DELETE删除资源不安全幂等
PATCH部分更新资源不安全不幂等
HEAD获取响应头(不含 body)安全幂等
OPTIONS查询服务器支持的方法(CORS 预检)安全幂等
💡 安全 vs 幂等

安全:不修改服务器上的资源(GET、HEAD、OPTIONS)。幂等:执行一次和执行多次的效果相同(GET、PUT、DELETE)。POST 既不安全也不幂等。

四、HTTP 响应报文结构

HTTP 响应报文同样由四部分组成:状态行、响应头部、空行、响应体。

HTTP 响应报文结构 HTTP/1.1 200 OK ← 状态行: 版本 + 状态码 + 原因短语 Status Line Server: nginx/1.24.0 Date: Mon, 15 Jun 2024 08:30:00 GMT Content-Type: application/json; charset=utf-8 Content-Length: 156 Cache-Control: max-age=3600 Connection: keep-alive Headers 空行 CRLF {"id":123,"name":"张三","email":"zhangsan@example.com"} 响应体 (JSON 格式数据) Body
图 3 — HTTP 响应报文:状态行、头部、空行、响应体

五、HTTP 状态码

状态码用三位数字表示服务器对请求的处理结果,按首位分为五大类:

HTTP 状态码分类 1xx 信息性 请求已接收,继续处理 例: 100 Continue, 101 Switching Protocols 2xx 成功 请求已成功被服务器处理 例: 200 OK, 201 Created, 204 No Content 3xx 重定向 需要进一步操作才能完成请求 例: 301 Moved, 302 Found, 304 Not Modified 4xx 客户端错误 请求有语法错误或无法被服务器理解 例: 400 Bad Request, 401, 403, 404 Not Found 5xx 服务器错误 服务器在处理请求时发生内部错误 例: 500 Internal Error, 502 Bad Gateway, 503, 504
图 4 — HTTP 状态码五大分类及常见示例

高频状态码详解

状态码含义常见场景
200OK请求成功,响应体包含请求的数据
301Moved Permanently资源永久重定向到新 URL(SEO 权重转移)
302Found资源临时重定向到新 URL
304Not Modified协商缓存命中,资源未修改,使用浏览器缓存
400Bad Request请求参数错误、格式不正确
401Unauthorized未认证(未登录),需要提供认证信息
403Forbidden已认证但无权限访问该资源
404Not Found请求的资源不存在
500Internal Server Error服务器内部错误(代码异常等)
502Bad Gateway网关/代理从上游收到无效响应
503Service Unavailable服务暂时不可用(过载、维护中)
504Gateway Timeout网关等待上游响应超时

六、常用 Header 字段

请求头

Header说明
Host目标主机域名和端口(HTTP/1.1 必须字段,支持虚拟主机)
User-Agent客户端标识(浏览器类型、操作系统等)
Accept客户端能接收的内容类型(MIME 类型)
Authorization认证信息(Bearer Token、Basic Auth 等)
Cookie携带之前服务器设置的 Cookie
Content-Type请求体的媒体类型(POST/PUT 请求需要)
Referer当前请求的来源页面 URL
If-None-Match协商缓存:携带上次响应的 ETag 值

响应头

Header说明
Content-Type响应体的媒体类型和编码
Content-Length响应体字节长度
Set-Cookie设置 Cookie(可多条)
Cache-Control缓存策略(max-age、no-cache、no-store 等)
ETag资源的唯一标识(用于协商缓存)
Location重定向目标 URL(配合 3xx 状态码)
Access-Control-Allow-OriginCORS 跨域允许的来源

七、Content-Type 常见值

text/html                     # HTML 页面
text/plain                    # 纯文本
application/json              # JSON 数据(API 最常用)
application/x-www-form-urlencoded  # 表单提交(默认)
multipart/form-data           # 文件上传
application/octet-stream      # 二进制流(文件下载)
image/png, image/jpeg         # 图片
application/xml               # XML 数据
✅ 总结

HTTP 的核心就是"请求-响应"模式加上文本格式的报文结构。掌握请求方法语义、状态码含义和常用 Header 字段,就能应对绝大多数 Web 开发和调试场景。用浏览器 F12 开发者工具的 Network 面板或 curl 命令,可以直观地观察每一个 HTTP 报文的细节。