一道面试题是如何引发深层次的灵魂拷问?

有这么一道面试题,如下:

面试题:请详细介绍一下从输入 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 网络请求线程

image

可以看出来 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 次握手步骤:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsszjw.html