HTTP是一个客户端和服务器端请求和应答的标准(TCP)。HTTP协议(HyperText Transfer Protocol,超文本传输协议)用于从www服务器传输超文本到本地浏览器的传输协议。它可使浏览器更加高效,使网络传输减小。它不只保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪一部分,以及哪部份内容首先显示(如文本先于图形)等。html
HTTP协议采用了请求/响应模型,即客户端向服务器发送一个请求,请求头包括请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的相似MIME的消息结构;服务器以一个状态行做为响应,响应的内容包括消息协议的版本、成功或者错误编码加上包含服务器信息、实体源信息以及可能的实体内容。HTTP的头信息包括通用头、请求头、响应头和实体头四部分,每一个头域由一个域名、冒号(:)和域值三部分组成。浏览器
通用头域包含请求和响应消息都支持的头域,是做为一个总体而不是特定资源与事务相关联,包括Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。缓存
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另外一个消息处理过程当中缓存处理过程,也就是每条消息都是相互独立的,都有本身的缓存机制。下面列举一些相关的缓存指令(详细参考),指令不区分大小写,而且具备可选参数,默认private。bash
客户端能够在HTTP请求中使用标准Cache-Control指令:服务器
Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached网络
服务器能够在响应中使用的标准Cache-Control指令优化
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>网站
public
编码
代表响应能够被任何对象缓存(包括:发送请求的客户端,代理服务器等)。url
private
代表响应只能被单个用户缓存,不能做为共享缓存(即代理服务器不能缓存它)。
no-cache
代表强制全部缓存了该响应的缓存用户,在使用已存储的缓存数据前,发送带验证器的请求到原始服务器
only-if-cached
代表若是缓存存在,只使用缓存,不管原始服务器数据是否有更新。
max-age=<seconds>
设置缓存存在的最大周期,超过这个时间的缓存被认为过时。与Expires相反,时间是相对于请求的时间。
s-maxsage=<seconds>
覆盖max-age或者Expires头,可是仅适用于共享缓存(好比各个代理),而且私有缓存中会忽略它。
max-stale[=<seconds>]
表示客户端愿意接收一个已通过期的资源。可选的设置一个时间,表示响应不能超过的过期时间。
min-fresh=<seconds>
表示客户端但愿在指定时间内获取最新的响应。
must-revalidate
缓存必须在使用以前验证旧资源的状态,而且不可以使用过时资源。
proxy-revalidate
与must-revalidate做用相同,可是仅适用于共享缓存(例如代理),并被私有缓存忽略。
immutable
表示响应正文不会随时间而改变。资源(若是未过时)在服务器上不发生改变,所以客户端不该发送从新验证请求头(例如If-None-Match或If-Modified-Since)来检查更新,即便用户显示地刷新页面。
no-store
用于防止重要的信息不被无心的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
no-transform
不得对资源进行转换或转变。Content-Encoding、Content-Range、Content-Type等HTTP头不能由代理修改。例如,非透明代理能够对图像格式进行转换,以便节省缓存空间或者减小缓慢链路上的流量。no-transform指令不容许这样作。
Cache-directive | 打开新的浏览器窗口 | 在原窗口单击Enter按钮 | 刷新 | 单击Back按钮 |
---|---|---|---|---|
pubic | 浏览器呈现来自缓存的页面 | 浏览器呈现来自缓存的页面 | 浏览器从新发送请求到服务器 | 浏览器呈现来自缓存的页面 |
private | 浏览器从新发送请求到服务器 | 第一次,浏览器从新发送请求到服务器;此后,浏览器呈现来自缓存的页面 | 浏览器从新发送请求到服务器 | 浏览器呈现来自缓存的页面 |
no-cache/no-store | 浏览器从新发送请求到服务器 | 浏览器从新发送请求到服务器 | 浏览器从新发送请求到服务器 | 浏览器从新发送请求到服务器 |
must-revalidate/proxy-revalidate | 浏览器从新发送请求到服务器 | 第一次,浏览器从新发送请求到服务器;此后,浏览器呈现来自缓存的页面 | 浏览器从新发送请求到服务器 | 浏览器呈现来自缓存的页面 |
max-age=xxx | 在xxx秒后,浏览器从新发送请求到服务器 | 在xxx秒后,浏览器从新发送请求到服务器 | 浏览器从新发送请求到服务器 | 在xxx秒后,浏览器从新发送请求到服务器 |
结论:
操做 | 表现 |
---|---|
打开新窗口 | 若是指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会从新访问服务器。而若是指定了max-age值,那么在此值内的时间里就不会从新访问服务器,例如:Cache-control: max-age=5 表示当访问此网页后的5秒内不会去再次访问服务器. |
在地址栏回车 | 若是值为private或must-revalidate,则只有第一次访问时会访问服务器,之后就再也不访问。若是值为no-cache,那么每次都会访问。若是值为max-age,则在过时以前不会重复访问。 |
按后退按钮 | 若是值为private、must-revalidate、max-age,则不会重访问,而若是为no-cache,则每次都重复访问. |
按刷新按钮 | 不管为什么值都会从新访问 |
Date头域表示消息发送的时间,时间的描述格式由rfc822定义。Date描述的时间表示世界标准时间,换算成本地时间须要知道用户所在的时区。
Pragma头域用来包含实现特定的指令,最经常使用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。
容许客户端传递关于自身的信息和但愿响应形式。
Host头域指定请求资源的Internet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,不然系统会以400状态码返回。
Referer头域容许客户端指定请求uri的源资源地址,这能够容许服务器生成回退链表,可用来登录、优化cache等。他容许废除的或错误的链接因为维护的目的被追踪。若是请求的uri没有本身的uri地址,Referer不能被发送。若是指定的是部分uri地址,则此地址应该是一个相对地址。
Range头域能够请求实体的一个或者多个子范围。可是服务器能够忽略次请求头,若是无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是200(OK)。
User-Agent头域的内容包含发送请求的用户信息。
响应头域容许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通信双方都支持,若是存在不支持的响应头域,通常将会做为实体头域处理。状态码(StatusCode)主要用于机器自动识别,第一个数字定义响应的类别,后两个数字没有分类的做用。第一个数字可能取5个不一样的值:
Location响应头用于重定向接收者到一个新URI地址。
Server响应头包含处理请求的原始服务器的软件信息。
定义被传送资源的信息,便可用于请求,也可用于响应。请求消息和响应消息均可以包含实体信息,实体信息通常由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD五、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header容许客户端定义新的实体头,可是这些域可能没法未接受方识别。实体能够是一个通过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。
用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型Content-Range实体头
用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。通常格式:
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
复制代码
例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234若是一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。
指定服务器上保存内容的最后修订时间。
一次HTTP操做称为一个事务,其工做过程可分为四步:
将网站名称转变为IP地址
在客户端和服务器之间创建正常的TCP网络链接时:
(1)客户端首先发出一个SYN消息,
(2)服务器使用SYN+ACK应答表示接收到了这个消息,
(3)客户端再以ACK消息响应,
这样在客户端和服务器之间才能创建起可靠的TCP链接
所谓的http请求,也就是客户端想服务器发送信息,这个信息由以下三部分组成:
(1)请求行例如:GET www.cnblogs.com HTTP/1.1 请求行写法是固定的,由三部分组成, 第一部分是请求方法: 除了常见的只有Get和Post方法,实际上HTTP请求方法还有不少,好比: PUT方法,DELETE方法,HEAD方法,CONNECT方法,TRACE方法 第二部分是请求网址, 第三部分是HTTP版本。 复制代码
(2)请求头
HTTP头在HTTP请求能够是3种HTTP头: 1. 请求头(request header) 2. 普通头(general header) 3. 实体头(entity header) 一般来讲,因为Get请求每每不包含内容实体,所以也不会有实体头。 复制代码
(3)内容
只在POST请求中存在,由于GET请求并不包含任何实体 复制代码
当服务器收到HTTP请求后,会根据请求的信息作某些处理(这些处理可能仅仅是静态的返回页,或是包含Asp.net,PHP,JSP等语言进行处理后的返回),相应的返回一个HTTP响应。HTTP响应在结构上相似HTTP请求,也是由三部分组成,分别为:
一、状态行例如:HTTP/1.1 200 OK 第一部分是HTTP版本 第二部分是响应状态码 第三部分是状态码的描述 复制代码
二、HTTP头
HTTP响应中包含的头包括: 1. 响应头(response header) 2. 普通头(general header) 3. 实体头(entity header)。 复制代码
三、返回内容
HTTP响应内容就是HTTP请求所请求的信息。 这个信息能够是一个HTML,也能够是一个图片。 响应的数据格式经过Content-Type字段来得到: Content-Type: image/png; 或者咱们熟悉的Content-Type: text/html 复制代码