报文是如何流动的
HTTP报文
是在HTTP程序之间发送的数据块
。数据块以一些文本形式的元信息
开头。
报文方向 有:流入
、流出
、上游
、下游
。
流入
和流出
描述事务处理的方向 ,流入和流出是基于服务器的描述。
流入:客户端发往服务器 的请求报文
流出:从服务器发出 到客户端的响应报文
发出方在上游,接收方在下游
:所有的报文都会向下游流动 ,所有报文的发送者都在接收者的上游。
HTTP报文的三个组成部分
对报文进行描述的起始行
、包含属性的首部
块、可选 的包含数据的主体
。
起始行和首部是由行分隔的ASCII文本,每行以一个行终止序列
(两个字符组成)作为结束 ,其中包括一个回车符
(ASCII码13)和一个换行符
(ASCII码10),写做CRLF
。
Content-type
表示主体是什么类型的数据,Content-length
表示主体有多大(多少个字节)。
报文语法
- 方法(method):客户端希望服务器对资源执行的动作,如:GET、POST
- 请求URL(request-URL):路径组件的完整URL(除协议和主机名端口号之外的部分)
- 版本(version) :报文所使用的HTTP版本,格式
HTTP/<major>.<minor>
,其中major主要版本号,minor次要版本号,比如:HTTP/1.1
- 状态码(status-code):三位数字,描述请求过程中发生的情况,第一位数字用于描述一般类别(成功、出错)等。
- 原因短语(reason-phrase):数字状态码的可读版本
- 首部(header) :零个或多个,
名字
+:
+可选空格
+值
+CRLF
,如:Content-Type: application/json
注意:一组HTTP首部总是应该以一个空行结束(仅有CRLF),即使没有首部和主体。
示例:
起始行 :请求报文的起始行,包含一个方法
+ 一个请求URL
+ HTTP版本

响应行 :响应报文的起始行,包含HTTP版本
+ 数字状态码
+ 原因短语

常用 HTTP 状态码汇总
状态码 | 原因短语 (Reason Phrase) | 含义 | 备注 |
---|---|---|---|
100 | Continue | 服务器已收到请求头,客户端应继续发送请求体。 | 常用于 Expect: 100-continue 头部的大文件上传场景,确认服务器是否愿意接收数据。 |
101 | Switching Protocols | 服务器应客户端要求,正在切换协议(如从 HTTP 切换到 WebSocket)。 | 客户端通过 Upgrade 头部请求协议切换。 |
200 | OK | 请求成功。 响应内容取决于请求方法(GET 返回资源,PUT/POST 可能返回操作结果)。 | 最常用的成功状态码。 |
201 | Created | 请求成功,并在服务器上创建了新的资源。 | 通常在 POST 或 PUT 请求后返回,响应头 Location 通常包含新资源的 URL。 |
202 | Accepted | 请求已被接受处理,但处理尚未完成。 | 适用于异步操作,最终结果可能稍后通过其他方式通知。 |
204 | No Content | 服务器成功处理了请求,但响应中没有返回任何内容。 | 常用于 DELETE 请求成功或 PUT 更新成功但无需返回数据时。 |
206 | Partial Content | 服务器成功处理了部分 GET 请求(范围请求)。 |
响应头 Content-Range 指示返回的是哪部分内容。用于大文件下载、断点续传。 |
301 | Moved Permanently | 请求的资源已被永久移动到新的 URL。 | 浏览器/搜索引擎会更新书签和索引。 响应头 Location 提供新 URL。 |
302 | Found | 请求的资源临时从不同的 URL 响应。 | 浏览器会重定向,但不会更新书签/索引。 (原始语义是"临时移动",但实际常被用作临时重定向)。 |
304 | Not Modified | 资源未被修改,客户端可以使用缓存的版本。 | 用于条件请求(请求头如 If-Modified-Since , If-None-Match ),表示资源未改变,节省带宽。 |
307 | Temporary Redirect | 请求的资源临时从不同的 URL 响应。 | 与 302 类似,但严格要求重定向时使用相同的 HTTP 方法(如 POST 重定向后仍用 POST)。 |
308 | Permanent Redirect | 请求的资源已被永久移动到新的 URL。 | 与 301 类似,但严格要求重定向时使用相同的 HTTP 方法(如 POST 重定向后仍用 POST)。 |
400 | Bad Request | 服务器无法理解或处理该请求,因为客户端请求语法错误、无效请求消息或欺骗性请求路由。 | 通用客户端错误,需检查请求格式、参数、JSON/XML结构等。 |
401 | Unauthorized | 请求要求身份验证或身份验证失败。 | 响应通常包含 WWW-Authenticate 头,告知客户端需要的认证方式(如 Basic, Bearer)。表示"未认证"或"认证失败"。 |
403 | Forbidden | 服务器理解请求,但拒绝执行(即使身份验证成功)。 | 与 401 区别:用户已登录,但没有访问该资源的权限。 |
404 | Not Found | 服务器找不到请求的资源。 | 最常见错误之一。 URL 拼写错误、资源已被删除或从未存在。 |
405 | Method Not Allowed | 不支持的请求方法。 | 响应头 Allow 会列出该资源支持的 HTTP 方法(如 GET, HEAD )。 |
408 | Request Timeout | 服务器等待客户端发送请求的时间过长。 | 服务器主动关闭了连接。 |
409 | Conflict | 请求与服务器的当前状态冲突(通常在 PUT/PATCH/DELETE 操作时发生)。 | 常见于并发编辑、版本控制冲突(如 If-Match 头校验失败)。 |
429 | Too Many Requests | 用户在给定的时间内发送了太多请求("速率限制")。 | 常用于 API 限流。 响应头 Retry-After 可能提示客户端何时可重试。 |
500 | Internal Server Error | 服务器遇到了一个未曾预料的情况,导致它无法完成对请求的处理。 | 最通用的服务器端错误。 程序代码错误、依赖服务故障等。 |
502 | Bad Gateway | 服务器作为网关或代理,从上游服务器接收到无效响应。 | 常见于反向代理(如 Nginx)无法从后端应用服务器(如 PHP-FPM, Node.js)获得有效响应。 |
503 | Service Unavailable | 服务器暂时不可用(通常由于过载或停机维护)。 | 表示服务当前无法处理请求,但这是临时的。 响应头 Retry-After 可能提示客户端何时可重试。 |
504 | Gateway Timeout | 服务器作为网关或代理,未及时从上游服务器收到响应。 | 上游服务器处理超时(慢或无响应)。 |
507 | Insufficient Storage | 服务器无法存储完成请求所必需的内容(WebDAV)。 | 通常表示磁盘空间不足。 |
请求重定向图示
将请求重定向到新位置(301)
从给定的时间之后未修改过,则重定向为使用本地副本(304)
⚠️几个重定向状态码的区别(面试考点)
状态码 | 名称 | 永久性 | HTTP 方法是否保留 | 典型场景 | SEO 影响 | 注意事项 |
---|---|---|---|---|---|---|
301 | Moved Permanently | ✅ 永久 | ❌ 可能改变 (POST → GET) | 域名永久迁移、URL 结构变更 | 权重转移 到新 URL (后续访问跳过重定向 用新URL,浏览器自动更新书签) | 浏览器缓存重定向结果 |
302 | Found | ❌ 临时 | ❌ 可能改变 (POST → GET) | 临时活动也跳转、A/B 测试 | 不传递权重 ,保留原 URL 索引(每次都重定向 访问,浏览器不会更新书签) | 实际行为与语义不符,慎用于非 GET 请求 |
307 | Temporary Redirect | ❌ 临时 | ✅ 严格保持原方法 | 临时重定向且需保留请求方法 (如 POST 表单) | 不传递权重 (每次都重定向访问,浏览器不会更新书签) | 强制方法一致,适合 API 和敏感操作,比如支付 |
308 | Permanent Redirect | ✅ 永久 | ✅ 严格保持原方法 | 永久重定向且需保留请求方法 (如 RESTful API 迁移) | 权重转移到新 URL(后续访问跳过重定向用新URL,浏览器自动更新书签) | 强制方法一致,浏览器缓存结果 |
请求和响应报文的区别
- 起始行 :
请求行定义 "要做什么 "(方法+资源路径)。
状态行声明 "结果如何"(状态码+原因短语)。 - 首部字段 :
请求关注 身份、数据类型、来源 (如 Authorization, Accept)。
响应关注 数据类型、缓存、控制指令(如 Content-Type, Cache-Control)。 - 主体及用途 :
请求 Body 用于 发送数据 (如表单、文件)。
响应 Body 用于 返回数据(如资源内容、错误信息)。 - 传输方向性 :
请求:客户端发起 → 服务器接收。
响应:服务器返回 → 客户端接收。
请求报文支持的各种方法
GET

HEAD
HEAD方法,服务器在响应中只返回首部,不会返回主体
部分。
允许客户端再未获取实际资源的情况下,对资源的首部进行检查。
PUT
PUT向服务器写入文档。
用请求的主体创建URL命名的新文档
:让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档。若已存在,则用这个主体来替代它。
POST
向服务端输入数据
TRACE
TRACE方法主要用于诊断
。客户端发起的请求可能要穿过防火墙、代理、网关或其他应用程序,每个中间节点都可能修改原始HTTP请求 。TRACE请求会在目的服务器端发起一个 "环回"诊断 ,弹回一条TRACE响应并在主体中携带它收到的原始请求报文 ,客户端以此检查 原始报文是否被毁坏或被修改过 。
OPTIONS
询问服务器支持哪些方法
DELETE
请服务器删除URL指定的资源
HTTP首部
通用首部
客户端和服务器都可以使用,不论是构建请求报文还是响应报文。
1. 通用信息首部
2. 通用缓存首部
首部 | 作用说明 | 示例值 |
---|---|---|
Cache-Control |
控制缓存行为(优先级最高) | max-age=3600, no-cache |
Connection |
管理连接状态(如 keep-alive 维持长连接;close 关闭连接) |
Connection: keep-alive |
Content-Encoding |
内容压缩格式(如 gzip /br ) |
Content-Encoding: gzip |
Content-Length |
Body 的字节长度(不含头部) | Content-Length: 1024 |
Content-Type |
Body 的媒体类型(如 JSON、HTML) | Content-Type: application/json |
Date |
报文创建时间 | Date: Tue, 15 Jun 2024 08:12:31 GMT |
请求首部
请求首部是只在请求报文中有意义的首部。
1. Accept首部
2. 条件请求首部
3. 安全请求首部
4. 代理请求首部
首部 | 作用说明 | 示例值 |
---|---|---|
Host |
目标域名和端口(HTTP/1.1 必需) | Host: www.example.com |
User-Agent |
客户端标识(浏览器、操作系统等) | User-Agent: Chrome/125.0 |
Accept |
声明可接受的响应格式(如 application/json ) |
Accept: application/json |
Accept-Language |
声明首选语言 | Accept-Language: zh-CN,en;q=0.9 |
Authorization |
身份凭证 (如 Bearer Token) |
Authorization: Bearer xyz123 |
Cookie |
携带服务端设置的 Cookie | Cookie: sessionId=abc; theme=dark |
Referer |
当前请求的来源页面 URL | Referer: https://google.com/search?q=http |
If-Modified-Since |
条件请求:资源在此时间后修改才返回新内容 | If-Modified-Since: Tue, 14 Jun 2024 12:00:00 GMT |
响应首部
1. 协商首部
2. 安全响应首部
首部 | 作用说明 | 示例值 |
---|---|---|
Server |
服务端软件信息 | Server: Nginx/1.24 |
Set-Cookie |
设置 Cookie(名称、值、属性) | Set-Cookie: id=a3fWa; Path=/; HttpOnly |
Location |
重定向目标 URL(用于 3xx 状态码) | Location: https://new.example.com |
Access-Control-Allow-Origin |
CORS :允许跨域的源(* 表示任意源) |
Access-Control-Allow-Origin: * |
Content-Security-Policy |
CSP:限制资源加载来源(防 XSS) | default-src 'self'; script-src https: |
Strict-Transport-Security |
HSTS:强制 HTTPS(浏览器记住此策略) | max-age=31536000; includeSubDomains |
Retry-After |
服务不可用时的重试等待时间(用于 503/429) | Retry-After: 60 |
实体首部
1. 内容首部
2. 实体缓存首部
首部 | 作用说明 | 示例值 |
---|---|---|
Content-Location |
返回资源的实际 URL(可能与请求 URL 不同) | Content-Location: /data/v2/user.json |
Content-Disposition |
指定如何处理内容(如下载文件名) | Content-Disposition: attachment; filename="report.pdf" |
Expires |
资源过期时间 (旧版缓存控制,优先级低于 Cache-Control ) |
Expires: Thu, 01 Dec 2024 16:00:00 GMT |
Last-Modified |
资源最后修改时间(用于缓存验证) | Last-Modified: Mon, 10 Jun 2024 08:30:15 GMT |
⚠️HTTP 首部核心作用(面试考点)
- 传递上下文 :客户端类型(
User-Agent
)、认证信息(Authorization
)。 - 内容协商 :声明支持的数据格式(
Accept
)、语言(Accept-Language
)。 - 行为控制 :缓存策略(
Cache-Control
)、连接管理(Connection
)。 - 安全策略 :CORS(
Access-Control-Allow-Origin
)、CSP(Content-Security-Policy
)。