《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 请求成功,并在服务器上创建了新的资源。 通常在 POSTPUT 请求后返回,响应头 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)。
相关推荐
2501_9160074721 分钟前
Fiddler抓包工具实战指南:结合Charles、Postman优化Web与移动调试流程
websocket·网络协议·tcp/ip·http·网络安全·https·udp
alonetown2 小时前
IEC 62351 第十一部分详情
网络·iec62351·iec62351-10
宇宙超级勇猛无敌暴龙战神2 小时前
服务器如何从http升级到https(nginx)
服务器·http·https
Tom Boom2 小时前
2. 如何理解互联网七层模型?深度解析。
网络·自动化测试·测试开发·测试用例·自动化测试框架开发
zzc9212 小时前
不同程度多径效应影响下的无线通信网络电磁信号仿真数据生成程序
网络·matlab·数据集·无线信道·无线通信网络拓扑推理·多径效应
1688red2 小时前
IPv4编址及IPv4路由基础
运维·网络·华为
果子⌂3 小时前
LVS+Keepalived高可用群集
网络·智能路由器·lvs
刘俊辉个人博客3 小时前
端口安全配置示例
运维·网络·数据库·计算机网络·安全·网络安全
猪猪b。3 小时前
dhcp 配置IP实战演练!!!!!
运维·服务器·网络
00后程序员张3 小时前
上线iOSApp前抓包工具协作保障接口行为一致性(iOS抓包)
websocket·网络协议·tcp/ip·http·网络安全·https·udp