浏览器运行原理

浏览器简介

 浏览器是指可以显示网页服务器或者文件系统的HTML文件(标准通用标记语言的一个应用)内容,并让用户与这些文件交互的一种软件。
 浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示您选择的网络资源。这里所说的资源一般是指 HTML 文档,也可以是 PDF、 图片或其他的类型。 资源的位置由用户使用URI(统一资源标符)指定 。多年以来,各浏览器都没有完全遵从这些规范,同时还在开发自己独有的扩展程序,这给网络开发人员带来了严重的兼容性问题。 如今,大多数的浏览器都是或多或少地遵从规范。
 目前使用的主流浏览器有五个:Internet Explorer、 Firefox、 Safari、 Chrome 和 Opera。
浏览器按照引擎分类:

  1. Trident引擎:Internet Explorer
  2. Webkit引擎:Chrome(28版本后基于blink,blink是webkit的一个分支)和Safari
  3. Gecko引擎:Firefox
  4. Presto引擎:早期Opera采用,后用webkit.

浏览器主要构成

 浏览器主要组件包括:

  1. 用户界面:包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分。
  2. 浏览器引擎:用来查询及操作渲染引擎的接口。
  3. 渲染引擎:用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来。
  4. 网络:用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作。
  5. UI后端:用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口。
  6. JS解释器:用来解释执行JS代码。
  7. 数据存储:属于持久层,浏览器需要在硬盘中保存类似cookie的各种数据,HTML5定义了web database技术,这是一种轻量级完整的客户端存储技术。
        浏览器运行原理
                   图1:浏览器主要组件

浏览器内核工作原理

渲染引擎

 渲染引擎在浏览器窗口中显示所请求的内容,浏览器内核分成两部分:渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎,所以渲染引擎也称为浏览器内核。渲染引擎一开始会从网络层获取请求文档的内容,通常以8K分块的方式完成。 获取了文档内容之后,渲染引擎开始正式工作,其基本流程如图所示:
浏览器运行原理
                        图2:渲染引擎工作原理

 渲染引擎开始解析html,并将标签转化为内容树中的dom节点。接着,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另一棵树——render树。
 Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。
 Render树构建好了之后,将会执行布局过程,它将确定每个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。
 值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。
           浏览器运行原理
                      图3:webkit主流程
           浏览器运行原理
                      图4:Mozilla的Geoko渲染引擎主流程

 从图3和4中可以看出,尽管webkit和Gecko使用的术语稍有不同,他们的主要流程基本相同。Gecko称可见的格式化元素组成的树为frame树,每个元素都是一个frame,webkit则使用render树这个名词来命名由渲染对象组成的树。Webkit中元素的定位称为布局,而Gecko中称为回流。Webkit称利用dom节点及样式信息去构建render树的过程为attachment,Gecko在html和dom树之间附加了一层,这层称为内容接收器,相当制造dom元素的工厂。

解析

1. 文法(Grammars)

 解析一个文档即将其转换为具有一定意义的结构——编码可以理解和使用的东西。解析的结果通常是表达文档结构的节点树,称为解析树或语法树。解析的过程可以分成两个子过程:词法分析和语法分析:

2.解析器-词法分析器(Parser-Lexer combination)

 解析的过程可以分成两个子过程:词法分析和语法分析。

  1. 词法分析是将输入内容分割成大量标记的过程。 标记是语言中的词汇,即构成内容的单位。
  2. 语法分析是应用语言的语法规则的过程。解析通常是一个迭代的过程。 通常,解析器会向词法分析器请求一个新标记,并尝试将其与某条语法规则进行匹配。 如果发现了匹配规则,解析器会将一个对应于该标记的节点添加到解析树中,然后继续请求下一个标记。 如果没有规则可以匹配,解析器就会将标记存储到内部,并继续请求标记,直至找到可与所有内部存储的标记匹配的规则。 如果找不到任何匹配规则,解析器就会引发一个异常。 这意味着文档无效,包含语法错误。

3.HTML解析

 HTML 解析器的任务是将 HTML 标记解析成解析树。 HTML 的词汇和语法在 W3C 组织创建的规范中进行了定义,html不能简单的用解析所需的上下文无关文法来定义。浏览器为html定制了专属的解析器。 Html5规范中描述了这个解析算法,算法包括两个阶段——符号化和构建树。
              浏览器运行原理
                      图5:HTML解析流程图
 符号化是词法分析的过程,将输入解析为符号,html的符号包括开始标签、 结束标签、 属性名及属性值。符号识别器识别出符号后,将其传递给树构建器,并读取下一个字符,以识别下一个符号,这样直到处理完所有输入。

4.CSS解析

 css属于上下文无关文法,可以用前面所描述的解析器来解析。 Css规范定义了css的词法及语法文法。 每个符号都由正则表达式定义了词法(词汇表),语法用BNF(由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集)进行描述。Webkit使用Flex和Bison解析生成器从CSS语法文件中自动生成解析器。

5.JS引擎

 JS引擎是一个专门处理JS脚本的虚拟机,专门设计来解释和执行的 JavaScript 代码。 JS引擎会加载你的源代码,把它分解成字符串,把这些字符串转换成编译器可以理解的字节码,然后执行这些字节码。不同浏览器有不同的JS引擎 ,不同浏览器的js引擎如图6所示。
              浏览器运行原理
                      图6:不同浏览器的js引擎

前端处理流程简介

这个流程大家可以参考网上很多人总结的各个版本的从输入一个url到看到页面,发生了什么过程。在这里我用自己的话简单概括为以下几点(仅供参考):

  1. 输入url
  2. 查看浏览器缓存,看是否有缓存,如果有缓存,继续查看缓存是否过期,如果没有过期,直接返回缓存页面,如果没有缓存或者缓存过期,发送一个请求。
  3. 浏览器解析url地址,获取协议、主机名、端口号和路径。
  4. 获取主机ip地址过程(1)浏览器缓存(2)主机缓存(3)hosts文件(4)路由器缓存(5)DNS缓存(6)DNS递归查询
  5. 浏览器发起和服务器的TCP连接,执行三次握手
  6. 三次握手连接后,浏览器发送一个http请求(这部分是重点,请查询相关资料,详细了解http协议关于请求格式和重要的几个请求头字段含义)。
  7. 服务器收到请求,转到相关的服务程序,期间可能需要连接并操作数据库(主要分get和post请求)。
  8. 服务器看是否需要缓存,服务器处理完请求,发出一个响应(这部分也是重点,请查询资料了解http响应头各个字段的含义)
  9. 服务器并根据请求头包含信息决定是否需要关闭TCP连接(如需关闭,则需要四次挥手过程)
  10. 浏览器对接收到的响应进行解码
  11. 浏览器解析收到的响应并根据响应的内容(假如是HTML文件)进行构建DOM树,构建render树,渲染render树等过程
  12. 处理嵌入的其他资源如css文件、js文件、图片文件、音视频等文件,处理过程类似上面的步骤在此不详述。-

参考资料

https://blog.csdn.net/u014744118/article/details/80698602 CoolSummmer