`
wenrunchang123
  • 浏览: 251231 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Etag学习

 
阅读更多

Etag是什么?

        Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。

  HTTP协议规格说明定义ETag为“被请求变量的实体值” 。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。(从定义上看,比较笼统,还是不知道Etag究竟是何方东东)

 

Etag的作用是什么?

       Etag 主要为了解决 Last-Modified 无法解决的一些问题。

  1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

  2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)

  3、某些服务器不能精确的得到文件的最后修改时间;

  为此,HTTP/1.1 引入了 Etag(Entity Tags).Etag仅仅是一个和文件相关的标记,可以是一个版本标记,比如说v1.0.0或者说"2e681a-6-5d044840"这么一串看起来很神秘的编码。但是HTTP/1.1标准并没有规定Etag的内容是什么或者说要怎么实现,唯一规定的是Etag需要放在""内。

 

Etag的原理:

        Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match.请求一个文件的流程可能如下:

  ====第一次请求===

  1.客户端发起 HTTP GET 请求一个文件;

  2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200

  ====第二次请求===

  1.客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d044840

  2.服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;

  流程很简单,问题是,如果服务器又设置了Cache-Control:max-age和Expires呢,怎么办?

  答案是同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.(不要陷入到底使用谁的问题怪圈)

 

Etag实例详解

       首先介绍下,我使用拦截http协议的插件,FF的tamper data。

    个人比较喜欢上猫扑网,下面盗用其图片来简单说说Etag的使用.

       当我首次访问这图片的时候,tamper data工具显示为:

      

 

从上图我们可以看到,服务器端返回响应值为200,并发送回了相应的网页内容,在http响应头中有etag消息头,值为

Etag="Fk40hnnqr90",我们不需要去关心这个响应头的内容是什么,我们只需要将这这个头信息的值记录下来,

 

接着我们刷新下FF,tamper data中显示如下:

 

从上图可以看出,If-None-Math的值跟我们首次访问网页的值是相同的,服务并没有重新发送图片到客户端,只是返回了304的状态。

 

服务端中Etag的实现(以apache为例)

.Apache首先判断是不是弱Etag,这个留在下面讲。如果不是,进入第二种情况:

  强Etag根据配置文件中的配置来设置Etag值,默认的Apache的FileEtag设置为:

  FileEtag INode Mtime Size

  也就是根据这三个属性来生成Etag值,他们之间通过一些算法来实现,并输出成hex的格式,相邻属性之间用-分隔,比如:

  Etag"2e681a-6-5d044840"

  这里面的三个段,分别代表了INodeMTime,Size根据算法算出的值的Hex格式,(如果在这里看到了非Hex里面的字符(也就是0-f),那你可能看见神了:))

  当然,可以改变Apache的FileEtag设置,比如设置成FileEtagSize,那么得到的Etag可能为:

  Etag"6"

  总之,设置了几个段,Etag值就有几个段。(不要误以为Etag就是固定的3段式)

  说明

  这里说的都是Apache2.2里面的Etag实现,因为HTTP/1.1并没有规定Etag必须是什么样的实现或者格式,因此,也可以修改或者完全编写自己的算法得到Etag,比如"2e681a65d044840",客户端会记住并缓存下这个Etag(Windows里面保存在哪里,下次访问的时候直接拿这个值去和服务器生成的Etag对比。

  注意

  不管怎么样的算法,在服务器端都要进行计算,计算就有开销,会带来性能损失。因此为了榨干这一点点性能,不少网站完全把Etag禁用了(比如Yahoo!),这其实不符合HTTP/1.1的规定,因为HTTP/1.1总是鼓励服务器尽可能的开启Etag。

  • 大小: 92.5 KB
  • 大小: 84.8 KB
分享到:
评论

相关推荐

    Laravel开发-laravel-etag

    这个文件可能包括了配置文件、中间件实现、控制器代码以及其他相关的示例文件,可以帮助开发者了解和学习如何在实际项目中利用`Etag`优化性能。 在实际开发中,`Etag`的使用策略有强`Etag`和弱`Etag`两种。强`Etag`...

    并发学习的补充资源整合包

    同时,了解缓存策略,如Last-Modified、ETag、Cache-Control等,可以帮助减少服务器压力,加快响应速度。 5. 并发设计模式: 学习包可能包含对各种并发设计模式的解释,如生产者消费者模型、双端队列、工作窃取...

    webserver学习资料

    3.缓存机制:利用HTTP缓存策略,如ETag和Last-Modified,减少服务器负载。 六、Web服务器日志分析 1. 日志文件:Web服务器记录所有请求的详细信息,如访问时间、IP地址、请求资源等。 2. 日志分析工具:如AWStats和...

    http协议学习总结共10页.pdf.zip

    8. 缓存机制:HTTP协议支持缓存机制,通过Cache-Control和ETag等头部字段,服务器可以指示客户端何时可以使用本地缓存的资源,减少不必要的网络传输。 9. Cookie管理:HTTP协议通过Cookie机制实现会话管理,服务器...

    林信良学习笔记之-AjaxGossip

    2. **性能优化**:减少不必要的请求,使用缓存,压缩数据,以及合理利用HTTP头部信息如Cache-Control和ETag等,都可以提高Ajax应用的性能。 总结,林信良的AjaxGossip学习笔记详细讲解了Ajax的基础知识、工作原理...

    cdn学习总结资料汇总

    当源站内容发生变化时,CDN可以通过预置的更新策略,如文件的最后修改时间或ETag验证,来决定是否需要更新边缘节点的缓存。 5. **安全防护**:CDN还能提供一定的DDoS防护功能,通过限制请求速率、IP黑名单等手段,...

    Volley学习资料和Demo

    1. **自定义缓存策略**:Volley的缓存策略默认是基于HTTP头的ETag和Last-Modified,可以通过自定义Cache-Control来改变缓存行为。 2. **优先级管理**:可以设置请求的优先级,决定哪些请求应该先被处理。 3. **...

    Ajax常用学习案例

    1. 缓存利用:通过设置HTTP头`Cache-Control`和`ETag`实现缓存利用,减少不必要的网络请求。 2. 载入进度:通过监听`progress`事件跟踪上传或下载的进度。 3. 错误处理:合理设置超时、重试策略,以及错误处理函数。...

    http学习系列

    缓存控制头如Cache-Control、ETag、If-None-Match等用于管理缓存策略。另外,内容编码(如gzip)可以压缩数据,减少传输的数据量。 HTTP/1.1是目前广泛使用的版本,引入了连接管理、管道化和持久连接等特性,以提高...

    学习HTTP知识_彩色_pdf

    这个“学习HTTP知识_彩色_pdf”资料包,显然是一份详尽介绍HTTP协议的彩色PDF文档,非常适合编程人员、系统运维人员以及对计算机网络感兴趣的学者进行学习和参考。 首先,我们来深入了解一下HTTP的基础。HTTP基于...

    http学习总结文档

    本文将深入探讨HTTP的学习总结,涵盖其基本概念、工作原理、请求方法、响应状态码、报文结构以及HTTP/1.1与HTTP/2的区别等核心知识点。 一、HTTP基础 HTTP是一种无状态、基于TCP/IP的协议,用于在Web上传输数据。无...

    http协议学习总结协议格式消息头消息体等[参照].pdf

    响应报头包括 Accept-Ranges、Age、ETag、Location 等。实体报头包括 Allow、Content-Encoding、Content-Language 等。 了解 HTTP 协议的工作机理和报头结构对于 Web 开发和网络通信非常重要。

    Java-HTTP协议讲解,使用初级人员入门学习

    ETag: W/"130-1383967170343" Last-Modified: Sat, 09 Nov 2013 03:19:30 GMT Content-Type: text/html Content-Length: 130 Date: Sat, 09 Nov 2013 03:21:50 GMT <!DOCTYPE html> <title>Insert title here ...

    HTTP协议学习笔记之c++

    - **ETag**:实体标记,用于验证资源是否已更改。 - **Last-Modified**:表示资源最后一次被修改的时间,用于判断资源的新鲜程度。 #### 五、状态码与错误处理 HTTP状态码用于表示响应的状态信息,常见的状态码...

    http学习

    - **缓存机制**:HTTP允许客户端缓存资源,通过Cache-Control、ETag等头部字段控制缓存策略。 2. **HTTP方法** - **GET**:获取指定资源,是最常见的请求方法,通常用于读取数据。 - **POST**:向服务器提交数据...

    Laravel 5 学习笔记

    - **ETag Middleware**:一种用于缓存控制的中间件。 #### 视图与模板引擎 - **视图 (Views)**:Laravel 使用 Blade 作为默认的模板引擎,它提供了简洁的语法来渲染 HTML 内容。 - **视图组件**:介绍如何使用...

    HTTP cache trainning

    ... ...它们都是基于HTTP协议的缓存机制,遵循一组特定的规则,即HTTP头字段,如`Cache-Control`, `ETag`, `Last-Modified...通过学习和实践,开发者能够更好地掌握如何有效地利用HTTP缓存来提升用户体验,减少服务器压力。

    Tinman:基于 Experience API 的 Java 学习记录存储

    学习记录存储(LRS)是一个系统,它存储来自体验 API 指定的电子学习平台的数据。 查看以下链接了解更多详情: : 有关规范,请查看他们的 github 页面: : 尚不支持的声明要素:权限、附件 ##Server 身份验证:...

    FRDA_人脸建模_If-None-Match_3d_3D人脸建模_源码.zip

    5. **If-None-Match的使用**:在服务器端,如果客户端发送的请求带有"If-None-Match"头,且该值与服务器存储的Etag(资源的唯一标识)匹配,服务器会返回304状态码,告知客户端资源未更新,避免重复传输数据,优化...

Global site tag (gtag.js) - Google Analytics