我知道到的HTTP

610 阅读12分钟

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

一、协议基础

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

1、通用头域

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

Cache-Control头域

Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中缓存处理过程,也就是每条消息都是相互独立的,都有自己的缓存机制。下面列举一些相关的缓存指令(详细参考),指令不区分大小写,并且具有可选参数,默认private。

缓存请求指令

客户端可以在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

表明响应可以被任何对象缓存(包括:发送请求的客户端,代理服务器等)。

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相同。

2、请求头域

允许客户端传递关于自身的信息和希望响应形式。

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头域的内容包含发送请求的用户信息。

3、响应头域

响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和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响应头包含处理请求的原始服务器的软件信息。

4、实体头域

定义被传送资源的信息,即可用于请求,也可用于响应。请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、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实体头

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

二、工作流程

一次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请求,也是由三部分组成,分别为:
1、状态行

例如:HTTP/1.1 200 OK
第一部分是HTTP版本
第二部分是响应状态码
第三部分是状态码的描述

2、HTTP头

HTTP响应中包含的头包括:
1. 响应头(response header) 
2. 普通头(general header) 
3. 实体头(entity header)。

3、返回内容

HTTP响应内容就是HTTP请求所请求的信息。
这个信息可以是一个HTML,也可以是一个图片。
响应的数据格式通过Content-Type字段来获得:
Content-Type: image/png;
或者我们熟悉的Content-Type: text/html
  1. 浏览器解析html代码,并请求html代码中的资源
  2. 浏览器对页面进行渲染并呈现给用户