zoukankan      html  css  js  c++  java
  • fiddler——http——缓存、http协议压缩、url encode

    cache:缓存
    
    
    http中具有缓存功能的是浏览器缓存,以及缓存代理服务器。
    
    
    http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。
    
    
    web服务器通过一下两种方式来判断浏览器缓存是否最新:
    
    (1):浏览器把缓存文件的最后修改时间通过header“if-modified-since”告诉服务器
    
    (2):浏览器把缓存文件的ETag通过header“if-none-match”告诉服务器
    
    
    通过最后修改时间来判断缓存的新鲜度:
    
    
    1. 浏览器客户端想请求一个文档,首先检查本地缓存,发现存在这个文档的缓存,获取缓存中文档的最后修改时间,通过: If-Modified-Since, 发送Request给Web服务器。
    
    2. Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 
    
       如果时间是一样的,说明缓存还是最新的,Web服务器将发送304 Not Modified给浏览器客户端,告诉客户端直接使用缓存里的版本。
    
    
    3. 假如该文档已经被更新了。Web服务器将发送该文档的最新版本给浏览器客户端
    
    
    与缓存有关的header我们来看看每个header的具体含义。
    
    Request
    
    Cache-Control: max-age=0    以秒为单位
    
    
    If-Modified-Since: Mon, 19 Nov 2012 08:38:01 GMT    缓存文件的最后修改时间。
    
    
    If-None-Match: "0693f67a67cc1:0"    缓存文件的Etag值
    
    
    Cache-Control: no-cache        不使用缓存
    
    
    Pragma: no-cache       不使用缓存
     
    
    --------------------------------------------------     
    
    Response
    
    
    Cache-Control: public    响应被缓存,并且在多用户间共享,  (公有缓存和私有缓存的区别,请看另一节)
    
    Cache-Control: private    响应只能作为私有缓存,不能在用户之间共享
    
    Cache-Control:no-cache    提醒浏览器要从服务器提取文档进行验证
    
    Cache-Control:no-store    绝对禁止缓存(用于机密,敏感文件)
    
    Cache-Control: max-age=60    60秒之后缓存过期(相对时间)
    
    Date: Mon, 19 Nov 2012 08:39:00 GMT    当前response发送的时间
    
    Expires: Mon, 19 Nov 2012 08:40:01 GMT    缓存过期的时间(绝对时间)
    
    Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT    服务器端文件的最后修改时间
    
    ETag: "20b1add7ec1cd1:0"    服务器端文件的Etag值
     
    
    如果同时存在cache-control和Expires怎么办呢?浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires 
    ---------------------------------------------------------------------------------------
     
    
     
    ETag
    
    
    ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 
    
        当资源发送改变时,ETag也随之发生变化。
    
    
    
    ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。
    
    
    
    为什么使用ETag呢? 主要是为了解决Last-Modified 无法解决的一些问题。
    
    1. 某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。
    
    2. 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。
    
    3. 一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。
     
    
    ----------------------------------------------------------------------------------------------------
    
    浏览器不使用缓存:
    
    
    CTRL+F5强制刷新浏览器,或者设置IE。  可以让浏览器不使用缓存。
    
    1. 浏览器发送Http request, 给Web 服务器, header中带有Cache-Control: no-cache.   明确告诉Web服务器,客户端不使用缓存。 
    
    2. Web服务器将把最新的文档发送给浏览器客户端.
    
    -----------------------------------------------------------------------------------------------------------

    =======================================================================================================

    http压缩过程
    
    
    (1)浏览器发送http请求给web服务器,请求的header中accept-encoding:gzip,deflate能告诉服务器浏览器支持什么压缩;
    
    (2)web服务器接收到http请求后,生成原始的http响应,其中有原始的content-type和content-length
    
    (3)web服务器通过gzip来对http响应进行编码,编码后header中有content-type和content-length(压缩后的大小),
    
         并且增加了content-encoding:gzip,然后把http响应发送给浏览器。
    
    (4)浏览器接收到http响应后,根据content-encoding:gzip对http响应进行解码,获取原始http响应后显示出网页
    
    
    content-encoding里面用标准化的代号来说说明编码时使用的算法,内容编码类型有:
    
    gzip:表明实体采用GNU zip编码;
    
    compress:表明实体采用UNIX的文件压缩程序;
    
    deflate:表明是用zlib的格式压缩的;
    
    identify:表明没有对实体进行编码;    当没有content-encoding header时,就默认这种情况;
    
    
    gzip、compress、deflate编码都是无损压缩算法,用于减少报文传输的大小,不会导致信息损失。其中gzip效率最高,使用最广泛。

    gzip的不足之处:jpeg这类文件用gzip压缩效果不够好,gzip占用了一些服务器和客户端cpu。

    gzip是如何压缩的:在一个文件中找类似的字符串,并临时替换他们,从而使整个文件变小,这种形式对web来说非常合适。因为html和css文件通常包含大量重复的字符串。

    注意:http请求也是可以编码的:一些程序在发送http请求时会自动对其进行编码。

    http协议中,可以对内容(也就是body部分)进行编码,如gzip等方式;

    注意:http压缩是http内容编码的一种。

    ============================================================================================

    url  encode(url编码):就是把所有非英文字母、数字字符都替换成百分号 %  后加两位十六进制数,比如空格的编码为 %20 ;

     比如:百度搜索  中国  两个汉字:

    GET /s?ie=utf-8&mod=1&isbd=1&isid=8B7CDFC655B19319&ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=sitehao123&wd=%E4%B8%AD%E5%9B%BD&rsv_pq=ffaa12a1001de0da&rsv_t=42f0%2FeGbon2R9oyxCo9nG%2FP7gkAQlXdxmoiJS5ObTJhFJHuth033DDEklxUXelwK9Q&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=10&rsv_sug1=6&rsv_sug7=100&inputT=7359&rsv_sug4=8161&rsv_sid=1469_21080_30211_30496_30412_30284_26350_30499&_ss=1&clist=&hsug=&f4s=1&csor=2&_cr1=31570 HTTP/1.1

  • 相关阅读:
    代码互改
    第一次个人编程作业
    第一次博客
    个人总结
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    记录浏览他人代码
    中文编程作业
    第一篇随笔
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/12116358.html
Copyright © 2011-2022 走看看