当前位置:首页 » 硬盘大全 » 浏览器缓存用到的协议
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

浏览器缓存用到的协议

发布时间: 2023-05-10 00:12:06

Ⅰ 浏览器缓存机制

有dns的地方,就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。

DNS查询过程如下:

首先搜索浏览器自身的DNS缓存,如果存在,则域名解析到此完成。
如果浏览器自身的缓存里面没有找到对应的条目,那么会尝试读取操作系统的hosts文件看是否存在对应的映射关系,如果存在,则域名解析到此完成。
如果本地hosts文件不存在映射关系,则查找本地DNS服务器(ISP服务器,或者自己手动设置的DNS服务器),如果存在,域名到此解析完成。
如果本地DNS服务器还没找到的话,它就会向根服务器发出请求,进行递归查询。

浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的
Cache-control: max-age 的字段来设置CDN边缘节点数据缓存时间。

当浏览器向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向服务器发出回源请求,从服务器拉取最新数据,更新本地缓存,并将最新数据返回给客户端。 CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。

CDN 优势
CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低。
大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源服务器的负载。

http请求报文(request)
请求行
请求方法  空格  URL 空格  协议版本 回车符 换行符
请求头(通用信息头、请求头、实体头)
头部字段名 冒号  值  回车键 换行符
...
头部字段名 冒号  值  回车键 换行符
空行
回车符   换行符
实体主体(只有post请求有)
主体

http响应报文(response)
状态行
协议版本  空格  状态码 空格  状态码描述 回车符 换行符
响应头部
头部字段名 冒号  值   回车符 换行符
...
头部字段名 冒号  值   回车符 换行符
空行
回车符   换行符
响应正文
正文

浏览器初次向服务器发起请求后拿到请求结果,会根据响应报文中HTTP头的缓存标识,决定是否缓存返回的结果,是则将请求结果和缓存标识存入浏览器缓存中

浏览器每次发起请求,都会现在浏览器缓存中查找该请求的结果以及缓存标识
浏览器                浏览器缓存        服务器

——————第一次发起http请求——————>

<——没有该请求的缓存结果和缓存标识————

——————————————发起http请求——————————————>

<——————————返回该请求结果和缓存规则————————————

——将请求结果和缓存标识存入浏览器缓存——>

强制缓存就是向浏览器缓存查找结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程

强制缓存的情况分为三种:
1、不存在该缓存结果和缓存标识,强制缓存失效,直接向服务器发起请求
2、存在该缓存结果和缓存标识,但结果已经失效,强制缓存失效,使用协商缓存
3、存在该缓存结果和缓存标识,且该结果没有失效,强制缓存生效,直接返回该结果

控制强制缓存的字段:Expires,Cache-Control

Expires 是 HTTP/1.0 控制缓存的字段,值为服务器返回该请求的结果缓存时间
即再次发送请求是,客户端时间 小于 Expires的值,直接使用缓存结果

Cache-Control 是HTTP/1.1的规则,主要用于控制网页缓存,主要取值为:
public:所有的内容都缓存(客户端和代理服务器都可以缓存)
private:所有内容只有客户端可以缓存(默认值)
no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
no-store:即不使用强制缓存,也不使用协商缓存
max-age=xxx:缓存内容将在xxx秒后失效

Expires 是一个绝对值
Cache-Control 中 max-age 是相对值,解决了 Expires时期 服务端与客户端 可能出现时间差的问题

注:Expires和Cache-Control同时存在时,只有Cache-Control生效

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程

协商缓存的两种情况:
1、协商缓存生效,返回304,继续使用缓存
过程:
浏览器                 浏览器缓存     服务器

————————发起http请求————————>

<——该请求的缓存结果失效,只返回缓存标识——

————————携带该资源的缓存标识,发起http请求————————>

<—————————————304,该资源无更新————————————

——————获取该请求的缓存结果——————>

<——————返回该请求的缓存结果——————

2、协商缓存失败,返回200和请求结果
过程:
浏览器                 浏览器缓存     服务器

————————发起http请求————————>

<——该请求的缓存结果失效,只返回缓存标识——

————————携带该资源的缓存标识,发起http请求————————>

<————————200,资源已更新,重新返回请求和结果———————

——将该请求结果和缓存标识存入浏览器缓存中—>

协商缓存的标识也是在响应报文的HTTP头中和请求结果一起返回给浏览器的

控制协商缓存的字段:
(1) Last-Modified/If-Modified-Since:Last-Modified是服务器响应请求是,返回该资源文件在服务器最后被修改的时间;If-Modified-Since再次发起请求时,携带上次返回的Last-Modified的值,服务器将该字段值与该资源最后修改时间对比,决定是否用缓存
(2)Etag/If-None-Match:Etag服务器响应请求时,返回当前资源文件的一个唯一标识,由服务器生成之;If-None-Match是再次发起请求时,携带上次返回的唯一标识Etag的值,服务器收到后,将该字段值与该资源在服务器上的Etag对比,一致 则返回304,否则返回200

注:Etag/If-None-Match优先级高于Last-Modified/If-Modified-Since,同时存在时只有Etag/If-None-Match生效

浏览器缓存分为:内存缓存 和 硬盘缓存

内存缓存特性:
(1)快速读取:内存缓存会将编译解析后的文件,存入该进程的内存中,便于下次运行时快速读取
(2)时效性:一旦关闭进程,进程内存清空

硬盘缓存特性:
永久性:直接写入硬盘文件中
复杂、缓慢:读取缓存对该缓存存放的硬盘文件进行I/O操作,重新解析

from memory cache:使用内存中的缓存

from disk cache:使用硬盘中的缓存

浏览器读取顺序:memory ——> disk

浏览器将js和图片等文件解析执行后直接存入内存缓存中,F5刷新页面时,from memory cache(使用内存中的缓存)
css文件存入硬盘中,F5刷新页面时,from disk cache(使用硬盘中的缓存)

参考文章
https://segmentfault.com/a/1190000017962411
https://www.cnblogs.com/chengxs/p/10396066.html

Ⅱ 浏览器缓存功能在使用上都有哪些类型

缓存功能的存在,让我们在浏览网页和访问防止的时候可以更快的加载我们需要的内容,而今天北森手大青鸟就通过案例分析来了解一下,浏览器的缓存功能在使用上都有哪些类型。

1.ServiceWorker


ServiceWorker是运行在浏览器背后的独立线程,一般可以用来实现缓存功能。使用ServiceWorker的话,传输协议必须为HTTPS。因为ServiceWorker中涉及到请求拦截,所以必须使用HTTPS协议来保障安全。ServiceWorker的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。


ServiceWorker实现缓存功能一般分为三个步骤:先需要先注册ServiceWorker,然后监听到install事件以后就可以缓存需要的文件,那么在下次用户访问的时候就可以通过拦截请求的方式查询是否存在缓存,存在缓存的话就可以直接读取缓存文件,否则就去请求数据。


当ServiceWorker没有命中缓存的时候,我们需要去调用fetch函数获取数据。也就是说,如果我们没有在ServiceWorker命中缓存的话,会根据缓存查找优先级去查找数据。但是不管我们是从MemoryCache中还是从网络请求中获取的数据,浏览器都会显示我们是从ServiceWorker中获取的内容。


2.MemoryCache


MemoryCache也就是内存中的缓存,主要包含的是当前中页面中已经抓取到的资源,例如页面上已经下载的样式、脚本、图片等。读取内存中的数据肯定比磁盘快,内存缓存虽运春碧然读取高效,可是缓存持续性很短,会随着进程的释放而释放。一旦我们关闭Tab页面,内存中的缓存也就被释放了。


那么既然内存缓存这么高效,我们是不是能让数据都存放在内存中呢?


这是不可能的旁举。计算机中的内存一定比硬盘容量小得多,操作系统需要精打细算内存的使用,所以能让我们使用的内存必然不多。


Ⅲ Http协议中,用于控制缓存的Header有哪些并简要说明

  • Last-Modified(服务器响应) 和 If-Modified-Since(浏览器请求)

  • ETag(服务器) 和 If-None-Match(浏览器)

  • Expires(服务器响应传递,格林威治格式的一个具体的时间点)

  • Cache-Control(服务器建议的缓存策略)

    max-age:时间长度。(浏览器和共享高速缓存缓存有效的时长)

    s-maxage: 时间长度。共享高速缓存的缓存有效时长(浏览器不进行缓存)

    no-cache:浏览器不从缓存读取,必须请求服务器。

    no-store:不缓存任何请求和响应信息。

    public:对任何缓存媒介都可缓存该响应。

    private:只允许个体客户端缓存,不允许共享高速缓存。

可以看这篇文章:网页链接

Ⅳ 缓存是什么意思

缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。

缓存的工作原理是当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。

正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。

(4)浏览器缓存用到的协议扩展阅读

缓存的状态数据只是主数据的快照,由于数据源可能被修改,所以状态数据就有会陈旧的特性。合理利用此特性和将数据陈旧的负面影响最小化是缓存状态数据的一个重要任务。

缓存介质从技术上划分,可以分成内存、硬盘文件、数据库三种。将缓存存储于内存中是最快的选择,无需额外的I/O开销,但是内存的缺点是没有持久化落地物理磁盘,一旦应用异常,重新启动数据很难或者无法复原。

缓存中可以存放的最大元素的数量,一旦缓存中元素数量超过这个值(或者缓存数据所占空间超过其最大支持空间),那么将会触发缓存启动清空策略根据不同的场景合理的设置最大元素值往往可以一定程度上提高缓存的命中率,从而更有效的时候缓存。

Ⅳ 浏览器采用http 协议访问网页的工作过程

1. 首先嘛,你得在浏览器里输入要网址:

2. 浏览器查找域名的IP地址

导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:
浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。
路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。
递归搜索 – 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了。
DNS递归查找如下图所示:

DNS有一点令人担忧,这就是像wikipedia.org 或者 facebook.com这样的整个域名看上去只是对应一个单独的IP地址。还好,有几种方法可以消除这个瓶颈:
循环 DNS 是DNS查找时返回多个IP时的解决方案。举例来说,Facebook.com实际上就对应了四个IP地址。
负载平衡器 是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。
地理 DNS 根据用户所处的地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态,但映射静态内容的话非常好。
Anycast 是一个IP地址映射多个物理主机的路由技术。 美中不足,Anycast与TCP协议适应的不是很好,所以很少应用在那些方案中。
大多数DNS服务器使用Anycast来获得高效低延迟的DNS查找。

3. 浏览器给web服务器发送一个HTTP请求

因为像Facebook主页这样的动态页面,打开后在浏览器缓存中很快甚至马上就会过期,毫无疑问他们不能从中读取。
所以,浏览器将把一下请求发送到Facebook所在的服务器:
GET http://facebook.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: facebook.com
Cookie: datr=1265876274-[...]; locale=en_US; lsd=WW[...]; c_user=2101[...]
GET 这个请求定义了要读取的URL: “http://facebook.com/”。 浏览器自身定义 (User-Agent 头), 和它希望接受什么类型的相应 (Accept and Accept-Encoding 头). Connection头要求服务器为了后边的请求不要关闭TCP连接。
请求中也包含浏览器存储的该域名的cookies。可能你已经知道,在不同页面请求当中,cookies是与跟踪一个网站状态相匹配的键值。这样cookies会存储登录用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。
用来看原始HTTP请求及其相应的工具很多。作者比较喜欢使用fiddler,当然也有像FireBug这样其他的工具。这些软件在网站优化时会帮上很大忙。
除了获取请求,还有一种是发送请求,它常在提交表单用到。发送请求通过URL传递其参数(e.g.: http://robozzle.com/puzzle.aspx?id=85)。发送请求在请求正文头之后发送其参数。

像“http://facebook.com/”中的斜杠是至关重要的。这种情况下,浏览器能安全的添加斜杠。而像“http: //example.com/folderOrFile”这样的地址,因为浏览器不清楚folderOrFile到底是文件夹还是文件,所以不能自动添加 斜杠。这时,浏览器就不加斜杠直接访问地址,服务器会响应一个重定向,结果造成一次不必要的握手。

4. facebook服务的永久重定向响应

图中所示为Facebook服务器发回给浏览器的响应:
HTTP/1.1 301 Moved Permanently
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Location: http://www.facebook.com/
P3P: CP="DSP LAW"
Pragma: no-cache
Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;
path=/; domain=.facebook.com; httponly
Content-Type: text/html; charset=utf-8
X-Cnection: close
Date: Fri, 12 Feb 2010 05:09:51 GMT
Content-Length: 0
服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.facebook.com/” 而非“http://facebook.com/”。
为什么服务器一定要重定向而不是直接发会用户想看的网页内容呢?这个问题有好多有意思的答案。
其中一个原因跟搜索引擎排名有 关。你看,如果一个页面有两个地址,就像http://www.igoro.com/ 和http://igoro.com/,搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是 什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。
还有一个是用不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。
5. 浏览器跟踪重定向地址

现在,浏览器知道了“http://www.facebook.com/”才是要访问的正确地址,所以它会发送另一个获取请求:
GET http://www.facebook.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Cookie: lsd=XW[...]; c_user=21[...]; x-referer=[...]
Host: www.facebook.com
头信息以之前请求中的意义相同。
6. 服务器“处理”请求

服务器接收到获取请求,然后处理并返回一个响应。
这表面上看起来是一个顺向的任务,但其实这中间发生了很多有意思的东西- 就像作者博客这样简单的网站,何况像facebook那样访问量大的网站呢!
Web 服务器软件
web服务器软件(像IIS和阿帕奇)接收到HTTP请求,然后确定执行什么请求处理来处理它。请求处理就是一个能够读懂请求并且能生成HTML来进行响应的程序(像ASP.NET,PHP,RUBY...)。
举 个最简单的例子,需求处理可以以映射网站地址结构的文件层次存储。像http://example.com/folder1/page1.aspx这个地 址会映射/httpdocs/folder1/page1.aspx这个文件。web服务器软件可以设置成为地址人工的对应请求处理,这样 page1.aspx的发布地址就可以是http://example.com/folder1/page1。
请求处理
请求处理阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并讲数据存储在服务器上。然后,需求处理会生成一个HTML响应。
所 有动态网站都面临一个有意思的难点 -如何存储数据。小网站一半都会有一个SQL数据库来存储数据,存储大量数据和/或访问量大的网站不得不找一些办法把数据库分配到多台机器上。解决方案 有:sharding (基于主键值讲数据表分散到多个数据库中),复制,利用弱语义一致性的简化数据库。
委 托工作给批处理是一个廉价保持数据更新的技术。举例来讲,Fackbook得及时更新新闻feed,但数据支持下的“你可能认识的人”功能只需要每晚更新 (作者猜测是这样的,改功能如何完善不得而知)。批处理作业更新会导致一些不太重要的数据陈旧,但能使数据更新耕作更快更简洁。
7. 服务器发回一个HTML响应

图中为服务器生成并返回的响应:
HTTP/1.1 200 OK
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP="DSP LAW"
Pragma: no-cache
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-Cnection: close
Transfer-Encoding: chunked
Date: Fri, 12 Feb 2010 09:05:55 GMT

2b3Tn@[...]
整个响应大小为35kB,其中大部分在整理后以blob类型传输。
内容编码头告诉浏览器整个响应体用gzip算法进行压缩。解压blob块后,你可以看到如下期望的HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
lang="en" id="facebook" class=" no_js">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-language" content="en" />
...
关于压缩,头信息说明了是否缓存这个页面,如果缓存的话如何去做,有什么cookies要去设置(前面这个响应里没有这点)和隐私信息等等。
请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以HTML形式呈现,而不是以文件形式下载它。浏览器会根据报头信息决定如何解释该响应,不过同时也会考虑像URL扩展内容等其他因素。
8. 浏览器开始显示HTML
在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了:

9. 浏览器发送获取嵌入在HTML中的对象

在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。
下面是几个我们访问facebook.com时需要重获取的几个URL:
图片
http://static.ak.fbcdn.net/rsrc.php/z12E0/hash/8q2anwu7.gif
http://static.ak.fbcdn.net/rsrc.php/zBS5C/hash/7hwy7at6.gif

CSS 式样表
http://static.ak.fbcdn.net/rsrc.php/z448Z/hash/2plh8s4n.css
http://static.ak.fbcdn.net/rsrc.php/zANE1/hash/cvtutcee.css

JavaScript 文件
http://static.ak.fbcdn.net/rsrc.php/zEMOA/hash/c8yzb6ub.js
http://static.ak.fbcdn.net/rsrc.php/z6R9L/hash/cq2lgbs8.js

这些地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等...
但 不像动态页面那样,静态文件会允许浏览器对其进行缓存。有的文件可能会不需要与服务器通讯,而从缓存中直接读取。服务器的响应中包含了静态文件保存的期限 信息,所以浏览器知道要把它们缓存多长时间。还有,每个响应都可能包含像版本号一样工作的ETag头(被请求变量的实体值),如果浏览器观察到文件的版本 ETag信息已经存在,就马上停止这个文件的传输。
试着猜猜看“fbcdn.net”在地址中代表什么?聪明的答案是"Facebook内容分发网络"。Facebook利用内容分发网络(CDN)分发像图片,CSS表和JavaScript文件这些静态文件。所以,这些文件会在全球很多CDN的数据中心中留下备份。
静态内容往往代表站点的带宽大小,也能通过CDN轻松的复制。通常网站会使用第三方的CDN。例如,Facebook的静态文件由最大的CDN提供商Akamai来托管。
举例来讲,当你试着ping static.ak.fbcdn.net的时候,可能会从某个akamai.net服务器上获得响应。有意思的是,当你同样再ping一次的时候,响应的服务器可能就不一样,这说明幕后的负载平衡开始起作用了。
10. 浏览器发送异步(AJAX)请求

在Web 2.0伟大精神的指引下,页面显示完成后客户端仍与服务器端保持着联系。
以 Facebook聊天功能为例,它会持续与服务器保持联系来及时更新你那些亮亮灰灰的好友状态。为了更新这些头像亮着的好友状态,在浏览器中执行的 JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。还是在Facebook这个例 子中,客户端发送给http://www.facebook.com/ajax/chat/buddy_list.php一个发布请求来获取你好友里哪个 在线的状态信息。
提起这个模式,就必须要讲讲"AJAX"-- “异步JavaScript 和 XML”,虽然服务器为什么用XML格式来进行响应也没有个一清二白的原因。再举个例子吧,对于异步请求,Facebook会返回一些JavaScript的代码片段。
除了其他,fiddler这个工具能够让你看到浏览器发送的异步请求。事实上,你不仅可以被动的做为这些请求的看客,还能主动出击修改和重新发送它们。AJAX请求这么容易被蒙,可着实让那些计分的在线游戏开发者们郁闷的了。(当然,可别那样骗人家~)
Facebook聊天功能提供了关于AJAX一个有意思的问题案例:把数据从服务器端推送到客户端。因为HTTP是一个请求-响应协议,所以聊天服务器不能把新消息发给客户。取而代之的是客户端不得不隔几秒就轮询下服务器端看自己有没有新消息。
这些情况发生时长轮询是个减轻服务器负载挺有趣的技术。如果当被轮询时服务器没有新消息,它就不理这个客户端。而当尚未超时的情况下收到了该客户的新消息,服务器就会找到未完成的请求,把新消息做为响应返回给客户端。

Ⅵ 浏览器缓存的方式和类型(笔记)

浏览器缓存只是计算机缓存的一种

1.内存缓存
将数据存到内存
2.代理服务器缓存
就是个自己找的中介。你拿东西先找中介,中介找房东,房东给中介,中介又给你。比如你需要房子钥匙,房东把钥匙放在中介那,你直接从中介那里拿钥匙。
3.CDN缓存
将数据存到CDN服务器。CDN也是个中介,不过这个中介是根据中介的忙碌程度(CDN服务器忙碌程度)、跟你的距离(CDN服务器和你的距离)自动给你分配的。
4.浏览器缓存( 我是个前端,只关注浏览器缓存。
根据HTTP协议决定要不要缓存,以什么方式缓存,缓存到哪(内存还是硬盘等)。

浏览器缓存是将浏览器请求过的数据(资源文件)保存到电脑上。需要再次使用的时候,直接从电脑上获取保存的数据(资源文件),这就是浏览器缓存

1.减少网络请求,节省流量
2.减轻服务器压力
3.资源加载速度快了,前端性能就更好了

1.Server Worker
还没搞懂,搞懂了再来写。
2.Memory Cache
内存中的缓存,关闭页面进程就释放内存
3.Disk Memory
硬盘中的缓存,不主动清理就一直在

4、Push Cache
推送缓存,是HTTP/2的内容,并没有严格执行HTTP头部的缓存指令。在Server Worker、Memory Cache、Disk Cache都没有命中的时候,它会被使用。在Session中存在,Session结束就会被释放,缓存时间短暂。

1.先去内存查找,找到直接加载
2.内存找不到,硬盘中找,找到直接加载
3.硬盘找不到进行网络请求
4.把请求获取的资源再缓存到硬盘和内存

1.强缓存
控制强制缓存的字段分别是Expires和Cache-Control,Cache-Control优先级比Expires高
-Expires设置一个绝对时间的GMT格式的时间字符串,这个是资源失效时间( 客户端的时间小于Expires的值,缺陷就是客户端的时间被改变就有问题 ),在这个时间之前都直接读取缓存。
-Cache-Control替代Expires,它利用的是相对时间,利用header信息字段的max-age值判断。
2.协商缓存
-Last-Modified/If-Modified-Since
Last-Modified:浏览器向服务器发送资源最后的修改时间
If-Modified-Since:当资源过期时,发现响应头具有Last-Modified声明,则再次向服务器请求时带上头if-modified-since,表示请求时间。服务器收到请求后,发现有if-modified-since则与被请求资源的最后修改时间进行对比(Last-Modified),若最后修改时间较新,说明资源又被改过,则返回最新资源,返回200;若最后修改时间较小,说明资源无新修改,返回304 ,使用缓存文件。
缺点:单位是秒,一秒内多次改变会认为没过期
-ETag/If-None-Match
ETag:由服务器生成返回给前端,帮助服务器控制web端的缓存验证,服务器会生成并且返回当前资源文件的一个唯一标识
If-None-Match:当资源过期时,发现响应头具有Etag声明,则再次向服务器请求时带上头if-none-match(唯一标识Etag值)。服务器收到该请求后,发现有If-None-Match则根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200。

1.强缓存不发请求,协商缓存会发请求给服务器确认有没有过期
2.强缓存文件更新浏览器不知道,协商缓存更新浏览器能实时知道

1.点击浏览器的刷新按钮时,全部走缓存
2.F5或者鼠标右键刷新强制缓存失效,不影响协商缓存
3.CTRL+F5影响强制缓存和协商缓存都失效

Ⅶ 以下哪些是http请求中浏览器缓存机制会用到的协议头

你想下载哪一种嘛?我感觉手机用UC比较好。我一直用的UC

Ⅷ 求生之路系列(一)浏览器缓存机制

http可以说是现在前端领域(甚至整个互联网)发展过程中使用最多的一个应用层协议。其传输层一般都是使用tcp协议来保证可靠传输的,由于tcp3次握手以及4次挥手的链接建立与断开机制,导致每一次进行http请求所消耗的网络资源相对较大。。所以减少请求次数,合理的数据缓存成为互联网开发的重中之重!!

尤其在前端领域,http缓存在加快网页性能和为用户节约网络资源。作为一名小前端,又恰好面试的时候又被问蒙蔽了。。就在这里对http缓存机制进行一个小小的总结吧~~

总的来说,浏览器要从服务器上面真正的拿到数据还要通过下面几关:

Cache-control是http响应头的一个字段。就是用来与客户端约定响应的数据的缓存的有效时间。

在上图中可以发现Cache-Control有一个max-age=691200的参数。这个就是表示该资源的最大生存时间为691200秒。 在这个时间过后才会再次向服务器发出请求申请新的资源 ,否则直接使用本地资源。不过,就算生存时间过了,服务器不会这么温顺地给你发新的资源(你说发就发岂不是很丢脸???),还会进一步的进行判断,是否应该发送新的资源(看到后面就知道啦~)

除了max-age之外,Cache-Control还有别的参数可以选择:

另外,浏览器的不同行为例如enter f5也会有不同的表现哦。(这个后面再总结吧~)

更多的介绍可以看看下面网络和几位老哥的总结:

眼尖的盆友,可能会发现 上面的图中还有一个Expires字段,有些还有Pragma,其实这两个都是个http1.0的旧产物,跟Cache-Control设置max-age是一个意思。由于Cache-Control是http1.1提出的,而且在http1.1甚至http2.0大行其道的今日,这两个东西已经没有作用了。当Cache-Control和上面两个东西同时在http头中存在时,优先使用Cache-Control。

注意:浏览器要发出请求必须要先在max-age时间过后(可以用ctrl+F5,来跳过这个检查)。如果在一个时间内在发出请求,chrome的network会返回一个假200(其实是读缓存的假请求2333333)。

一句话总结:Cache-Control是一个用于控制(告诉)客户端,该响应的资源应该存哪里,存多久。

当浏览器发现max-age(或其他)时间过后 ,浏览器就开始向服务器请求获取新的资源。但是服务器并不会轻易的把新的资源返回给客户端。

当浏览器第一次访问某个网站,请求服务器时,服务器在返回的http响应头中加入Last-Modified字段,故名思意表示该资源最后一次修改是在某一个时间,如下图

浏览器在收到了Last-Modified后,在以后的每一次请求中(请求头)都会带上一个字段If-Modified-Since,这个字段的值就是上一次收到的Last-Modified的值。

服务器端则根据查看该资源是否在这个时间点后被修改过!!~如果没有被修改过,则服务器会返回304,表示资源未被修改过,使用缓存就可以了。否则如果有Etag则进行下一步判断(后面说),没有则200返回新资源。

Last-Modified 表面上非常靠谱,但是也存在一种情况,如果在服务器上,一个资源被修改了,但其实际内容根本没发生改变,会因为Last-Modified时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源)。

ETag是http1.1中为了解决上面问题的一个http字段(一般是在响应头里面的)。这个ETag的值的什么呢?一般是由服务器根据资源的内容通过md5(或者其他)计算出的一个唯一标志。ok,浏览器得到这个东西之后,每次请求该资源的时候就会带上这个值,这个值是放在请求头的if-None-Match中,表示如果不匹配就给我新的吧,匹配就返回304~~

还有这个if-Match,这个我就不是很理解到底是什么意思了。。。知道的朋友可以告诉我一下。。。
什么是412错误,先决条件失败是什么意思。。

最后盗个图:

另外,浏览器有多个刷新页面的方法,下面来看看对缓存来说都有什么区别吧(用chrome来测试,据说不同浏览器不同哦~):

从上面图中可以看出,这种形式的刷新页面,是会判断过期的(max-age)。。就是说是按整个缓存流程走下去。。

哇 好多304。。说明F5刷新页面跳过了过期判断(包括了max-age、expire等等),直接从ETage开始。。

全部200!!说明 这个是真·强刷·无双!!从请求头的图中,可以看到浏览器是同配置Cache-Control: no-cache来叫服务器重发请求的!~

第一次写博客,各位老哥,给个面子,有错就提出来哈~~

by the offer, of the offer, for the offer!!~~~

相关参考: