2019-04-03-9:24
Atwood's Law
1、地址栏网址缓存
比如:之前输入过 jianshu.com
,当你输入j
的时候,浏览器地址栏会自动出现 jianshu.com
2、检查 HSTS 预加载列表(TODO:还没仔细看,不太懂,后面空了再补充)
3、DNS 缓存
域名解析最少涉及了三个地方的缓存:
浏览器的 DNS 缓存
操作系统中的 DNS 缓存
索操作系统的 hosts 文件(可手动写入的缓存)
浏览器搜索自己的 DNS 缓存(浏览器维护一张域名与 IP 地址的对应表);如果没有命中,进入下一步;
搜索操作系统中的 DNS 缓存;如果没有命中,进入下一步;
搜索操作系统的 hosts 文件( Windows 环境下,维护一张域名与 IP 地址的对应表);如果没有命中,进入下一步;
4、ARP(地址解析协议)缓存
- ARP 是一种用以解释地址的协议,根据通信方的 IP 地址就可以反查出对应方的 MAC 地址
当地址解析协议被询问一个已知 IP 地址节点的 MAC 地址时,先在 AR 缓存中查看,若存在,就直接返回与之对应的MAC地址;若不存在,才发送 ARP 请求查询。
5、TCP 发送缓冲区 & 接收缓冲区
建立 TCP 连接这一步也涉及到缓存 —— 用来临时存放双方通信的数据,保证通信数据不会丢包。
6、HTTP 请求缓存( CDN 节点缓存、代理服务器缓存、浏览器缓存、后端动态计算结果缓存等 )
强缓存 ( Cache-Control 和 Expires )
这里基本都知道,不解释
协商缓存 ( Last-Modified 和 Etag )
如果强缓存没有命中,就会发起一个请求到服务器,看协商缓存是否命中,如果命中,请求响应返回http 304,并显示一个Not Modified
字符串
协商缓存是利用【last-Modified, If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的
1、Last-Modified,If-Modified-Since
Last-Modified 表示本地文件最后修改日期,浏览器会在request header加上If-Modified-Since(上次返回的Last-Modified的值),询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来
但是如果在本地打开缓存文件,就会造成 Last-Modified 被修改,所以在 HTTP / 1.1 出现了 ETag
2、ETag、If-None-Match
Etag就像一个指纹,资源变化都会导致ETag变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的
If-None-Match的header会将上次返回的Etag发送给服务器,询问该资源的Etag是否有更新,有变动就会发送新的资源回来
ETag
的优先级比Last-Modified
更高
具体为什么要用ETag,主要出于下面几种情况考虑:
一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
某些服务器不能精确的得到文件的最后修改时间。
几种状态码的区别
200:强缓Expires/Cache-Control存失效时,返回新的资源文件
200(from cache): 强缓Expires/Cache-Control两者都存在,未过期,Cache-Control优先Expires时,浏览器从本地获取资源成功
304(Not Modified ):协商缓存Last-modified/Etag没有过期时,服务端返回状态码304
网友评论