逐步解读HTTP报文的组成及含义

2023-10-27

如果说HTTP是因特网的信使,那么HTTP报文就是运送的包裹。所有的HTTP程序都是通过互相发送报文来完成工作的。本文将介绍HTTP报文的流动方式,报文的组成部分,请求和响应报文之间的区别等。

报文流
HTTP报文是在HTTP应用程序之间发送的数据块,这些数据块以文本形式存在,以描述了报文的内容及含义的元信息开头,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动。一般来说,报文流根据流向引用以下三种术语:报文流入(inbound)向服务器,工作完成之后,会流出(outbound)向客户端或用户Agent代理;不管是请求报文还是响应宝安温,所有报文的接收者都在发送者的下游(downstream),报文只会向下游流动。

报文的组成部分
报文由起始行、首部,以及可选的包含数据的主体三个部分组成。所有的HTTP报文分为两类:请求(request)报文和响应(response)报文,如下图示例。前者会向Web服务器请求对资源进行一些操作,后者承载了状态信息和操作产生的所有结果数据,把结果返回给客户端。
2016616114838764.jpg (789×217)

起始行
所有的HTTP报文都以一个起始行作为开始。请求报文的起始行又称为请求行,说明了要做些什么,响应报文的起始行又称为响应行,说明了发生了什么。以下是两种请求行的基本格式:

复制代码
代码如下:
// 请求行格式
<method> <request-URL> <version>
// 响应行格式
<version> <status> <reason-phrase>

请求行的方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法,HTTP版本用来告知服务器,客户端使用的是哪个版本的HTTP协议。响应行包含了报文使用的HTTP版本、数字状态吗,以及描述操作状态的文本形式的原因短语。所有这些字段都由空格分隔。

请求行方法
HTTP规范中定义了一组常用的请求方法,用来告知服务器要做些什么,如下所示:
GET:从服务器获取请求URL所指定的资源。
HEAD:只从服务器获取文档的首部。和GET方法的行为很类似,但服务器只返回首部,不包含主体。此方法可以:在不获取资源的情况下了解资源的情况(比如判断类型);通过查看响应中的状态吗,看看某个对象是否存在;通过查看首部,测试资源是否被修改了。
POST:向服务器发送需要处理的数据(包含主体)。通常用它来支持HTML的表单。
PUT:将请求的主体部分存储在服务器上(包含主体)。有些系统允许用户创建Web页面或上传文档,该方法的语义就是让服务器用请求的主体来创建一个由请求URL命名的新文档,如果URL已存在则让这个主体替代它。
DELETE:从服务器上删除请求URL所指定的资源。但客户端无法保证删除操作一定被执行,因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。
TRACE:对可能经过代理、网管、防火墙等服务器的报文进行追踪,主要用于诊断。报文行程最后一站的服务器会弹回一条TRACE响应,在主体中携带它收到的原始请求报文,这样客户端就可以查看报文在一整条请求/响应链上是如何被修改的。
OPTIONS:查询可以在服务器上执行哪些方法,让客户端不用实际访问那些资源就能判定访问各种资源的最优方式。
如果一台服务器要与HTPP 1.1兼容,只要为其资源实现GET和HEAD方法即可,这两种方法被认为是安全的,它们产生的请求不会在服务器上产生什么结果(实际上,这是由Web开发者决定的,完全可以使用GET方法来提交一个表单,但严重不建议这么做!)。

HTTP还允许定义HTTP/1.1规范中没有定义的扩展方法,这些方法为开发者提供了一种扩展HTTP服务能力的手段。很可能大部分HTTP应用程序都无法理解这些扩展方法,所以服务器最好对扩展方法宽容一些。

状态码与原因短语
每条响应报文都会包含一个3位数字和可读的状态,用来告诉客户端,服务器发生了什么事情。数字状态码便于程序处理差错,原因短语更便于人们理解。状态码分为5类(括号中为已定义范围):100~199为信息提示(100~101);200~299为成功(200~206);300~399为重定向(300~305),用于告知客户端使用替代位置来访问资源;400~499为客户端错误(400~415);500~599为服务器错误(500~505)。限于篇幅下面只介绍常见的状态码,详情参见HTTP状态码维基百科

101 Switching Protocols:服务器正在根据客户端的指定,将协议切换成Update首部所示的协议。
200 OK:服务器已成功处理了请求并提供了请求的网页
204 No Content:服务器成功处理了请求,但没有返回任何内容
301 Moved Permanently:请求的网页已永久移动到新位置。响应的Location首部应包含资源现在所处的URL。
302 Found:与301类似,但这里的移除是临时的。将来的请求仍应使用老的URL。
304 Not Modified:客户的缓存资源是最新的,要客户端使用缓存。
400 Bad Request:告知客户端发送了一个错误的请求。
403 Forbidden:请求被服务器拒绝了。(可能是没有访问服务器的权限)
404 Not Found:服务器无法找到所请求的URL。
410 Gone:服务器曾经有这个资源,现在没有了,与404类似。
500 Internal Server Error:服务器遇到一个错误,使其无法为请求提供服务。
502 Bad Gateway:作为代理或网关使用的服务器收到了上游的无效响应。
503 Service Unavailable:服务器现在无法为请求提供服务,但过一段时间就可以恢复服务。

首部
首部和方法配合工作,共同决定了客户端和服务器能做什么事情。可以将首部分为5个主要类型,以下将分类列举一些首部。

(1)通用首部:客户端和服务器都可以使用的通用首部,提供了与报文相关的最基本的信息。
Connection:允许客户端和服务器指定与请求/响应连接相关的选项
Date:日期和时间标志,说明报文是什么时刻创建的
MIME-Version:给出了发送端使用的MIME版本
Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
Via:显示了报文经过的中间节点(代理、网关等等)
Cache-Control:用于随报文传送缓存指示
Pragma:另一种随报文传送指示的方式,但并不专用于缓存

(2)请求首部:只在请求报文中有意义,用于说明是谁或什么在发送请求、请求源自何处,或客户端的喜好及能力等。
Accept:告诉服务器能够发送哪些媒体类型。该首部可以使连接的两端都受益,客户端会得到它们想要的内容,服务器则不会浪费时间好带宽来发送客户端无法使用的东西
Accept-Encoding:告诉服务器能够发送哪些编码方式
Accept-Language:告诉服务器能够发送哪些语言
Referer:提供了包含当前请求URI的文档的URL
User-Agent:告诉服务器发起请求的应用程序名称
有时客户端希望为请求加上某些限制,要求服务器在对请求进行响应之前,确保某个条件为真,则可以添加条件请求首部,如Expect(允许客户端列出某请求所要求的服务器行为)、If-Match(若实体标记相匹配,则获取这份文档)、If-Modified-Since(除非在某个指定日期之后资源被修改过,否则限制该请求)等等。
HTTP本身就支持一种对请求进行质询/响应的认证机制,这样可以使事务稍微安全一些。因此有安全请求首部,如Authorization(客户端提供给服务器的对其自身进行认证的数据)、Cookie(这个不是真正的安全首部,但却是隐含了安全功能)。

(3)响应首部:为客户端提供了一些额外信息,比如谁在发送响应、响应者的功能、其它一些特殊指令等
Age:(从最初创建开始)响应持续时间
Public:服务器为其资源支持的请求方法列表
Retry-After:如果资源不可用,在此时间重试
Accept-Ranges:(协商首部)对此资源来说,服务器可接受的范围类型
Set-Cookie:(安全首部)类似Cookie,用于设置Cookie

(4)实体首部:用来描述HTTP报文的负荷,提供了有关实体及其内容的大量信息,可以告知报文的接收者它在对什么进行处理
Allow:列出可以对此实体执行的请求方法
Location:告知客户端实体实际上位于何处,用于重定向资源
Content-Length:主体的长度
Content-Type:主体的对象类型
(还有很多关于主体的首部,如Content-Encoding、Content-Base、Content-MD5等等)
ETag:与此实体相关的实体标记(用于缓存,下同)
Expires:实体不再有效,要从源端再次获取此实体的日期和时间
Last-Modified:这个实体最后一次被修改的日期和时间

HTTP请求报文实例解剖   
2016616114935723.png (874×471)

①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。  
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL,③是协议名称及版本号。  
④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。  
⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。  
对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图:  

2016616115015857.jpg (427×151)

转载自:http://www.jb51.net/network/469064.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逐步解读HTTP报文的组成及含义 的相关文章

  • 如何使用 https 运行 Vue.js 开发服务?

    我正在使用 Vue cli 使用 webpack 模板创建 vue 项目 如何在开发中使用 https 运行它 npm run dev 在最新的vuejs 截至2018年5月7日 中 需要在项目根目录下添加一个 vue config js
  • 读取错误:SSL 库失败,通常是协议错误

    我正在尝试使用 DefaultHttpClient 访问安全 url 我正在使用 portecel 工具创建 BKS 文件 使用相同的方法创建的 jks 文件在 java 程序中工作正常 但 bks 抛出以下异常 java io IOExc
  • WebSocket 连接建立时出错:net::ERR_CONNECTION_CLOSED

    当我尝试建立一个wss与我的服务器的连接 与 wss mydomain 3000 的 WebSocket 连接失败 错误 连接建立 net ERR CONNECTION CLOSED 我目前有一个 apache2 虚拟主机配置设置来侦听端口
  • git-svn 匿名结帐失败并显示 -s

    我正在尝试使用 git 克隆带有 std 布局的 svn 存储库 使用 s选项 存储库使用https匿名 存储库位于https secure simplistix com svn xlwt https secure simplistix c
  • 客户端身份验证方案“匿名”禁止 HTTP 请求

    这似乎是一个常见问题 我已经查看了这里的所有答案 但没有一个有帮助 我正在尝试让 SSL 与 iis 上托管的 basichttpbinding 和 WCF 服务一起使用 我认为问题出在 iis 或证书上 我已经在 iis 管理器中创建了一
  • ...此内容也应该通过 HTTPS 加载

    再会 Site https mult privet com https mult privet com 在我的 Chrome 控制台中 我看到以下错误 blocked The page at https yandex st share ya
  • Cherrypy 3.2.0:启动引擎在同一实例中运行 HTTP 和 HTTPS

    早上好 我在 HTTP 或 HTTPS 中成功启动了cherrypy 3 2 0引擎 ssl variable commes input parameters Bellow cherrypy configuration is fully c
  • 对于“未找到项目”错误页面,最合适的 HTTP 状态代码是什么

    我很好奇 项目不存在 页面最合适的 HTTP 状态代码是什么 如果页面本身不存在 我显然会使用 404 但是 我的其中一个页面有一个userid参数 它是一个 编辑用户 页面 如果不存在具有给定用户 ID 的用户 我将显示一个错误页面 但我
  • 为整个服务器/域强制使用 https

    我正在开发一些只能通过 https 访问的表单 我有一个专用服务器 有自己的证书和所有好东西 所以我的问题实际上有两个 1 强制每个请求都为 https 的最佳方法是什么 有没有比这个 htacess mod rewrite 规则更好的方法
  • 使用 HTTPS 链接与 php 方法(file_get_contents、getimagesize)

    当我尝试读取网站中的某些 HTTPS 网址时遇到问题 如果我使用 http 则没有问题 使用file get contents和curl 但是当我用 https 替换 http 时 这些方法不起作用 我收到一些错误 failed to op
  • 硒 + 火狐 + HTTPS

    好的 我知道我问的是一个老生常谈的问题 但我发布这个问题是因为尽管尝试了各种链接上提供的所有解决方案 但我的问题仍未得到解决 我的限制 我不想使用保存的 Firefox 配置文件来保存网站的证书 Selenium 服务器版本 2 0b3 尝
  • SSLHandshakeException:不存在主题备用名称

    我通过 java 代码调用 HTTPS SOAP Web 服务 我已经在 jre cacerts 密钥库中导入了自签名证书 现在我得到 com sun xml internal ws com client ClientTransportEx
  • 使用 Https 连接的 Java 应用程序:“连接被拒绝错误”

    我为我的 JavaAppliaction 创建了一个 jar 从这个应用程序中 我连接到 WebApplicaton 中的 servlet 我将名称和密码从 swing 传递到 servlet 这里我只是在 servlet 中显示名称和密码
  • Java HTTPS客户端证书认证

    我对HTTPS SSL TLS我对客户在使用证书进行身份验证时到底应该提供什么内容感到有点困惑 我正在编写一个 Java 客户端 需要执行一个简单的操作POST数据到特定的URL 这部分工作正常 唯一的问题是它应该重新完成HTTPS The
  • https 安全 cookie 是否可以防止 XSS 攻击?

    https 连接是否可以保护 cookie 并防止 XSS 攻击 我有一个简单的博客 允许用户输入 JavaScript 代码作为输入 我希望允许用户输入 Javascript 同时仍然防止 XSS 攻击和 cookie 窃取 https
  • htaccess 重定向非 www http 和 https

    我想要 http example com重定向至 http www example com https example com重定向至 https www example com 以及任何东西http whatever example co
  • 是否可以为 IP 地址而不是域名提供 SSL 证书? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望我的网站使用类似的 URLhttp 192 0 2 2 and https 192 0 2 2 用于静态内容 以避免请求中不必要的
  • 您可以强制 HTML 表单对相对 URL 使用 HTTPS 吗?

    我有一个网站 其中每个页面都通过 HTTPS 提供服务 在其中一个页面上 我有一个表单 其操作属性设置为相对 URL 包含表单的页面只能通过 HTTPS 访问 表单发布到的页面只能通过 HTTPS 访问 但在 IE 中 我收到一条安全警告
  • 无对等证书例外 - Volley 和具有自签名证书的 Android

    我正在尝试让我的应用程序通过 https 与我的服务器通信 由于我不想付费让受信任的 CA 签署我的服务器证书 解决方案是使用自签名证书 因此 我创建了 caconfig cnf 如下所示 ca default ca CA default
  • IIS 8 HTTPS/需要 SSL 导致超时错误

    尝试通过 IIS 8 通过 SSL 发布网站 但出现超时错误 任何帮助表示赞赏 采取的步骤 已验证该网站可以通过 HTTP 访问 http xxx xxx xxx xxx有效 此时使用 IP 地址 如果重要的话 IIS gt 服务器证书 g

随机推荐

  • C语言每日一题:7.寻找数组中心下标。

    思路一 暴力求解 1 定义一个ps作为中间下标去记录下标值 2 循环下标ps从头到位 定义四个变量分别是left sum left right sum right 3 初始化left ps 1和right ps 1 当ps0 gt 就让su
  • etcd学习和实战:4、Java使用etcd实现服务发现和管理

    etcd学习和实战 4 Java使用etcd实现服务发现和管理 文章目录 etcd学习和实战 4 Java使用etcd实现服务发现和管理 1 前言 2 代码 2 1 服务注册 2 2 服务发现 2 3 运行结果 2 4 问题 3 最后 1
  • 关于SVM的一点笔记

    关于SVM的一点笔记 一 简单了解 1 感知机 perceptron 感知机是一种类似于生物中神经细胞功能的人工神经元 它可以把一个或者多个输入 x 1 x 1 x1 x
  • flask最基础的增删改查实现步骤及代码

    分类序列化器 写入要序列化的字段 user info id fields Integer name fields String 商品序列化器 写入要序列化的字段 goods info id fields Integer name field
  • Spring系列面试题(Spring、SpringMvc、SpringBoot)

    一 springboot自动配置原理 自动装配 简单来说就是自动把第三方组件的Bean装载到Spring IOC器里面 不需要开发人员再去写Bean的配置 在Spring Boot应用里面 只需要在启动类加上 SpringBootAppli
  • 五张图带你理解 RocketMQ 顺序消息实现机制

    大家好 我是君哥 今天聊一聊 RocketMQ 的顺序消息实现机制 在有些场景下 使用 MQ 需要保证消息的顺序性 比如在电商系统中 用户提交订单 支付订单 订单出库这 3 个消息应该保证顺序性 如下图 对于 RocketMQ 来说 主要是
  • Electron桌面开发入门

    1 初始化工作 midir electron demo cd electron demo npm init 到package json 文件下将入口文件修改为main js main main js 并且创建main js文件 electr
  • Java猫和狗(继承,多态,抽象,接口版)上

    Java的继承 抽象 多态 接口的简单应用 我们利用 猫和狗都是动物类 然后猫会抓鱼 狗会看门的这些方法来简单应用一下继承 抽象 多态 接口 简单思路就是 1 定义动物类 2 定义猫 狗类 让他们成为动物的子类 3 编写测试类 继承 使子类
  • PTA L1-016:查验身份证 (python)

    一 题目要求 二 参考代码 sheet 0 1 1 0 2 X 3 9 4 8 5 7 6 6 7 5 8 4 9 3 10 2 w 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 n int input c 0 f
  • ARM单片机FATFS文件系统的移植

    ARM单片机FATFS文件系统的移植 测试效果 前提条件 下载所需源码 FATFS 文件系统 SFUD万能驱动 加入工程 接口驱动 测试代码 FreeRTOS10 0 1 FATFS FF14A SFUD V1 1 0 STM32F103Z
  • 超过2t硬盘分区_大于2T的磁盘怎么分区呢?

    由于购买了磁盘柜专门用作存储 后来考虑到磁盘容量的动态管理 准备采用LVM进行动态扩容管理了 首先让前端挂载机器能够识别到磁盘柜的逻辑卷组 比如 dev sdb 先介绍2种分区表 MBR分区表 MBR含义 主引导记录 所支持的最大卷 2T
  • 6.8过程纹理

    过程纹理也称为自定义纹理 根据计算得出 这个例子使用了位置和原点的距离作为输入参数 并加入了动画 但是和目前的纹理没任何关系 纯手工计算 因为位置是三维的 所以在涉及到纹理的几个地方都要改为三维的 struct RENDEROBJECT D
  • Java中的&、&&、

    关于这几个的运算符我一代码的实例来介绍 如下 1 首先它们都是逻辑运算符 但是 和 是短路运算符 也就是只判断运算符左边的即可 就可以确定整个表达式的结果了 所以它的执行效率高于 和 因为这两个运算符需要将表达式中所有的boolean值都判
  • JAVA开发(行业现状与未来)

    JAVA开发行业经过了这么多年的发展 曾经从一个机顶盒程序起家 到超过3亿台以上设备都在运行JAVA程序 JAVA语言见证了整个互联网化的工业化过程 许许多多的东西从从传统模式搬到了线上 特别是电子商务和网络社交的发展 大量的资金投入的这个
  • 【算法系列篇】前缀和

    文章目录 前言 什么是前缀和算法 1 模板 前缀和 1 1 题目要求 1 2 做题思路 1 3 Java代码实现 2 模板 二维前缀和 2 1 题目要求 2 2 做题思路 2 3 Java代码实现 3 寻找数组的中心下标 3 1 题目要求
  • 【MATLAB第67期】# 源码分享

    MATLAB第67期 源码分享 基于MATLAB的morris全局敏感性分析 一 代码展示 clear all npoint 100 在分位数超空间中要采样的点数 计算次数iter npoint nfac 1 nfac 20 研究函数的不确
  • 浏览器跨域问题

    1 同源策略 同源策略是一种约定 是浏览器最核心也是最基本的安全功能 可以说Web是构建在同源策略基础之上的 浏览器之上针对同源策略的一种实现 同源 协议 域名 端口号都相同的才称为 同源 同源策略用于限制一个origin的文档或者它加载的
  • 随机选择一个三位以内的数字作为答案。用户输入一个数字,程序会提示大了或是小了,直到用户猜中。

    import random b random randint 0 999 A input input a 0 999 number a int A 用户输入 while a b if a gt b A input input a less
  • vue+图片上传+预览

    学习记录 实现本地图片上传和预览 切记使用 accept image 可以指定文件类型
  • 逐步解读HTTP报文的组成及含义

    如果说HTTP是因特网的信使 那么HTTP报文就是运送的包裹 所有的HTTP程序都是通过互相发送报文来完成工作的 本文将介绍HTTP报文的流动方式 报文的组成部分 请求和响应报文之间的区别等 报文流 HTTP报文是在HTTP应用程序之间发送