一、前言
第一眼看到这三者的关系可能心里会疑惑,他们有什么联系呢?Elog一个前端的HTTP缓存,hash就是一个普通的算法,按位异或运算是二进制的运算法则,看似风马牛有点不相及,实则,一个简单的网页请求就能将他们三个串联起来。
二、什么是Etag
ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思。在HTTP1.1协议中其实就是请求HEAD中的一个属性而已。下图是b站主页的一张图片的请求
注意红框标出的位置,思考为什么要用ETag呢?
ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证。它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: “3f80f-1b6-3e1cb03b” 的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。
其实,HTTP中并没有指定如何生成Etag,哈希是比较理想的选择,但是对于一个超大文件,比如7-8个G的视频,如果还用哈希,这对与服务器的内存来说,压力是巨大的
所以,通常情况下,ETag更类似于资源指纹(fingerprints),如果资源发生变化了就会生成一个新的指纹,这样可以快速的比较资源的变化。在服务器端实现中,很多情况下并不会用哈希来计算ETag,这会严重浪费服务器端资源,很多网站默认是禁用ETag的。有些情况下,可以通过按位异或运算计算出一个‘资源指纹’比如通过资源的版本+修改时间来生成’ETag‘。
三、按位异或运算
什么是异或,异或运算以及异或运算的作用
简而言之:按位异或运算就是将两个二进制文件的每一位进行比对,相同为0,不同为0.
四,总结
对于最终的ETag:就是后台服务器通过将文件二进制化,然后将文件修改时间和文件大小进行按位异或运算,只要发生了变化,就一定跟前端浏览器缓存的etag不一致,这时候再将后端数据发送前端就好了。这样即节省流量又减轻了服务器的压力。