浏览器渲染原理-浏览器渲染过程
一.进程与线程
- 进程是操作系统资源分配的基本单位,进程中包含线程。
- 线程是由进程所管理的。为了提升浏览器的稳定性和安全性,浏览器采用了多进程模型。
浏览器中的(5个)进程
- 浏览器进程:负责界面显示、用户交互、子进程管理,提供存储等。
- 渲染进程:每个也卡都有单独的渲染进程,核心用于渲染页面。
- 网络进程:主要处理网络资源加载(
HTML
、CSS
、JS
等) GPU
进程:3d
绘制,提高性能- 插件进程: chrome中安装的一些插件
二.从输入URL到浏览器显示页面发生了什么?
用户输入的是关键字还是URL? 如果是关键字则使用默认搜索引擎生产URL
1.浏览器进程的相互调用
- 在浏览器进程中输入
url
地址开始导航。并准备渲染进程 - 在网络进程中发送请求,将响应后的结果交给渲染进程处理
- 解析页面,加载页面中所需资源
- 渲染完毕,展示结果
我们开始细化每一步流程,并且从流程中提取我们可以优化的点。
2.URL
请求过程
- 浏览器查找当前URL是否存在缓存,如果有缓存、并且缓存未过期,直接从缓存中返回。
- 查看域名是否已经被解析过了,没有解析过进行
DNS
解析将域名解析成IP
地址,并增加端口号 - 如果请求是
HTTPS
,进行SSL
协商 - 利用
IP
地址进行寻址,请求排队。同一个域名下请求数量不能多余6个。 - 排队后服务器创建
TCP
链接 (三次握手) - 利用
TCP
协议将大文件拆分成数据包进行传输(有序传输),可靠的传输给服务器(丢包重传),服务器收到后按照序号重排数据包 (增加TCP
头部,IP
头部) - 发送HTTP请求(请求行,请求头,请求体)
HTTP 1.1
中支持keep-alive
属性,TCP链接不会立即关闭,后续请求可以省去建立链接时间。- 服务器响应结果(响应行,响应头,响应体)
- 返回状态码为301、302时,浏览器会进行重定向操作。(重新进行导航)
- 返回304则查找缓存。(服务端可以设置强制缓存)
通过network Timing
观察请求发出的流程:
Queuing
: 请求发送前会根据优先级进行排队,同时每个域名最多处理6个TCP链接,超过的也会进行排队,并且分配磁盘空间时也会消耗一定时间。Stalled
:请求发出前的等待时间(处理代理,链接复用)DNS lookup
:查找DNS
的时间initial Connection
:建立TCP链接时间SSL
:SSL
握手时间(SSL
协商)Request Sent
:请求发送时间(可忽略)Waiting
(TTFB
) :等待响应的时间,等待返回首个字符的时间Content Dowloaded
:用于下载响应的时间
蓝色:
DOMContentLoaded
:DOM
构建完成的时间红色:
Load
:浏览器所有资源加载完毕
本质上,浏览器是方便一般互联网用户通过界面解析和发送HTTP协议的软件
3.HTTP
发展历程
- HTTP/0.9 在传输过程中没有请求头和请求体,服务器响应没有返回头信息,内容采用ASCII字符流来进行传输 HTML
- HTTP/1.0 增加了请求头和响应头,实现多类型数据传输
- HTTP/1.1 默认开启持久链接,在一个TCP链接上可以传输多个HTTP请求 , 采用管线化的方式(每个域名最多维护6个TCP持久链接)解决队头阻塞问题 (服务端需要按顺序依次处理请求)。完美支持数据分块传输(
chunk transfer
),并引入客户端cookie机制、安全机制等。 - HTTP/2.0 解决网络带宽使用率低 (TCP慢启动,多个TCP竞争带宽,队头阻塞)采用多路复用机制(一个域名使用一个TCP长链接,通过二进制分帧层来实现)。头部压缩(
HPACK
)、及服务端推送 - HTTP/3.0 解决TCP队头阻塞问题, 采用
QUIC
协议。QUIC
协议是基于UDP
的 (目前:支持和部署是最大的问题) - HTTP明文传输,在传输过程中会经历路由器、运营商等环节,数据有可能被窃取或篡改 (安全问题)
对比HTTP/1.1 和 HTTP/2 的差异
4.渲染流程
- 1.浏览器无法直接使用HTML,需要将HTML转化成DOM树。(
document
) - 2.浏览器无法解析纯文本的
CSS
样式,需要对CSS
进行解析,解析成styleSheets
。CSSOM
(document.styleSeets
) - 3.计算出DOM树中每个节点的具体样式(Attachment)
- 4.创建渲染(布局)树,将DOM树中可见节点,添加到布局树中。并计算节点渲染到页面的坐标位置。(layout)
- 5.通过布局树,进行分层 (根据定位属性、透明属性、transform属性、clip属性等)生产图层树
- 6.将不同图层进行绘制,转交给合成线程处理。最终生产页面,并显示到浏览器上 (Painting,Display)
查看layer并对图层进行绘制的列表
转载自:https://juejin.cn/post/7242143701069955129