浏览器的地址栏输入URL并按下回车后,
- 开启网络请求线程
- DNS域名解析
- 根据IP建立TCP连接(三次握手)
- HTTP发起请求
- 服务器处理请求,浏览器接收HTTP响应
- 浏览器解析渲染页面
- 关闭TCP连接(四次挥手)
一、 开启网络请求线程
浏览器是多进程的,每打开一个tab页,就相当于创建了一个独立的浏览器进程,相同类型的标签页会合并到一个进程中。
浏览器进程包含:
- Browser进程:浏览器的主进程(负责协调、主控、只有一个)。
作用:(1)负责管理各个标签的创建和销毁;(2)负责浏览器页面显示;(3)负责资源的管理和下载 - 第三方插件进程:可以是多个进程,负责每一个第三方插件的使用,每一个第三方插件使用时候会创建一个对应的进程
- GPU进程:最多1个进程,负责3D绘制和硬件加速
- 浏览器渲染进程(Renderer进程):可以是多个线程,浏览器的内核,每个tab页一个进程,主要负责HTML、,css,js等文件的解析,执行和渲染,以及事件处理等。
浏览器渲染进程(内核进程)
每一个tab页面是浏览器内核进程,然后这个每一个进程是多线程的,它有几大类子线程:
(1)GUI线程;(2)JS引擎线程;(3)事件触发线程;(4)定时器线程;(5)异步的http网络请求线程
通信过程
- Browser进程接收到用户请求,获取页面内容(譬如通过网络下载资源),将该任务通过RendererHost接口传递给Renderer进程
- Renderer进程的Renderer接口收到消息,交给GUI渲染线程,开始渲染
*GUI渲染线程接收请求,加载网页并渲染网页,这其中可能需要Browser进程获取资源和需要GPU进程来帮助渲染
*当然可能会有JS线程操作DOM(这样会造成回流或重绘)
*最后Renderer进程将结果bitmap传递给Browser进程 - Browser进程接收到结果并将结果绘制出来
二、 DNS域名解析
IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址,域名解析就是域名到IP地址的转换过程。域名是与IP地址的一个映射。
过程:
1)用户在浏览器输入一个URL后,浏览器先找浏览器缓存,没有就去本机缓存,没有就看host文件有没有,有就返回IP。
2)如果host文件没有,就向本地DNS服务器查询(递归查询),如果没有查到,就向根DNS服务器查询(迭代查询)。
注:我们本地硬盘下有一个hosts(windows下路径为C:\Windows\System32\drivers\etc)文件,作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”。一般来说,系统会首先自动从hosts文件中寻找对应的IP地址,如果有的话就直接使用hosts文件里面的IP地址,然后直接进行端口确认。
递归查询:在该模式下DNS服务器接收到客户机请求,必须返回一个准确的查询结果给客户机。如果该DNS服务器本地没有存储被查询的DNS信息,那么该服务器会(替客户机)询问其他服务器,并将返回的查询结果再返回给客户机。
迭代查询:在该模式下DNS服务器接收到客户机请求,如果该DNS服务器本地没有存储被查询的DNS信息,DNS服务器会向客户机提供其他能够解析查询请求的DNS服务器地址,让客户机再向这台DNS服务器提交请求,依次循环直到返回查询的结果为止。
DNS解析是很耗时的,因此如果解析域名过多,首屏加载会变慢,可以考虑使用dns-prefetch优化。
六、浏览器解析渲染页面
- 根据 html 解析出 dom 树
- 根据 css 解析生成 css 规则树
- 结合 dom 树和 css 规则树生成渲染树
- 根据渲染树计算每一个节点的信息
- 根据计算好的信息绘制页面
网友评论