http 缓存

124 阅读6分钟

一次完整的 http 服务过程

Ø 能够完整的说出一次完整的 http 服务的几个阶段

	1. 域名进行DNS解析成ip地址
	2. 根据ip地址,查找服务器,进行tcp 链接(三次握手)
	3. Tcp 链接成功之后,进行http 请求
	4. 服务器接收到http 请求之后,做出响应
	5. 客户端收到服务器响应的html, 开始解析html,同时针对页面中的资源css, js. Img ,继续请求
	6. 浏览器渲染页面,呈现给用户
	7. 服务器关闭,断开tcp 链接 (四次挥手)
	
Ø DNS 是怎样查找域名的?  

	Dns 域名解析是通过递归查询的方式。现在dns 缓存中查找, 缓存中找不到就会去根域名服务器中查找, 然后再去下一级…一直这样递归查找
	
	○ 首先会搜索浏览器的自身缓存的dns
	○ 如果浏览器自身没有搜索到,浏览器会搜索系统自身dns缓存
	○ 如果还是没有找到,就会尝试从hosts 文件中查找(c/windows/Systems32/drivers/etc/hosts)
	○ 如果还是没有找到,就会递归的方式去域名服务器中查找

Ø 能够说出html渲染的过程

	浏览器拿到html之后,会解析html 文件,解析的过程中遇到img,js ,css 等静态资源的时候,会向服务端请求下载(会使用多线程下载,每个浏览器的线程数是不同的)。Keep-alive 属性可以建立一次http 链接,请求多个资源,下载的顺序就是按照代码中的顺序,但是每个资源的大小可能不一样,而且浏览器又是多线程请求资源,所以响应的顺序可	能不是代码中的顺序
	
	浏览器根据自深内部的机制,最请求到的静态资源和html文件进行渲染,呈现给用户,浏览器是一个边解析便渲染的过程。
	浏览器解析html 成dom树,解析css 为css 渲染树, 二者构成html渲染树, 浏览器开始布局渲染树绘制屏幕上
	
	绘制的这个过程比较复杂,涉及到两个概念: 重排(reflow) 和 重绘(repain)
	dom节点在浏览器中都是以盒模型的方式存在的,浏览器会计算他的位置以及大小,这个过程叫做重排。当大小位置以及其他属性例如颜色字体等确定之后,浏览器就开始绘制内容,这个过程叫做重绘

	浏览器在第一次渲染的时后,一定会进行重排和重绘
	

Ø 能够说出常见的http状态码

http 缓存

Ø http缓存的作用范围
	○ 浏览器不是第一次请求(第一次请求之后,第二次请求之前)
	○ 至少是两次http请求

Ø 浏览器缓存的分类 
	强缓存、协商缓存
		○ 浏览器会先根据请求的头部信息看是否命中强缓存,如果命中,直接加载缓存中的资源,不会再发请求到服务器
		○ 如果没有命中强缓存,浏览器会将请求发送到服务器,服务器端会判断浏览器本地的缓存是否有效,如果可以使用,服务器不会响应任何信息(不会返回资源),浏览器会继续加载缓存中的资源 -- 协商缓存
		○ 如未命中协商缓存,那么服务器会响应完整的资源给浏览器,浏览器加载新的资源,同时更新缓存
	
Ø  强缓存 头部字段
	
	○ 命中强缓存的时候,浏览器并不回发送请求到服务器,返回码200 在size列会显示(from cache)
	○ expires  过期时间,是一个时间点(是服务端的时间,是绝对时间,在此时间点之前是有效的)
	○ cache-control  :  max-age  = 3600  有效时间,是一个时间段 (是 相对时间,3600s之内则在有效期之内,与客户端时间比较 )
	
【注】 
		1.  只使用 expires 有一个问题。若是浏览器时间和服务器时间不一致,就会出现问题, 所以使用cache-control的jmax-age一起使用
		2. 如果两者都存在,cache-control 的优先级更高

Ø 强缓存存在的意义:

	服务器的配置是有限的。设置强缓存之后,有些资源就不用直接去服务器获取,可以承载更多并发
	
Ø 协商缓存

	○ 未命中强缓存的时候,浏览器会发送请求到服务器,服务器会根据 http 头信息中的 Last-Modify/ If-Modify-Since  或者 Etag / If - None -Match 来判断是否命中协商缓存,如果命中,则http返回码为304, 浏览器从缓存中加载资源
	○ 协商的是什么呢? 
		§ 浏览器会问服务器, 我缓存的资源有没有更新? 没有更新:浏览器可以用缓存 304   有更新:浏览器不能使用缓存,服务器活发送新的资源给浏览器 200 
		
	○ Last - modify / If - Modify - Since
	
		§ 在浏览器第一次请求数据的时候,在响应头中会携带一个Last - Modify 字段, 表示资源最后的修改时间
		§ 当浏览器再次请求数据的时候,在请求头中会携带 If -Modify - Since 字段,他的值就是第一次请求响应头中 Last - Modify 的值。服务器会对比 资源更新的时间,来决定浏览器缓存的资源是否有效
	
	
	○ Etag / If -None - Match
	
		§ 和上面那组不同的是 Etag / If -None - Match 返回的是一个校验码 ( Etag: entity tag ), Etag 可以保证每个资源都是唯一的,资源变化会导致 Etag 变化。Etag的值发证变化就说明资源已经被修改 。 服务器会根据 If - Modify -Match 值来判断是都命中缓存
		
	○ 为什么要分两组来判断协商缓存呢?
		§ Last - Modify 还是从时间上来判断缓存是否过期的,时间精细度不行,会存在误差,但是 Etag 不会出现这个问题, 只要资源更改, Etag 的值就会发生变化 
		§ 如果某些文件会被定期生成,有时内容不会发生变化,但是 Last - Modify 的 改变了,导致缓存不可用
		§ Etag 是服务器资源的唯一标志,能够更加准确的控制缓存,当两者一起用的时候 ,Etag的优先级更高