《HTTP权威指南》 第3章 HTTP报文

报文是如何流动的

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 状态码汇总

MDN文档

状态码 原因短语 (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方法,服务器在响应中只返回首部,不会返回主体部分。

允许客户端再未获取实际资源的情况下,对资源的首部进行检查。

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 首部核心作用(面试考点)

  1. 传递上下文 :客户端类型(User-Agent)、认证信息(Authorization)。
  2. 内容协商 :声明支持的数据格式(Accept)、语言(Accept-Language)。
  3. 行为控制 :缓存策略(Cache-Control)、连接管理(Connection)。
  4. 安全策略 :CORS(Access-Control-Allow-Origin)、CSP(Content-Security-Policy)。
相关推荐
梦帮科技1 小时前
领域认知知识库图谱注入:从双式记账图网络到高质量问答对自动化合成流水线
运维·网络·数据库·人工智能·矩阵·架构·自动化
菜鸡养成中...2 小时前
卫星通信协议笔记1-协议栈
网络
hzxpaipai3 小时前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络
smartpi_ai3 小时前
通用脱机烧录器为什么烧不进 CI-03?下载协议的门槛、免唤醒 10 条的建议值属性
服务器·网络·ci/cd
ITxiaobing20234 小时前
自研 IP 库与 AppsFlyer 判定不一致的排查实践
网络·网络协议·tcp/ip
天天喝旺仔4 小时前
gRPC 底层原理:HTTP/2 多路复用、Protobuf 序列化与四种流模式
分布式·http·微服务·rpc
2501_937860944 小时前
中篇:TCP 为什么可靠又高效?滑动窗口、流量控制、拥塞控制与粘包全解析
服务器·网络·tcp/ip
刚及格的陆拾伍5 小时前
Wi-Fi核心知识精要:从频段到帧结构全解析
网络·物联网·网络协议·信息与通信·iot
xiaoye-duck5 小时前
《Linux 网络编程》深入理解 IO 多路复用:select 函数详解与 Echo 服务实战
linux·网络
xfan_me6 小时前
SSL 证书落地应用与网站安全加固
网络协议·安全·ssl