当前位置: 首页 > news >正文

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

请求重定向图示

将请求重定向到新位置(301)
在这里插入图片描述

从给定的时间之后未修改过,则重定向为使用本地副本(304)
在这里插入图片描述

⚠️几个重定向状态码的区别(面试考点)

状态码名称永久性HTTP 方法是否保留典型场景SEO 影响注意事项
301Moved Permanently✅ 永久❌ 可能改变
(POST → GET)
域名永久迁移、URL 结构变更权重转移到新 URL (后续访问跳过重定向用新URL,浏览器自动更新书签浏览器缓存重定向结果
302Found❌ 临时❌ 可能改变
(POST → GET)
临时活动也跳转、A/B 测试不传递权重,保留原 URL 索引(每次都重定向访问,浏览器不会更新书签实际行为与语义不符,慎用于非 GET 请求
307Temporary Redirect❌ 临时严格保持原方法临时重定向且需保留请求方法
(如 POST 表单)
不传递权重
(每次都重定向访问,浏览器不会更新书签)
强制方法一致,适合 API 和敏感操作,比如支付
308Permanent 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/brContent-Encoding: gzip
Content-LengthBody 的字节长度(不含头部)Content-Length: 1024
Content-TypeBody 的媒体类型(如 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/jsonAccept: application/json
Accept-Language声明首选语言Accept-Language: zh-CN,en;q=0.9
Authorization身份凭证(如 Bearer Token)Authorization: Bearer xyz123
Cookie携带服务端设置的 CookieCookie: sessionId=abc; theme=dark
Referer当前请求的来源页面 URLReferer: 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-OriginCORS:允许跨域的源(* 表示任意源)Access-Control-Allow-Origin: *
Content-Security-PolicyCSP:限制资源加载来源(防 XSS)default-src 'self'; script-src https:
Strict-Transport-SecurityHSTS:强制 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-ControlExpires: 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)。

相关文章:

  • Codeforces Round 1032 (Div. 3)
  • 【Python】python系列之函数作用域
  • Linux head 命令
  • LINUX 619 NFS rsync
  • 嵌入式开发之freeRTOS移植
  • 令牌总线的工作原理
  • 声网对话式 AI:开启我的编程进阶之旅
  • 基于Python的房屋信息可视化及价格预测系统
  • 【程序员AI入门:趋势】22、AI发展全景解析:技术演进、行业变革与未来趋势深度洞察
  • 【MySQL】SQL基础
  • 分布变化的模仿学习算法
  • WEB3 的 WebSocket Provider连接方式
  • 模拟IC设计基础系列8-版图设计基础
  • ubuntu 系统 pgm图片和png相互转化
  • Spring-Maven
  • Tensorflow C++ API从入门到放弃
  • 第五届信息技术与当代体育国际学术会议(TCS 2025)
  • JavaWeb-1 概述
  • 微信小程序form表单手机号正则检验pattern失效
  • Cordova + Vue 移动端视频播放组件(支持 HLS + 原生播放器兜底)
  • wordpress4.8优化/seo和sem的区别是什么
  • 0基础网站建设教程/接外包网站
  • 黄江镇网站建设/杭州网站设计制作
  • 众筹网站建设报价/seo服务公司怎么收费
  • 如何架设php网站/杭州网站运营十年乐云seo
  • 如何做网站优化seo/申请一个网站需要多少钱