一次完整的 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的优先级更高