一输入url后到底发生了什么
显而易见的是在宏观层面上分为一下几步:
- 1:解析url,通过dns服务器查找服务器ip地址
- 2:浏览器接收服务器数据
- 3:浏览器解析,js引擎解析
- 4:浏览器进行渲染
第一步:浏览器在拿到url后干了什么
首先:我们需要了解浏览器的架构,以及浏览器和js引擎的关系, 浏览器是多进程的,有一个主控进程
进程可能包括主控进程,插件进程,GPU,tab页(浏览器内核)等等
- Browser进程:浏览器的主进程(负责协调、主控),只有一个
- 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建
- GPU进程:最多一个,用于3D绘制
- 浏览器渲染进程(内核):默认每个Tab页面一个进程,互不影响,控制页面渲染,脚本执行,事件处理等(有时候会优化,如多个空白tab会合并成一个进程)
- 网络进程
浏览器的渲染进程也成为浏览器内核:以谷歌为例:浏览器渲染进程中包括以下线程:
- GUI线程(渲染线程):主要负责解析html,css,构建布局树,绘制图层
- JS引擎线程:主要负责解析事件队列中的任务,和渲染线程互斥,即同时只能执行一个
- 事件触发线程
- 定时器线程
- 网络请求线程
注意:js引擎线程也称为js引擎(谷歌浏览器的js引擎名字为v8引擎)
有了以上铺垫现在开始讲第一步发生了什么
打开浏览器时,操作系统将浏览器主进程加载入内存,并且为主进程分配处理机资源,当输入url时,主进程通知网络进程处理url,网络进程拿到url去查找 1浏览器缓存,如果有缓存直接请求服务器,如果没有那么继续查找2c盘drivers文件夹下的host文件,仍没有,那么查找3本地dns解析器有没有缓存,再没有,查找4##### 权威域名服务器、##### 顶级域名服务器、根域名服务器(在查找这几个dns服务器时,采用两种查询方式) 递归查询(其他服务器会帮助自己向上查询)和迭代查询(其他服务器没有的话,会给本地dns服务器返回一个另一个dns服务器的地址,让本地dns服务器自己去查)
那么最终肯定会找到ip地址,然后进行tcp链接,通过https协议,获得数据。
第二步:浏览器接收服务器数据
浏览器接收到数据后,将数据交给渲染进程,渲染进程中j渲染线程解析步骤为:
js引擎解析步骤为:
js 引擎包括 parser、解释器、gc 再加一个 JIT 编译器这几部分。
- parser: 负责把 javascript 源码转成 AST
- Ignition:解释器, 负责转换 AST 成字节码,并解释执行
- TurboFan:对执行时的热点函数进行编译,把字节码转成机器码,之后可以直接执行机器码
- gc(garbage collector):垃圾回收器,清理堆内存中不再使用的对象
...先写到这,改天再补 2023.3.1第二次编辑 大体上分为上面4步,但第一步还有细节要插入: 输入url后,浏览器主进程会将url交给网络进程,网络进程会先查看浏览器缓存,是否有这个资源,有的话,直接使用缓存,没有的话再经历dns服务器那后面几步,向服务器请求最新的资源。 缓存需要特地写一篇文章了:强缓存与协商缓存