图解HTTP-HTTP报文内的HTTP信息-学习总结归纳【1.2】

        PUT:传输文件
        PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用 REST( REpresentationalState Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法。

HEAD:获得报文首部
HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认URI 的有效性及资源更新的日期时间等。

DELETE:删除文件
DELETE 方法用来删除文件,是与 PUT 相反的方法。 DELETE 方法按请求 URI 删除指定的资源。但是, HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。当配合 Web 应用程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的。

OPTIONS:询问支持的方法
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。

TRACE:追踪路径
        TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。
        发送请求时, 在 Max-Forwards 首部字段中填入数值,每经过一个服务器端就将该数字减 1, 当数值刚好减到 0 时,就停止继续传输,最后接收到请求的服务器端则返回状态码 200 OK 的响应。
        客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改 / 篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转, TRACE 方法就是用来确认连接过程中发生的一系列操作。

        但是, TRACE 方法本来就不怎么常用,再加上它容易引发 XST( Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。

CONNECT:要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL( Secure Sockets Layer,安全套接层)和 TLS( Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
CONNECT 方法的格式如下所示。
CONNECT 代理服务器名:端口号 HTTP版本
 

2.6 使用方法下达命令

        向请求 URI 指定的资源发送请求报文时,采用称为方法的命令。方法的作用在于, 可以指定请求的资源按期望产生某种行为。方法中有 GET、 POST 和 HEAD 等。
 

        下表列出了 HTTP/1.0 和 HTTP/1.1 支持的方法。另外,方法名区分大小写,注意要用大写字母。

在这里列举的众多方法中, LINK 和 UNLINK 已被 HTTP/1.1 废弃,不再支持。

2.7 持久连接节省通信量

        HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次TCP 连接。

        以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。 可随着 HTTP 的普及,文档中包含大量图片的情况多了起来。
        比如,使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。

2.7.1 持久连接

        为解决上述 TCP 连接的问题, HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接( HTTP Persistent Connections,也称为 HTTP keep-alive 或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

        持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP 请求和响应能够更早地结束, 这样 Web 页面的显示速度也就相应提高了。
        在 HTTP/1.1 中, 所有的连接默认都是持久连接,但在 HTTP/1.0 内并未标准化。 虽然有一部分服务器通过非标准的手段实现了持久连接,但服务器端不一定能够支持持久连接。毫无疑问,除了服务器端,客户端也需要支持持久连接。

2.7.2 管线化

        持久连接使得多数请求以管线化( pipelining)方式发送成为可能。从前发送请求后需等待并收到响应, 才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
        这样就能够做到同时并行发送多个请求, 而不需要一个接一个地等待响应了。

        比如,当请求一个包含 10 张图片的 HTML Web 页面,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术则比持久连接还要快。请求数越多,时间差就越明显。

2.8 使用 Cookie 的状态管理

        HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。假设要求登录认证的 Web 页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面不是要再次登录, 就是要在每次请求报文中附加参数来管理登录状态。
        不可否认,无状态协议当然也有它的优点。由于不必保存状态,自然可减少服务器的 CPU 及内存资源的消耗。从另一侧面来说,也正是因为 HTTP 协议本身是非常简单的,所以才会被应用在各种场景里。

        保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了 Cookie 技术。 Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
        Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie的首部字段信息, 通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后, 会去检查究竟是从哪一个客户端发来的连接请求, 然后对比服务器上的记录,最后得到之前的状态信息。

上图展示了发生 Cookie 交互的情景, HTTP 请求报文和响应报文的内容如下。
①请求报文(没有 Cookie 信息的状态)

②响应报文(服务器端生成 Cookie 信息)

③请求报文(自动发送保存着的 Cookie 信息)

有关请求报文和响应报文内 Cookie 对应的首部字段,请参考之后 的章节。

第3章 HTTP报文内的HTTP信息

3.1 HTTP 报文

        用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的HTTP 报文叫做请求报文, 响应端(服务器端)的叫做响应报文。 HTTP报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。HTTP 报文大致可分为报文首部和报文主体两块。 两者由最初出现的空行( CR+LF)来划分。通常,并不一定要有报文主体。

3.2 请求报文及响应报文的结构

我们来看一下请求报文和响应报文的结构。

请求报文和响应报文的首部内容由以下数据组成。现在出现的各种首部字段及状态码稍后会进行阐述。
请求行
包含用于请求的方法,请求 URI 和 HTTP 版本。
状态行
包含表明响应结果的状态码,原因短语和 HTTP 版本。
首部字段
包含表示请求和响应的各种条件和属性的各类首部。
一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。
其他
可能包含 HTTP 的 RFC 里未定义的首部( Cookie 等)。

3.3 编码提升传输速率

        HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。 通过在传输时编码,能有效地处理大量的访问请求。 但是,编码的操作需要计算机来完成,因此会消耗更多的CPU 等资源。

3.3.1 报文主体和实体主体的差异

●●报文(message) ●
        是 HTTP 通信中的基本单位,由 8 位组字节流( octet sequence,其中 octet 为 8 个比特)组成,通过 HTTP 通信传输。
●●实体(entity) ●
        作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
HTTP 报文的主体用于传输请求或响应的实体主体。
        通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。报文和实体这两个术语在之后会经常出现,请事先理解两者的差异。

3.3.2 压缩传输的内容编码

        向待发送邮件内增加附件时,为了使邮件容量变小,我们会先用ZIP 压缩文件之后再添加附件发送。 HTTP 协议中有一种被称为内容码的功能也能进行类似的操作。
        内容编码指明应用在实体内容上的编码格式, 并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。

常用的内容编码有以下几种。
●●gzip(GNU●zip)
●●compress(UNIX 系统的标准压缩)
●●deflate(zlib)
●●identity(不进行编码)

3.3.3 分割发送的分块传输编码

        在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。 在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。
        这种把实体主体分块的功能称为分块传输编码( Chunked TransferCoding)。

        分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小, 而实体主体的最后一块会使用“0(CR+LF)”来标记。
        使用分块传输编码的实体主体会由接收的客户端负责解码, 恢复到编码前的实体主体。
        HTTP/1.1 中存在一种称为传输编码( Transfer Coding)的机制,它可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。

3.4 发送多种数据的多部分对象集合

        发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为采用了 MIME( Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制, 它允许邮件处理文本、图片、视频等多个不同类型的数据。例如,图片等二进制数据以 ASCII 码字符串编码的方式指明,就是利用 MIME 来描述标记数据类型。而在 MIME 扩展中会使用一种称为多部分对象集合( Multipart)的方法,来容纳多份不同类型的数据。相应地, HTTP 协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。多部分对象集合包含的对象如下。
●●●multipart/form-data
在 Web 表单文件上传时使用。
●●●multipart/byteranges
状态码 206( Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
●●●multipart/form-data

        在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上Content-type。有关这个首部字段,我们稍后讲解。
        使用 boundary 字符串来划分多部分对象集合指明的各类实体。在boundary 字符串指定的各个实体的起始行之前插入“--”标记(例如:--AaB03x、 --THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“--”标记(例如: --AaB03x--、 --THIS_STRING_
SEPARATES--)作为结束。
        多部分对象集合的每个部分类型中, 都可以含有首部字段。另外,可以在某个部分中嵌套使用多部分对象集合。 有关多部分对象集合更详细的解释,请参考 RFC2046。

3.5 获取部分内容的范围请求

        以前,用户不能使用现在这种高速的带宽访问互联网,当时,下载一个尺寸稍大的图片或文件就已经很吃力了。 如果下载过程中遇到网络中断的情况, 那就必须重头开始。为了解决上述问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载。

        要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求( Range Request)。
        对一份 10 000 字节大小的资源,如果使用范围请求,可以只请求5001~10 000 字节内的资源。

执行范围请求时,会用到首部字段 Range 来指定资源的 byte 范围。byte 范围的指定形式如下。

        针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。另外,对于多重范围的范围请求,响应会在首部字段 Content-Type标明 multipart/byteranges 后返回响应报文。
        如果服务器端无法响应范围请求, 则会返回状态码 200 OK 和完整
的实体内容。

3.6 内容协商返回最合适的内容

        同一个 Web 网站有可能存在着多份相同内容的页面。比如英语版和中文版的 Web 页面,它们内容上虽相同,但使用的语言却不同。当浏览器的默认语言为英语或中文, 访问相同 URI 的 Web 页面时,则会显示对应的英语版或中文版的 Web 页面。这样的机制称为内容协商( Content Negotiation)。

        内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。 内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
        包含在请求报文中的某些首部字段(如下)就是判断的基准。这些首部字段的详细说明请参考下一章。
●●Accept
●●Accept-Charset
●●Accept-Encoding
●●Accept-Language
●●Content-Language
内容协商技术有以下 3 种类型。
服务器驱动协商(Server-driven●Negotiation)
        由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,
并不一定能筛选出最优内容。
        客户端驱动协商(Agent-driven●Negotiation)由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用 JavaScript 脚本在 Web 页面上自动进行上述选择。比如按 OS 的类型或浏览器类型,自行切换成 PC 版页面或手机版页面。
        透明协商(Transparent●Negotiation)是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。

  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值