ElenaWang

简介:

httpHyper Text Transfer Protocol)超文本传输协议是万维网应用层的协议,使用了面向连接的TCP作为运输层协议。

 

特征:

  1. 简单快速:通过url就可以访问资源,协议简单,使得HTTP服务器的程序规模小,通信速度很快。
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. 无连接:每次连接响应一个请求,连接一次响应后就会断开连接。
  4. 无状态:无状态协议,是指对于事务处理没有记忆能力,不会记住客户访问过的状态,不能区分访问身份。

 

http工作原理:

http协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

 

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向服务器请求解析该URL中的域名所对应的IP地址
  2. 浏览器通过IP地址与默认监听的80端口,与服务器建立TCP连接
  3. 浏览器发送请求报文,这个报文作为TCP第三次握手的第三个报文数据发送给服务器
  4. 服务器对请求资源进行定位,响应给客户端,
  5. connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求(即持久连接);
  6. 客户端浏览器首先解析状态行、响应头、然后读取响应数据HTML,并在浏览器窗口中显示。

 

Url:

<协议>//<主机>:<端口(默认80可省略)>/<路径>

UrlUri区分:

url统一资源定位符,uri统一资源标识符,url它是一种具体的URI,即URL可以用来标识一个资源,是uri的子集,即url属于uri

http报文组成:

请求报文:请求行、请求头、空行、请求体

 

 

响应报文:状态行、响应头、空行、响应体

 

请求方法:

GET:获取资源

POST :传输资源

HEAD :获得报文首部

DELETE :删除资源

PUT:更新资源

HTTP1.0定义了三种请求方法: GET, POST HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE CONNECT 方法。

 

Post/Get方法区别:

GetPost方法不安全,参数暴漏在url上,不能用来传递敏感信息;

Geturl中可传递的参数长度是有限的,Post方法可以传递的参数长度没有限制;

Get参数放在url上传递,Post放在request body;

Get请求参数会被完整保留在浏览器历史记录里,Post参数不会被保留;

浏览器回退,Get请求不会重复提交,Post请求会重复提交;

Get请求浏览器会自动缓存,Post请求不会自动缓存。

 

响应行状态码:

1**: 指示信息

2**:成功 200 :ok 206 :partial content(请求带range头的GET请求)

3**:重定向301 :所请求页面转移至新的url,永久重定向 302:临时重定向 304:内容未修改

4**:客户端错误 400:客户端语法错误 403:被请求页面访问被禁止 404:没找到资源

5**:服务器错误 503:服务器过载或当机。

状态码、请求头、响应头资料转载连接:

http://www.51testing.com/html/38/225738-216202.html

 

持久连接(持续连接)

http1.1版本开始支持持久连接,即keep-alive连接,在使用非持久连接的状态下,http采用的是“请求--应答模式”,每次请求的时候建立连接,完成之后断开连接,即无连接状态。持久连接(持续连接)即响应完成之后还保持连接,可以继续在这条连接上传送http请求报文和响应报文。

 

管线化:

在使用持久连接的情况下,某个连接上消息的传递类似于:

请求1 ==> 响应1 ==> 请求2 ==> 响应2 ==> 请求3 ==> 响应3  

某个连接上的消息变成:

请求1 ==> 请求2 ==> 请求3 ==> 响应1 ==> 响应2 ==> 响应3

特点:通过持久连接完成,仅http1.1支持;仅GETHEAD请求可以进行管线化,post有所限制,初次创建连接时不应启动管线化,因为服务器不一定支持,管线化不会影响响应的顺序,服务端支持管线化,并不要求服务端也对管线化进行处理。由于端管线化并不能带来大幅度的性能提高,因此现代浏览器chromefirefox并未开启管线化。

 

http/https区别:

https是在http下加入SSL层进行安全加密。http标准端口是80 ,而https的标准端口是443。                                                                                                                                                                                                                      

 

与缓存有关的头部:

Expires:

有效期,过期时间,这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修改。几乎所有的缓存服务器都支持Expires(过期时间)属性。

 

Cache-control

这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。用于阻止缓存对请求或响应造成不利干扰的行为。这些指令通常覆盖默认缓存算法,比如 Expires Last-Modified。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。

客户端可以在HTTP请求中使用的标准 Cache-Control 指令:

Cache-Control: max-age=<seconds>

缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高

Cache-Control: max-stale[=<seconds>]

Cache-Control: min-fresh=<seconds>

Cache-control: no-cache

必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag)no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。

Cache-control: no-store

    所有内容都不会被缓存到缓存或 Internet 临时文件中。

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>

 

Last-modified/If-Modified-Since

如果第二次请求相同的数据,可以告诉服务器上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。

如果数据从那时起没有改变,服务器将返回一个304,当服务器发送状态编码 304 时,不再重新发送数据。您仅仅获得了这个状态代码。所以当数据没有更新时,你不需要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。

 

ETag/If-None-Match

ETag用于标示URL对象是否改变,在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:ETag:"50b1c1d4f775c61:df3"客户端的查询更新格式是这样的:If-None-Match : W / "50b1c1d4f775c61:df3"如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。测试Etag主要在断点下载时比较有用。

 

Expires/Cache-Control Header是控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只是Cache-ControlExpires可以控制的多一些, 而且Cache-Control会重写Expires的规则。

 

Last-Modified/If-Modified-SinceETag/If-None-Match是浏览器发送请求到服务器后判断文件是否已经修改过,如果没有修改过就只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器。

 

相关文章: