有这么一道面试题,如下:
面试题:请详细介绍一下从输入 URL 到页面加载完成的过程 ?
这道题的覆盖面可以非常广,很适合作为一道承载知识体系的题目。
每一个前端人员,如果要往更高阶发展,必然会将自己的知识体系梳理一遍,没有牢固的知识体系,无法往更高处走!
你不信这道题承载的知识体系庞大?往下看
二、分析题干在对于这道题上,如果对于面试官想要知道的是:简单叙述还是深入叙述 。
所以需要回答到关键词上,不然多而杂,效果不好,抓不住重点。
接下来我们从主干流程和深入的详细叙述分别介绍,我觉得这道面试题可能需要 15 分钟才能讲完。
主干流程回答:是基本功体现,知识归纳能力,面面俱到,点到为止 。
详细阐述:考察的各个知识点的掌握能力以及掌握到什么程度 。
三、主干流程在将浏览器渲染原理、JS 运行机制、JS 引擎解析流程梳理一遍后,感觉就跟打通了任督二脉一样,有了一个整体的架构,以前的知识点都连贯起来了。
1、从浏览器接收 url 到开启网络请求线程(涉及到:浏览器机制,线程和进程之间的关系等)
2、开启网络线程到发出一个完整的 http 请求(涉及到:dns 查询,tcp/ip 请求,5 层网络协议栈等)
3、从服务器接收到请求到对应后台接收到请求(涉及到:均衡负载,安全拦截,后台内部的处理等)
4、后台和前台的 http 交互(涉及到:http 头,响应码,报文结构,cookie 等,可以提下静态资源的 cookie 优化,以及编码解码如 gzip 压缩等)
5、缓存问题:http 缓存(涉及到:涉及到 http 缓存头部,etag,expired,cache-control 等)
6、浏览器接收到 http 数据包后的解析流程(涉及到:html 的词法分析,然后解析成 dom 树,同时解析 css 生成 css 规则树,合并生成 render 树。然后 layout 布局、painting 渲染、复合图层的合成、GPU 绘制、外链接处理、loaded 和 documentloaded 等)
7、css 可视化格式模型(涉及到:元素渲染规则,如:包含块,控制框,BFC,IFC 等概念)
8、js 引擎解析过程(涉及到:js 解释阶段,预处理阶段,执行阶段生成执行上下文,VO(全局对象),作用域链,回收机制等)
9、其他(扩展其他模块:跨域,web 安全等)
四、从浏览器接收到 url 到开启网络请求线程涉及到:浏览器的进程和线程模型,js 的运行机制。
1、浏览器是多进程的(1)浏览器是多进程的;
(2)不同类型的标签页会开启一个新的进程;
(3)相同类型的标签页会合并到一个进程中。
浏览器中各个进程以及作用:
1、浏览器进程:只有 1 个进程,(1)负责管理各个标签的创建和销毁;(2)负责浏览器页面显示;(3)负责资源的管理和下载;
2、第三方插件进程:可以是多个进程,负责每一个第三方插件的使用,每一个第三方插件使用时候会创建一个对应的进程;
3、GPU 进程:最多 1 个进程,负责 3D 绘制和硬件加速;
4、浏览器渲染进程:可以是多个进程,浏览器的内核,每个 tab 页一个进程,主要负责 HTML、,css,js 等文件的解析,执行和渲染,以及事件处理等。
2、浏览器渲染进程(内核进程)每一个 tab 页面是浏览器内核进程,然后这个每一个进程是多线程的,它有几大类子线程:
(1)GUI 线程;(2)JS 引擎线程;(3)事件触发线程;(4)定时器线程;(5)异步的 http 网络请求线程
可以看出来 JS 引擎是内核进程中的一个线程,所以常说 JS 引擎时单线程的。
3、解析 URL输入 url 后,会进行解析(URL 是统一资源定位符)。
URL 包括几个部分:(1)protocol,协议头,比如 http,https,ftp 等;(2)host,主机域名或者 IP 地址;(3)port,端口号;(4)path,目录路径;(5)query,查询的参数;(6)fragment,#后边的 hash 值,用来定位某一个位置。
4、网络请求时单独的线程每一次网络请求都是需要单独开辟单独的线程进行,比如 URL 解析到 http 协议,就会新建一个网络线程去处理资源下载。
因此浏览器会根据解析出得协议,开辟一个网络线程,前往请求资源。
五、开启网络线程到发出一个完整的 http 请求包括:DNS 查询,tcp/ip 请求构建,五层互联网协议等等。
1、DNS 查询得到 IP如果输入的域名,需要 DNS 解析成 IP,流程如下:
(1)浏览器有缓存,直接用浏览器缓存,没有就去本机缓存,没有就看是不是 host。
(2)如果还没有,就向 DNS 域名服务器查询(这个过程经过路由,路由也有缓存),查询到对应的 IP。
注意:1、域名查询的时候有可能经过 CDN 调度器(如果 CDN 有存储功能);
2、DNS 解析是很耗时的,因此如果解析域名过多,首屏加载会变慢,可以考虑使用 dns-prefetch 优化。
2、tcp/ip 请求构建http 的本质就是 tcp/ip 请求构建。需要 3 次握手规则简历连接,以及断开连接时候的 4 次挥手。
tcp 将 http 长报文划分为短报文,通过 3 次握手与服务端建立连接,进行可靠的传输。
3 次握手步骤: