(71)一篇文章带你熟悉HTTP协议



做者:涤生_Woo
连接:http://www.jianshu.com/p/6e9e4156ece3
來源:简书
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。

 

本篇文章篇幅比较长,先来个思惟导图预览一下。html

一张图带你看完本篇文章
一张图带你看完本篇文章

1、概述

1.计算机网络体系结构分层

计算机网络体系结构分层
计算机网络体系结构分层

2.TCP/IP 通讯传输流

利用 TCP/IP 协议族进行网络通讯时,会经过分层顺序与对方进行通讯。发送端从应用层往下走,接收端则从链路层往上走。以下:算法

TCP/IP 通讯传输流
TCP/IP 通讯传输流
  • 首先做为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。
  • 接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
  • 在网络层(IP 协议),增长做为通讯目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通讯请求就准备齐全了。
  • 接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP请求。

以下图所示:浏览器

HTTP 请求
HTTP 请求

在网络体系结构中,包含了众多的网络协议,这篇文章主要围绕 HTTP 协议(HTTP/1.1版本)展开。缓存

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可使浏览器更加高效,使网络传输减小。它不只保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪一部分,以及哪部份内容首先显示(如文本先于图形)等。
HTTP是客户端浏览器或其余程序与Web服务器之间的应用层通讯协议。在Internet上的Web服务器上存放的都是超文本信息,客户机须要经过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不只可用于Web访问,也能够用于其余因特网/内联网应用系统之间的通讯,从而实现各种应用资源超媒体访问的集成。
咱们在浏览器的地址栏里输入的网站地址叫作URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址同样,每一个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级连接时,URL就肯定了要浏览的地址。浏览器经过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。安全

2、HTTP 工做过程

HTTP请求响应模型
HTTP请求响应模型

HTTP通讯机制是在一次完整的 HTTP 通讯过程当中,客户端与服务器之间将完成下列7个步骤:性能优化

  1. 创建 TCP 链接
    在HTTP工做开始以前,客户端首先要经过网络与服务器创建链接,该链接是经过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,所以 Internet 又被称做是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议创建以后,才能进行高层协议的链接,所以,首先要创建 TCP 链接,通常 TCP 链接的端口号是80;
  2. 客户端向服务器发送请求命令
    一旦创建了TCP链接,客户端就会向服务器发送请求命令;
    例如:GET/sample/hello.jsp HTTP/1.1
  3. 客户端发送请求头信息
    客户端发送其请求命令以后,还要以头信息的形式向服务器发送一些别的信息,以后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;
  4. 服务器应答
    客户端向服务器发出请求后,服务器会客户端返回响应;
    例如: HTTP/1.1 200 OK
    响应的第一部分是协议的版本号和响应状态码
  5. 服务器返回响应头信息
    正如客户端会随同请求发送关于自身的信息同样,服务器也会随同响应向用户发送关于它本身的数据及被请求的文档;
  6. 服务器向客户端发送数据
    服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;
  7. 服务器关闭 TCP 链接
    通常状况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 链接,而后若是客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 链接在发送后将仍然保持打开状态,因而,客户端能够继续经过相同的链接发送请求。保持链接节省了为每一个请求创建新链接所需的时间,还节约了网络带宽。

3、HTTP 协议基础

1.经过请求和响应的交换达成通讯

应用 HTTP 协议时,一定是一端担任客户端角色,另外一端担任服务器端角色。仅从一条通讯线路来讲,服务器端和客服端的角色是肯定的。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,确定是先从客户端开始创建通讯的,服务器端在没有接收到请求以前不会发送响应。服务器

2.HTTP 是不保存状态的协议

HTTP 是一种无状态协议。协议自身不对请求和响应之间的通讯状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不作持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特地把 HTTP 协议设计成如此简单的。
但是随着 Web 的不断发展,咱们的不少业务都须要对通讯状态进行保存。因而咱们引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通讯,就能够管理状态了。cookie

3.使用 Cookie 的状态管理

Cookie 技术经过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫作 Set-Cookie 的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查到底是从哪个客户端发来的链接请求,而后对比服务器上的记录,最后获得以前的状态信息。网络


Cookie 的流程
Cookie 的流程

4.请求 URI 定位资源

HTTP 协议使用 URI 定位互联网上的资源。正是由于 URI 的特定功能,在互联网上任意位置的资源都能访问到。架构

5.告知服务器意图的 HTTP 方法(HTTP/1.1)

HTTP 方法
HTTP 方法

6.持久链接

HTTP 协议的初始版本中,每进行一个 HTTP 通讯都要断开一次 TCP 链接。好比使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其余资源。所以,每次的请求都会形成无畏的 TCP 链接创建和断开,增长通讯量的开销。
为了解决上述 TCP 链接的问题,HTTP/1.1 和部分 HTTP/1.0 想出了持久链接的方法。其特色是,只要任意一端没有明确提出断开链接,则保持 TCP 链接状态。旨在创建一次 TCP 链接后进行屡次请求和响应的交互。在 HTTP/1.1 中,全部的链接默认都是持久链接。

7.管线化

持久链接使得多数请求以管线化方式发送成为可能。之前发送请求后需等待并接收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可发送下一个请求。这样就能作到同时并行发送多个请求,而不须要一个接一个地等待响应了。
好比,当请求一个包含多张图片的 HTML 页面时,与挨个链接相比,用持久链接可让请求更快结束。而管线化技术要比持久链接速度更快。请求数越多,时间差就越明显。

4、HTTP 协议报文结构

1.HTTP 报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫作请求报文;响应端(服务器端)的叫作响应报文。HTTP 报文自己是由多行(用 CR+LF 做换行符)数据构成的字符串文本。

2.HTTP 报文结构

HTTP 报文大体可分为报文首部和报文主体两部分。二者由最初出现的空行(CR+LF)来划分。一般,并不必定有报文主体。以下:



 
HTTP 报文结构
HTTP 报文结构
2.1请求报文结构
请求报文结构
请求报文结构

请求报文的首部内容由如下数据组成:

  • 请求行 —— 包含用于请求的方法、请求 URI 和 HTTP 版本。
  • 首部字段 —— 包含表示请求的各类条件和属性的各种首部。(通用首部、请求首部、实体首部以及RFC里未定义的首部如 Cookie 等)

请求报文的示例,以下:


请求报文示例
请求报文示例
2.2响应报文结构
响应报文结构
响应报文结构

响应报文的首部内容由如下数据组成:

  • 状态行 —— 包含代表响应结果的状态码、缘由短语和 HTTP 版本。
  • 首部字段 —— 包含表示请求的各类条件和属性的各种首部。(通用首部、响应首部、实体首部以及RFC里未定义的首部如 Cookie 等)

响应报文的示例,以下:


响应报文示例
响应报文示例

5、HTTP 报文首部之请求行、状态行

1.请求行

举个栗子,下面是一个 HTTP 请求的报文:

GET  /index.htm  HTTP/1.1
Host: sample.com

其中,下面的这行就是请求行,

GET  /index.htm  HTTP/1.1
  • 开头的 GET 表示请求访问服务器的类型,称为方法;
  • 随后的字符串 /index.htm 指明了请求访问的资源对象,也叫作请求 URI;
  • 最后的 HTTP/1.1,即 HTTP 的版本号,用来提示客户端使用的 HTTP 协议功能。

综合来看,大意是请求访问某台 HTTP 服务器上的 /index.htm 页面资源。

2.状态行

一样举个栗子,下面是一个 HTTP 响应的报文:

HTTP/1.1  200  OK
Date: Mon, 10 Jul 2017 15:50:06 GMT
Content-Length: 256
Content-Type: text/html
    
<html>
...

其中,下面的这行就是状态行,

HTTP/1.1  200  OK
  • 开头的 HTTP/1.1 表示服务器对应的 HTTP 版本;
  • 紧挨着的 200 OK 表示请求的处理结果的状态码和缘由短语。

6、HTTP 报文首部之首部字段(重点分析)

1.首部字段概述

先来回顾一下首部字段在报文的位置,HTTP 报文包含报文首部和报文主体,报文首部包含请求行(或状态行)和首部字段。
在报文众多的字段当中,HTTP 首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖 HTTP 报文相关的内容信息。使用首部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容。

2.首部字段结构

  • HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。
  • 另外,字段值对应单个 HTTP 首部字段能够有多个值。
  • 当 HTTP 报文首部中出现了两个或以上具备相同首部字段名的首部字段时,这种状况在规范内还没有明确,根据浏览器内部处理逻辑的不一样,优先处理的顺序可能不一样,结果可能并不一致。
首部字段名 冒号 字段值
Content-Type text/html
Keep-Alive timeout=30, max=120

3.首部字段类型

首部字段根据实际用途被分为如下4种类型:

类型 描述
通用首部字段 请求报文和响应报文两方都会使用的首部
请求首部字段 从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
响应首部字段 从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
实体首部字段 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息。

4.通用首部字段(HTTP/1.1)

首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐挑首部、链接的管理
Date 建立报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其余协议
Via 代理服务器的相关信息
Warning 错误通知
4.1 Cache-Control

经过指定首部字段 Cache-Control 的指令,就能操做缓存的工做机制。

4.1.1 可用的指令一览

可用的指令按请求和响应分类以下:
缓存请求指令

指令 参数 说明
no-cache 强制向服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age = [秒] 必需 响应的最大Age值
max-stale( =[秒]) 可省略 接收已过时的响应
min-fresh = [秒] 必需 指望在指定时间内的响应仍有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension - 新指令标记(token)

缓存响应指令

指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅向特定用户返回响应
no-cache 可省略 缓存前必须先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 可缓存但必须再向源服务器进行确认
proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
max-age = [秒] 必需 响应的最大Age值
s-maxage = [秒] 必需 公共缓存服务器响应的最大Age值
cache-extension - 新指令标记(token)
4.1.2 表示可否缓存的指令

public 指令
Cache-Control: public
当指定使用 public 指令时,则明确代表其余用户也可利用缓存。

private 指令
Cache-Control: private
当指定 private 指令后,响应只以特定的用户做为对象,这与 public 指令的行为相反。缓存服务器会对该特定用户提供资源缓存的服务,对于其余用户发送过来的请求,代理服务器则不会返回缓存。

no-cache 指令
Cache-Control: no-cache

  • 使用 no-cache 指令是为了防止从缓存中返回过时的资源。
  • 客户端发送的请求中若是包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。因而,“中间”的缓存服务器必须把客户端请求转发给源服务器。
  • 若是服务器中返回的响应包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器之后也将再也不对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操做。

Cache-Control: no-cache=Location
由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache 字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可使用缓存。只能在响应指令中指定该参数。

no-store 指令
Cache-Control: no-store
当使用 no-store 指令时,暗示请求(和对应的响应)或响应中包含机密信息。所以,该指令规定缓存不能在本地存储请求或响应的任一部分。
注意:no-cache 指令表明不缓存过时的指令,缓存会向源服务器进行有效期确认后处理资源;no-store 指令才是真正的不进行缓存。

4.1.3 指定缓存期限和认证的指令

s-maxage 指令
Cache-Control: s-maxage=604800(单位:秒)

  • s-maxage 指令的功能和 max-age 指令的相同,它们的不一样点是 s-maxage 指令只适用于供多位用户使用的公共缓存服务器(通常指代理)。也就是说,对于向同一用户重复返回响应的服务器来讲,这个指令没有任何做用。
  • 另外,当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及 max-age 指令的处理。

max-age 指令
Cache-Control: max-age=604800(单位:秒)

  • 当客户端发送的请求中包含 max-age 指令时,若是断定缓存资源的缓存时间数值比指定的时间更小,那么客户端就接收缓存的资源。另外,当指定 max-age 的值为0,那么缓存服务器一般须要将请求转发给源服务器。
  • 当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再做确认,而 max-age 数值表明资源保存为缓存的最长时间。
  • 应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的状况时,会优先处理 max-age 指令,并忽略掉 Expires 首部字段;而 HTTP/1.0 版本的缓存服务器则相反。

min-fresh 指令
Cache-Control: min-fresh=60(单位:秒)
min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。

max-stale 指令
Cache-Control: max-stale=3600(单位:秒)

  • 使用 max-stale 可指示缓存资源,即便过时也照常接收。
  • 若是指令未指定参数值,那么不管通过多久,客户端都会接收响应;若是指定了具体参数值,那么即便过时,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。

only-if-cached 指令
Cache-Control: only-if-cached
表示客户端仅在缓存服务器本地缓存目标资源的状况下才会要求其返回。换言之,该指令要求缓存服务器不从新加载响应,也不会再次确认资源的有效性。

must-revalidate 指令
Cache-Control: must-revalidate
使用 must-revalidate 指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍有效。另外,使用 must-revalidate 指令会忽略请求的 max-stale 指令。

proxy-revalidate 指令
Cache-Control: proxy-revalidate
proxy-revalidate 指令要求全部的缓存服务器在接收到客户端带有该指令的请求返回响应以前,必须再次验证缓存的有效性。

no-transform 指令
Cache-Control: no-transform
使用 no-transform 指令规定不管是在请求仍是响应中,缓存都不能改变实体主体的媒体类型。这样作可防止缓存或代理压缩图片等相似操做。

4.1.4 Cache-Control 扩展

Cache-Control: private, community="UCI"
经过 cache-extension 标记(token),能够扩展 Cache-Control 首部字段内的指令。上述 community 指令即扩展的指令,若是缓存服务器不能理解这个新指令,就会直接忽略掉。

4.2 Connection

Connection 首部字段具有如下两个做用:

控制再也不转发的首部字段
Connection: Upgrade
在客户端发送请求和服务器返回响应中,使用 Connection 首部字段,可控制再也不转发给代理的首部字段,即删除后再转发(即Hop-by-hop首部)。

管理持久链接
Connection: close
HTTP/1.1 版本的默认链接都是持久链接。当服务器端想明确断开链接时,则指定 Connection 首部字段的值为 close。
Connection: Keep-Alive
HTTP/1.1 以前的 HTTP 版本的默认链接都是非持久链接。为此,若是想在旧版本的 HTTP 协议上维持持续链接,则须要指定 Connection 首部字段的值为 Keep-Alive。

4.3 Date

代表建立 HTTP 报文的日期和时间。
Date: Mon, 10 Jul 2017 15:50:06 GMT
HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式。

4.4 Pragma

Pragma 首部字段是 HTTP/1.1 版本以前的历史遗留字段,仅做为与 HTTP/1.0 的向后兼容而定义。
Pragma: no-cache

  • 该首部字段属于通用首部字段,但只用在客户端发送的请求中,要求全部的中间服务器不返回缓存的资源。
  • 全部的中间服务器若是都能以 HTTP/1.1 为基准,那直接采用 Cache-Control: no-cache 指定缓存的处理方式最为理想。可是要总体掌握全部中间服务器使用的 HTTP 协议版本倒是不现实的,因此,发送的请求会同时包含下面两个首部字段:
Cache-Control: no-cache
Pragma: no-cache
4.5 Trailer

Trailer: Expires
首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。可应用在 HTTP/1.1 版本分块传输编码时。

4.6 Transfer-Encoding

Transfer-Encoding: chunked

  • 规定了传输报文主体时采用的编码方式。
  • HTTP/1.1 的传输编码方式仅对分块传输编码有效。
4.7 Upgrade

Upgrade: TSL/1.0
用于检测 HTTP 协议及其余协议是否可以使用更高的版本进行通讯,其参数值能够用来指定一个彻底不一样的通讯协议。

4.8 Via

Via: 1.1 a1.sample.com(Squid/2.7)

  • 为了追踪客户端和服务器端之间的请求和响应报文的传输路径。
  • 报文通过代理或网关时,会如今首部字段 Via 中附加该服务器的信息,而后再进行转发。
  • 首部字段 Via 不只用于追踪报文的转发,还可避免请求回环的发生。
4.9 Warning

该首部字段一般会告知用户一些与缓存相关的问题的警告。
Warning 首部字段的格式以下:
Warning:[警告码][警告的主机:端口号] "[警告内容]"([日期时间])
最后的日期时间可省略。
HTTP/1.1 中定义了7种警告,警告码对应的警告内容仅推荐参考,另外,警告码具有扩展性,从此有可能追加新的警告码。

警告码 警告内容 说明
110 Response is stale(响应已过时) 代理返回已过时的资源
111 Revalidation failed(再验证失败) 代理再验证资源有效性时失败(服务器没法到达等缘由)
112 Disconnection operation(断开链接操做) 代理与互联网链接被故意切断
113 Heuristic expiration(试探性过时) 响应的试用期超过24小时(有效缓存的设定时间大于24小时的状况下)
199 Miscellaneous warning(杂项警告) 任意的警告内容
214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
299 Miscellaneous persistent warning(持久杂项警告) 任意的警告内容

5. 请求首部字段(HTTP/1.1)

首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(天然语言)
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与 If-Macth 相反)
If-Range 资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since 比较资源的更新时间(与 If-Modified-Since 相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Referer 对请求中 URI 的原始获取方
TE 传输编码的优先级
User-Agent HTTP 客户端程序的信息
5.1 Accept

Accept: text/html, application/xhtml+xml, application/xml; q=0.5

  • Accept 首部字段可通知服务器,用户代理可以处理的媒体类型及媒体类型的相对优先级。可以使用 type/subtype 这种形式,一次指定多种媒体类型。
  • 若想要给显示的媒体类型增长优先级,则使用 q=[数值] 来表示权重值,用分号(;)进行分隔。权重值的范围 0~1(可精确到小数点后三位),且 1 为最大值。不指定权重值时,默认为 1。
5.2 Accept-Charset

Accept-Charset: iso-8859-5, unicode-1-1; q=0.8
Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。一样使用 q=[数值] 来表示相对优先级。

5.3 Accept-Encoding

Accept-Encoding: gzip, deflate
Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先顺序,并可一次性指定多种内容编码。一样使用 q=[数值] 来表示相对优先级。也可以使用星号(*)做为通配符,指定任意的编码格式。

5.4 Accept-Language

Accept-Lanuage: zh-cn,zh;q=0.7,en=us,en;q=0.3
告知服务器用户代理可以处理的天然语言集(指中文或英文等),以及天然语言集的相对优先级,可一次性指定多种天然语言集。一样使用 q=[数值] 来表示相对优先级。

5.5 Authorization

Authorization: Basic ldfKDHKfkDdasSAEdasd==
告知服务器用户代理的认证信息(证书值)。一般,想要经过服务器认证的用户代理会在接收到返回的 401 状态码响应后,把首部字段 Authorization 加入请求中。共用缓存在接收到含有 Authorization 首部字段的请求时的操做处理会略有差别。

5.6 Expect

Expect: 100-continue
告知服务器客户端指望出现的某种特定行为。

5.7 From

From: Deeson_Woo@163.com
告知服务器使用用户代理的电子邮件地址。

5.8 Host

Host: www.jianshu.com

  • 告知服务器,请求的资源所处的互联网主机和端口号。
  • Host 首部字段是 HTTP/1.1 规范内惟一一个必须被包含在请求内的首部字段。
  • 若服务器未设定主机名,那直接发送一个空值便可 Host:
5.9 If-Match

形如 If-xxx 这种样式的请求首部字段,均可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

If-Match: "123456"

  • 首部字段 If-Match,属附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值。这时的服务器没法使用弱 ETag 值。
  • 服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当二者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。
  • 还可使用星号(*)指定 If-Match 的字段值。针对这种状况,服务器将会忽略 ETag 的值,只要资源存在就处理请求。
5.10 If-Modified-Since

If-Modified-Since: Mon, 10 Jul 2017 15:50:06 GMT

  • 首部字段 If-Modified-Since,属附带条件之一,用于确认代理或客户端拥有的本地资源的有效性。
  • 它会告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则但愿能处理该请求。而在指定 If-Modified-Since 字段值的日期时间以后,若是请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应。
5.11 If-None-Match

If-None-Match: "123456"
首部字段 If-None-Match 属于附带条件之一。它和首部字段 If-Match 做用相反。用于指定 If-None-Match 字段值的实体标记(ETag)值与请求资源的 ETag 不一致时,它就告知服务器处理该请求。

5.12 If-Range

If-Range: "123456"

  • 首部字段 If-Range 属于附带条件之一。它告知服务器若指定的 If-Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则做为范围请求处理。反之,则返回全体资源。
  • 下面咱们思考一下不使用首部字段 If-Range 发送请求的状况。服务器端的资源若是更新,那客户端持有资源中的一部分也会随之无效,固然,范围请求做为前提是无效的。这时,服务器会暂且以状态码 412 Precondition Failed 做为响应返回,其目的是催促客户端再次发送请求。这样一来,与使用首部字段 If-Range 比起来,就须要花费两倍的功夫。
5.13 If-Unmodified-Since

If-Unmodified-Since: Mon, 10 Jul 2017 15:50:06 GMT
首部字段 If-Unmodified-Since 和首部字段 If-Modified-Since 的做用相反。它的做用的是告知服务器,指定的请求资源只有在字段值内指定的日期时间以后,未发生更新的状况下,才能处理请求。若是在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 做为响应返回。

5.14 Max-Forwards

Max-Forwards: 10
经过 TRACE 方法或 OPTIONS 方法,发送包含首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可通过的服务器最大数目。服务器在往下一个服务器转发请求以前,Max-Forwards 的值减 1 后从新赋值。当服务器接收到 Max-Forwards 值为 0 的请求时,则再也不进行转发,而是直接返回响应。

5.15 Proxy-Authorization

Proxy-Authorization: Basic dGlwOjkpNLAGfFY5

  • 接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段 Proxy-Authorization 的请求,以告知服务器认证所须要的信息。
  • 这个行为是与客户端和服务器之间的 HTTP 访问认证相相似的,不一样之处在于,认证行为发生在客户端与代理之间。
5.16 Range

Range: bytes=5001-10000

  • 对于只需获取部分资源的范围请求,包含首部字段 Range 便可告知服务器资源的指定范围。
  • 接收到附带 Range 首部字段请求的服务器,会在处理请求以后返回状态码为 206 Partial Content 的响应。没法处理该范围请求时,则会返回状态码 200 OK 的响应及所有资源。
5.17 Referer

Referer: http://www.sample.com/index.html
首部字段 Referer 会告知服务器请求的原始资源的 URI。

5.18 TE

TE: gzip, deflate; q=0.5

  • 首部字段 TE 会告知服务器客户端可以处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,可是用于传输编码。
  • 首部字段 TE 除指定传输编码以外,还能够指定伴随 trailer 字段的分块传输编码的方式。应用后者时,只需把 trailers 赋值给该字段值。TE: trailers
5.19 User-Agent

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101

  • 首部字段 User-Agent 会将建立请求的浏览器和用户代理名称等信息传达给服务器。
  • 由网络爬虫发起请求时,有可能会在字段内添加爬虫做者的电子邮件地址。此外,若是请求通过代理,那么中间也极可能被添加上代理服务器的名称。

6. 响应首部字段(HTTP/1.1)

首部字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源建立通过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定 URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP 服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
6.1 Accept-Ranges

Accept-Ranges: bytes

  • 首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
  • 可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则指定其为 none。
6.2 Age

Age: 1200

  • 首部字段 Age 能告知客户端,源服务器在多久前建立了响应。字段值的单位为秒。
  • 若建立该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次发起认证到认证完成的时间值。代理建立响应时必须加上首部字段 Age。
6.3 ETag

ETag: "usagi-1234"

  • 首部字段 ETag 能告知客户端实体标识。它是一种可将资源以字符串形式作惟一性标识的方式。服务器会为每份资源分配对应的 ETag 值。
  • 另外,当资源更新时,ETag 值也须要更新。生成 ETag 值时,并无统一的算法规则,而仅仅是由服务器来分配。
  • ETag 中有强 ETag 值和弱 ETag 值之分。强 ETag 值,不论实体发生多么细微的变化都会改变其值;弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产生差别时才会改变 ETag 值。这时,会在字段值最开始处附加 W/: ETag: W/"usagi-1234"
6.4 Location

Location: http://www.sample.com/sample.html

  • 使用首部字段 Location 能够将响应接收方引导至某个与请求 URI 位置不一样的资源。
  • 基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的 URI。
  • 几乎全部的浏览器在接收到包含首部字段 Location 的响应后,都会强制性地尝试对已提示的重定向资源的访问。
6.5 Proxy-Authenticate

Proxy-Authenticate: Basic realm="Usagidesign Auth"

  • 首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。
  • 它与客户端和服务器之间的 HTTP 访问认证的行为类似,不一样之处在于其认证行为是在客户端与代理之间进行的。
6.6 Retry-After

Retry-After: 180

  • 首部字段 Retry-After 告知客户端应该在多久以后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一块儿使用。
  • 字段值能够指定为具体的日期时间(Mon, 10 Jul 2017 15:50:06 GMT 等格式),也能够是建立响应后的秒数。
6.7 Server

Server: Apache/2.2.6 (Unix) PHP/5.2.5
首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。不仅仅会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。

6.8 Vary

Vary: Accept-Language

  • 首部字段 Vary 可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。
  • 从代理服务器接收到源服务器返回包含 Vary 指定项的响应以后,若再要进行缓存,仅对请求中含有相同 Vary 指定首部字段的请求返回缓存。即便对相同资源发起请求,但因为 Vary 指定的首部字段不相同,所以必需要从源服务器从新获取资源。
6.9 WWW-Authenticate

WWW-Authenticate: Basic realm="Usagidesign Auth"
首部字段 WWW-Authenticate 用于 HTTP 访问认证。它会告知客户端适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)。

7. 实体首部字段(HTTP/1.1)

首部字段名 说明
Allow 资源可支持的 HTTP 方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的天然语言
Content-Length 实体主体的大小(单位:字节)
Content-Location 替代对应资源的 URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过时的日期时间
Last-Modified 资源的最后修改日期时间
7.1 Allow

Allow: GET, HEAD

  • 首部字段 Allow 用于通知客户端可以支持 Request-URI 指定资源的全部 HTTP 方法。
  • 当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 做为响应返回。与此同时,还会把全部能支持的 HTTP 方法写入首部字段 Allow 后返回。
7.2 Content-Encoding

Content-Encoding: gzip

  • 首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
  • 主要采用这 4 种内容编码的方式(gzip、compress、deflate、identity)。
7.3 Content-Language

Content-Language: zh-CN
首部字段 Content-Language 会告知客户端,实体主体使用的天然语言(指中文或英文等语言)。

7.4 Content-Length

Content-Length: 15000
首部字段 Content-Length 代表了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用 Content-Length首部字段。

7.5 Content-Location

Content-Location: http://www.sample.com/index.html
首部字段 Content-Location 给出与报文主体部分相对应的 URI。和首部字段 Location 不一样,Content-Location 表示的是报文主体返回资源对应的 URI。

7.6 Content-MD5

Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
首部字段 Content-MD5 是一串由 MD5 算法生成的值,其目的在于检查报文主体在传输过程当中是否保持完整,以及确认传输到达。

7.7 Content-Range

Content-Range: bytes 5001-10000/10000
针对范围请求,返回响应时使用的首部字段 Content-Range,能告知客户端做为响应返回的实体的哪一个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。

7.8 Content-Type

Content-Type: text/html; charset=UTF-8
首部字段 Content-Type 说明了实体主体内对象的媒体类型。和首部字段 Accept 同样,字段值用 type/subtype 形式赋值。参数 charset 使用 iso-8859-1 或 euc-jp 等字符集进行赋值。

7.9 Expires

Expires: Mon, 10 Jul 2017 15:50:06 GMT

  • 首部字段 Expires 会将资源失效的日期告知客户端。
  • 缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段值指定的时间以前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
  • 源服务器不但愿缓存服务器对资源缓存时,最好在 Expires 字段内写入与首部字段 Date 相同的时间值。
7.10 Last-Modified

Last-Modified: Mon, 10 Jul 2017 15:50:06 GMT
首部字段 Last-Modified 指明资源最终修改的时间。通常来讲,这个值就是 Request-URI 指定资源被修改的时间。但相似使用 CGI 脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。

8. 为 Cookie 服务的首部字段

首部字段名 说明 首部类型
Set-Cookie 开始状态管理所使用的 Cookie 信息 响应首部字段
Cookie 服务器接收到的 Cookie 信息 请求首部字段
8.1 Set-Cookie

Set-Cookie: status=enable; expires=Mon, 10 Jul 2017 15:50:06 GMT; path=/;

下面的表格列举了 Set-Cookie 的字段值。

属性 说明
NAME=VALUE 赋予 Cookie 的名称和其值(必需项)
expires=DATE Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录做为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名 做为 Cookie 适用对象的域名 (若不指定则默认为建立 Cookie的服务器的域名)
Secure 仅在 HTTPS 安全通讯时才会发送 Cookie
HttpOnly 加以限制,使 Cookie 不能被 JavaScript 脚本访问
8.1.1 expires 属性
  • Cookie 的 expires 属性指定浏览器可发送 Cookie 的有效期。
  • 当省略 expires 属性时,其有效期仅限于维持浏览器会话(Session)时间段内。这一般限于浏览器应用程序被关闭以前。
  • 另外,一旦 Cookie 从服务器端发送至客户端,服务器端就不存在能够显式删除 Cookie 的方法。但可经过覆盖已过时的 Cookie,实现对客户端 Cookie 的实质性删除操做。
8.1.2 path 属性

Cookie 的 path 属性可用于限制指定 Cookie 的发送范围的文件目录。

8.1.3 domain 属性
  • 经过 Cookie 的 domain 属性指定的域名可作到与结尾匹配一致。好比,当指定 example.com 后,除example.com 之外,www.example.comwww2.example.com 等均可以发送 Cookie。
  • 所以,除了针对具体指定的多个域名发送 Cookie 之 外,不指定 domain 属性显得更安全。
8.1.4 secure 属性

Cookie 的 secure 属性用于限制 Web 页面仅在 HTTPS 安全链接时,才能够发送 Cookie。

8.1.5 HttpOnly 属性
  • Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 JavaScript 脚本没法得到 Cookie。其主要目的为防止跨站脚本攻击(Cross-site scripting,XSS)对 Cookie 的信息窃取。
  • 经过上述设置,一般从 Web 页面内还能够对 Cookie 进行读取操做。但使用 JavaScript 的 document.cookie 就没法读取附加 HttpOnly 属性后的 Cookie 的内容了。所以,也就没法在 XSS 中利用 JavaScript 劫持 Cookie 了。
8.2 Cookie

Cookie: status=enable
首部字段 Cookie 会告知服务器,当客户端想得到 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个 Cookie 时,一样能够以多个 Cookie 形式发送。

9. 其余首部字段

HTTP 首部字段是能够自行扩展的。因此在 Web 服务器和浏览器的应用上,会出现各类非标准的首部字段。
如下是最为经常使用的首部字段。

9.1 X-Frame-Options

X-Frame-Options: DENY
首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其余 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。首部字段 X-Frame-Options 有如下两个可指定的字段值:

  • DENY:拒绝
  • SAMEORIGIN:仅同源域名下的页面(Top-level-browsing-context)匹配时许可。(好比,当指定 http://sample.com/sample.html 页面为 SAMEORIGIN 时,那么 sample.com 上全部页面的 frame 都被容许可加载该页面,而 example.com 等其余域名的页面就不行了)
9.2 X-XSS-Protection

X-XSS-Protection: 1
首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防御机制的开关。首部字段 X-XSS-Protection 可指定的字段值以下:

  • 0 :将 XSS 过滤设置成无效状态
  • 1 :将 XSS 过滤设置成有效状态
9.3 DNT

DNT: 1
首部字段 DNT 属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝我的信息被收集,是表示拒绝被精准广告追踪的一种方法。首部字段 DNT 可指定的字段值以下:

  • 0 :赞成被追踪
  • 1 :拒绝被追踪

因为首部字段 DNT 的功能具有有效性,因此 Web 服务器须要对 DNT作对应的支持。

9.4 P3P

P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND
首部字段 P3P 属于 HTTP 响应首部,经过利用 P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可让 Web 网站上的我的隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
要进行 P3P 的设定,需按如下操做步骤进行:

  • 步骤 1:建立 P3P 隐私
  • 步骤 2:建立 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml
  • 步骤 3:从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中

7、HTTP 响应状态码(重点分析)

1. 状态码概述

  • HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工做。
  • HTTP 状态码如 200 OK ,以 3 位数字和缘由短语组成。数字中的第一位指定了响应类别,后两位无分类。
  • 很多返回的响应状态码都是错误的,可是用户可能察觉不到这点。好比 Web 应用程序内部发生错误,状态码依然返回 200 OK

2. 状态码类别

  类别 缘由短语
1xx Informational(信息性状态码) 接收的请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 须要进行附加操做以完成请求
4xx Client Error(客户端错误状态码) 服务器没法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求出错

咱们能够自行改变 RFC2616 中定义的状态码或者服务器端自行建立状态码,只要遵照状态码的类别定义就能够了。

3. 经常使用状态码解析

HTTP 状态码种类繁多,数量达几十种。其中最经常使用的有如下 14 种,一块儿来看看。

3.1 200 OK

表示从客户端发来的请求在服务器端被正常处理了。

3.2 204 No Content
  • 表明服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不容许返回任何实体的主体。
  • 通常在只须要从客户端向服务器端发送消息,而服务器端不须要向客户端发送新消息内容的状况下使用。
3.3 206 Partial Content

表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 首部字段指定范围的实体内容。

3.4 301 Moved Permanently

永久性重定向。表示请求的资源已被分配了新的 URI。之后应使用资源如今所指的 URI。也就是说,若是已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 从新保存。

3.5 302 Found
  • 临时性重定向。表示请求的资源已被分配了新的 URI,但愿用户(本次)能使用新的 URI 访问。
  • 301 Moved Permanently 状态码类似,但 302 Found 状态码表明资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 未来还有可能发生改变。
3.6 303 See Other
  • 表示因为请求的资源存在着另外一个 URI,应使用 GET 方法定向获取请求的资源。
  • 303 See Other 和 302 Found 状态码有着相同的功能,但 303 See Other 状态码明确表示客户端应采用 GET 方法获取资源,这点与 302 Found 状态码有区别。
3.7 304 Not Modified
  • 表示客户端发送附带条件的请求时,服务器端容许请求访问的资源,但未知足条件的状况。
  • 304 Not Modified 状态码返回时,不包含任何响应的主体部分。
  • 304 Not Modified 虽然被划分到 3xx 类别中,但和重定向没有关系。
3.8 307 Temporary Redirect

临时重定向。该状态码与 302 Found 有着相同的含义。

3.9 400 Bad Request
  • 表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
  • 另外,浏览器会像 200 OK 同样对待该状态码。
3.10 401 Unauthorized
  • 表示发送的请求须要有经过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
  • 另外,若以前已进行过 1 次请求,则表示用户认证失败。
  • 返回含有 401 Unauthorized 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。
3.11 403 Forbidden

代表对请求资源的访问被服务器拒绝了。服务器端没有必要给出详细的拒绝理由,固然也能够在响应报文的实体主体部分对缘由进行描述。

3.12 404 Not Found

代表服务器上没法找到请求的资源。除此以外,也能够在服务器端拒绝请求且不想说明理由的时候使用。

3.13 500 Internal Server Error

代表服务器端在执行请求时发生了错误。也多是 Web 应用存在的 bug 或某些临时的故障。

3.14 503 Service Unavailable

代表服务器暂时处于超负载或正在进行停机维护,如今没法处理请求。若是事先得知解除以上情况须要的时间,最好写入 Retry-After 首部字段再返回给客户端。

8、HTTP 报文实体

1. HTTP 报文实体概述

HTTP 报文结构
HTTP 报文结构

你们请仔细看看上面示例中,各个组成部分对应的内容。
接着,咱们来看看报文和实体的概念。若是把 HTTP 报文想象成因特网货运系统中的箱子,那么 HTTP 实体就是报文中实际的货物。

  • 报文:是网络中交换和传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
  • 实体:做为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。(实体首部相关内容在上面第六点中已有阐述。)

咱们能够看到,上面示例右图中深红色框的内容就是报文的实体部分,而蓝色框的两部份内容分别就是实体首部和实体主体。而左图中粉红框内容就是报文主体。
一般,报文主体等于实体主体。只有当传输中进行编码操做时,实体主体的内容发生变化,才致使它和报文主体产生差别。

2. 内容编码

  • HTTP 应用程序有时在发送以前须要对内容进行编码。例如,在把很大的 HTML 文档发送给经过慢速链接上来的客户端以前,服务器可能会对其进行压缩,这样有助于减小传输实体的时间。服务器还能够把内容搅乱或加密,以此来防止未受权的第三方看到文档的内容。
  • 这种类型的编码是在发送方应用到内容之上的。当内容通过内容编码后,编好码的数据就放在实体主体中,像往常同样发送给接收方。

内容编码类型:

编码方式 描述
gzip 代表实体采用 GNU zip 编码
compress 代表实体采用 Unix 的文件压缩程序
deflate 代表实体采用 zlib 的格式压缩的
identity 代表没有对实体进行编码,当没有 Content-Encoding 首部字段时,默认采用此编码方式

3. 传输编码

内容编码是对报文的主体进行的可逆变换,是和内容的具体格式细节紧密相关的。
传输编码也是做用在实体主体上的可逆变换,但使用它们是因为架构方面的缘由,同内容的格式无关。使用传输编码是为了改变报文中的数据在网络上传输的方式。


内容编码和传输编码的对比
内容编码和传输编码的对比

4. 分块编码

分块编码把报文分割成若干已知大小的块。块之间是紧挨着发送的,这样就不须要在发送以前知道整个报文的大小了。分块编码是一种传输编码,是报文的属性。

分块编码与持久链接
若客户端与服务器端之间不是持久链接,客户端就不须要知道它在读取的主体的长度,而只须要读取到服务器关闭主体链接为止。
当使用持久链接时,在服务器写主体以前,必须知道它的大小并在 Content-Length 首部中发送。若是服务器动态建立内容,就可能在发送以前没法知道主体的长度。
分块编码为这种困难提供了解决方案,只要容许服务器把主体分块发送,说明每块的大小就能够了。由于主体是动态建立的,服务器能够缓冲它的一部分,发送其大小和相应的块,而后在主体发送完以前重复这个过程。服务器能够用大小为 0 的块做为主体结束的信号,这样就能够继续保持链接,为下一个响应作准备。
来看看一个分块编码的报文示例:

分块编码的报文
分块编码的报文

5.多部分媒体类型

MIME 中的 multipart(多部分)电子邮件报文中包含多个报文,它们合在一块儿做为单一的复杂报文发送。每一部分都是独立的,有各自的描述其内容的集,不一样部分之间用分界字符串链接在一块儿。
相应得,HTTP 协议中也采纳了多部分对象集合,发送的一份报文主体内可包含多种类型实体。
多部分对象集合包含的对象以下:

  • multipart/form-data:在 Web 表单文件上传时使用。
  • multipart/byteranges:状态码 206 Partial Content 响应报文包含了多个范围的内容时使用。

6. 范围请求

假设你正在下载一个很大的文件,已经下了四分之三,突然网络中断了,那下载就必须重头再来一遍。为了解决这个问题,须要一种可恢复的机制,即能从以前下载中断处恢复下载。要实现该功能,这就要用到范围请求。
有了范围请求, HTTP 客户端能够经过请求曾获取失败的实体的一个范围(或者说一部分),来恢复下载该实体。固然这有一个前提,那就是从客户端上一次请求该实体到这一次发出范围请求的时间段内,该对象没有改变过。例如:

GET  /bigfile.html  HTTP/1.1
Host: www.sample.com
Range: bytes=20224-
···
实体范围请求示例
实体范围请求示例

上面示例中,客户端请求的是文档开头20224字节以后的部分。

9、与 HTTP 协做的 Web 服务器

HTTP 通讯时,除客户端和服务器外,还有一些用于协助通讯的应用程序。以下列出比较重要的几个:代理、缓存、网关、隧道、Agent 代理

1.代理

代理
代理

HTTP 代理服务器是 Web 安全、应用集成以及性能优化的重要组成模块。代理位于客户端和服务器端之间,接收客户端全部的 HTTP 请求,并将这些请求转发给服务器(可能会对请求进行修改以后再进行转发)。对用户来讲,这些应用程序就是一个代理,表明用户访问服务器。
出于安全考虑,一般会将代理做为转发全部 Web 流量的可信任中间节点使用。代理还能够对请求和响应进行过滤,安全上网或绿色上网。

2. 缓存

浏览器第一次请求:

浏览器第一次请求
浏览器第一次请求

浏览器再次请求:

浏览器再次请求
浏览器再次请求

Web 缓存或代理缓存是一种特殊的 HTTP 代理服务器,能够将通过代理传输的经常使用文档复制保存起来。下一个请求同一文档的客户端就能够享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程 Web 服务器下载快得多。

3. 网关

HTTP / FTP 网关
HTTP / FTP 网关

网关是一种特殊的服务器,做为其余服务器的中间实体使用。一般用于将 HTTP 流量转换成其余的协议。网关接收请求时就好像本身是资源的源服务器同样。客户端可能并不知道本身正在跟一个网关进行通讯。

4. 隧道

HTTP/SSL 隧道
HTTP/SSL 隧道

隧道是会在创建起来以后,就会在两条链接之间对原始数据进行盲转发的 HTTP 应用程序。HTTP 隧道一般用来在一条或多条 HTTP 链接上转发非 HTTP 数据,转发时不会窥探数据。
HTTP 隧道的一种常见用途就是经过 HTTP 链接承载加密的安全套接字层(SSL)流量,这样 SSL 流量就能够穿过只容许 Web 流量经过的防火墙了。

5. Agent 代理

自动搜索引擎“网络蜘蛛”
自动搜索引擎“网络蜘蛛”

Agent 代理是表明用户发起 HTTP 请求的客户端应用程序。全部发布 Web 请求的应用程序都是 HTTP Agent 代理。

相关文章
相关标签/搜索