我知道到的HTTP

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。HTTP协议(HyperText Transfer Protocol,超文本传输协议)用于从www服务器传输超文本到本地浏览器的传输协议。它可使浏览器更加高效,使网络传输减小。它不只保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪一部分,以及哪部份内容首先显示(如文本先于图形)等。html

1、协议基础

HTTP协议采用了请求/响应模型,即客户端向服务器发送一个请求,请求头包括请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的相似MIME的消息结构;服务器以一个状态行做为响应,响应的内容包括消息协议的版本、成功或者错误编码加上包含服务器信息、实体源信息以及可能的实体内容。HTTP的头信息包括通用头、请求头、响应头和实体头四部分,每一个头域由一个域名、冒号(:)和域值三部分组成。浏览器

一、通用头域

通用头域包含请求和响应消息都支持的头域,是做为一个总体而不是特定资源与事务相关联,包括Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。缓存

Cache-Control头域

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头域

Date头域表示消息发送的时间,时间的描述格式由rfc822定义。Date描述的时间表示世界标准时间,换算成本地时间须要知道用户所在的时区。

Pragma头域

Pragma头域用来包含实现特定的指令,最经常使用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

二、请求头域

容许客户端传递关于自身的信息和但愿响应形式。

Host头域

Host头域指定请求资源的Internet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,不然系统会以400状态码返回。

Referer头域

Referer头域容许客户端指定请求uri的源资源地址,这能够容许服务器生成回退链表,可用来登录、优化cache等。他容许废除的或错误的链接因为维护的目的被追踪。若是请求的uri没有本身的uri地址,Referer不能被发送。若是指定的是部分uri地址,则此地址应该是一个相对地址。

Range头域

Range头域能够请求实体的一个或者多个子范围。可是服务器能够忽略次请求头,若是无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是200(OK)。

User-Agent头域

User-Agent头域的内容包含发送请求的用户信息。

三、响应头域

响应头域容许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通信双方都支持,若是存在不支持的响应头域,通常将会做为实体头域处理。状态码(StatusCode)主要用于机器自动识别,第一个数字定义响应的类别,后两个数字没有分类的做用。第一个数字可能取5个不一样的值:

  • 1xx:信息响应类,表示接收到请求而且继续处理
  • 2xx:处理成功响应类,表示动做被成功接收、理解和接受
  • 3xx:重定向响应类,为了完成指定的动做,必须接受进一步处理
  • 4xx:客户端错误,客户端请求包含语法错误或者是不能正确执行
  • 5xx:服务端错误,服务器不能正确执行一个正确的请求

Location响应头

Location响应头用于重定向接收者到一个新URI地址。

Server响应头

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定义。

Content-Type实体头

用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型Content-Range实体头

Content-Range实体头

用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。通常格式:

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
复制代码

例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234若是一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

Last-modified实体头

指定服务器上保存内容的最后修订时间。

2、工做流程

一次HTTP操做称为一个事务,其工做过程可分为四步:

  1. 域名解析

将网站名称转变为IP地址

  1. 发起TCP的3次握手协议

在客户端和服务器之间创建正常的TCP网络链接时:
(1)客户端首先发出一个SYN消息,
(2)服务器使用SYN+ACK应答表示接收到了这个消息,
(3)客户端再以ACK消息响应,
这样在客户端和服务器之间才能创建起可靠的TCP链接

  1. 创建TCP链接后发起http请求

所谓的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请求并不包含任何实体
复制代码
  1. 服务器响应http请求,浏览器获得html代码

当服务器收到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
复制代码
  1. 浏览器解析html代码,并请求html代码中的资源
  2. 浏览器对页面进行渲染并呈现给用户
相关文章
相关标签/搜索