当前位置: 首页 > 科技观察

五分钟了解浏览器的工作原理

时间:2023-03-15 19:43:11 科技观察

Web浏览器无疑是用户访问互联网非常普遍的入口点。浏览器凭借其免安装和跨平台的优势,逐渐取代了很多传统的富客户端。Web浏览器通过向URL发送网络请求并以交互方式显示它们来访问Web服务器资源。基本操作包括采集、处理、显示和存储。常见的浏览器包括InternetExplorer、Firefox、GoogleChrome、Safari和Opera等。浏览器架构图浏览器主要由以下部分组成:用户界面浏览器引擎渲染引擎数据存储层UI后端JavaScript解析器(ScriptEngine)网络层用户界面这是用户与浏览器交互的区域。浏览器的外观没有特定的标准。HTML5规范并没有规定UI元素应该是什么样子,但是列出了一些常见的元素:地址栏、个人信息栏、滚动条、状态栏和工具栏。浏览器引擎提供UI与底层渲染引擎的接口,根据用户交互查询和操作渲染引擎,提供初始化加载URL的方法,负责重新加载、返回、转发等操作。渲染引擎渲染引擎负责在屏幕上显示网页内容。渲染引擎的主要工作是解析HTML。渲染引擎默认可以显示HTML、XML和图片,也可以通过插件或扩展支持其他数据类型。渲染引擎工作流程现代浏览器使用不同的渲染引擎:Gecko:FirefoxWebkit:SafariBlink:Chrome、Opera(版本15及以上)。可以参考这篇文章:各种浏览器引擎傻傻分不清楚?终于有人解释清楚了!Web内容渲染过程大致如下:HTML数据转换为DOM渲染引擎接收来自网络层的请求内容(通常为8kb块),并将原始字节转换为HTML文件中的字符(基于字符编码)。然后词法分析器执行词法分析,将输入分解为各种标记。在标记化期间,记录文件中的每个开始和结束标记。它知道如何删除不相关的字符,如空格和换行符。接下来,解析器执行语法分析,并通过分析文档结构和应用语言语法规则来构建解析树。解析过程是迭代的。它向词法分析器询问一个新的标记,如果它匹配语法规则,则该标记被添加到解析树中。然后请求另一个令牌。如果没有匹配的规则,解析器将在内部存储令牌并不断请求新的令牌,直到它找到匹配所有内部存储的令牌的规则。如果没有找到规则,解析器将抛出一个异常,指出该文档无效并且包含语法错误。这些节点在DOM(DocumentObjectModel)树状数据结构中相互链接,建立父子关系和相邻兄弟关系。dom-treeCSS数据转换为CSSOMCSS数据原始字节被转换为字符、标记、节点,最后转换为CSSOM(CSS对象模型)。CSS的分层性质决定了将什么样式应用于元素。元素的样式数据可以来自父元素(通过继承),也可以直接在元素上设置。浏览器需要递归遍历CSS树结构来确定特定元素的样式。cssom-treeDOM和CSSOM组成渲染树。DOM树包含了HTML元素之间的关系信息,CSSOM树包含了这些元素的样式信息。浏览器从根节点开始,遍历每一个可见的节点。一些节点是隐藏的(通过CSS控制)并且不会出现在渲染结果中。对于每一个可见的节点,浏览器都会找到CSSOM中定义的相关规则进行匹配,最终这些节点会连同内容和样式一起出现在渲染树中。渲染树布局之后是内容布局。在页面(浏览器视口)上呈现之前,需要计算内容的实际大小和位置。这个过程也称为回流焊。HTML采用基于流的布局模型,这意味着在大多数情况下,几何位置计算一次(内容大小或位置发生变化,需要重新计算)。这个过程是从文档根元素开始递归完成的。绘图是通过遍历每个渲染器并调用paint方法在屏幕上显示内容来完成的。绘制过程可以是全局的(绘制整棵树)或增量的(渲染树验证屏幕上的某个矩形区域),操作系统在这些特定节点上生成绘制事件,而整棵树不受影响。绘图是一个增量过程,其中一部分被解析和渲染,其余部分继续进行。JavaScript解析器(JS引擎)JavaScript是一种脚本语言,可以动态更新网页内容、控制多媒体和动画等,都是通过浏览器的JS引擎来完成的。DOM和CSSOM都提供了JS接口,都可以通过JS进行修改。由于浏览器不确定某些JS将做什么,因此它会在遇到脚本标签时立即暂停构建DOM树。JS解析器收到服务端发来的代码后,会立即解析。代码被转换成机器可以理解的对象表示。保存所有解析信息的对象称为抽象语法树(AST),这些对象由解析器转换为字节码。这种编译方式称为JustInTime(JITs),即从服务器端下载JavaScript,在客户端实时编译。解析器和编译器结合使用。解析器立即处理源代码,编译器生成机器码,客户端操作系统可以直接运行。不同浏览器中的JS引擎Chrome:V8引擎(NodeJS构建于此之上)Mozilla:SpiderMonkey(以前称为“SquirrelFish”)MicrosoftEdge:ChakraSafari:用于绘制复选框和窗口等基本控件的NitroUI背景底层使用操作系统的用户界面方法暴露一个通用接口,与平台无关。数据存储层这是持久层,辅助浏览器保存一些数据(如cookies、会话存储、索引DB、WebSQL、书签、用户偏好等)。HTML5规范建议在浏览器端提供完整的数据库功能。网络层该层为浏览器处理各种网络通信。浏览器使用各种通信协议来访问网络资源,例如HTTP、HTTPs、FTP等。浏览器使用DNS来解析URL。这些解析记录缓存在浏览器、操作系统、路由器或ISP中。如果请求的URL不在缓存中,ISP的DNS服务器首先发起DNS查询以查找服务器的IP地址。找到正确的IP地址后,浏览器使用特定协议与服务器建立连接。浏览器向服务器发送SYN数据包,询问服务器是否打开了TCP连接。服务器以SYN/ACK数据包响应先前的SYN。浏览器收到响应后,向服务器发送ACK包。通过这样的三次握手,一个TCP连接就建立起来了。一旦建立连接,就可以传输数据。传输数据时必须遵守HTTP协议的相关要求,包括请求和响应的规则。浏览器比较当今市场上有许多不同的浏览器,虽然核心功能相同,但在很多方面都有所不同。包括平台(Linux、Windows、Mac、BSD等Unix系统)、协议、用户界面、HTML5支持、开源、所有权等。详情请参考维基百科https://en.wikipedia.org/wiki/Comparison_of_web_browsers.以上是对浏览器工作原理的粗浅描述。当然,浏览器底层还是比较复杂的,远不是几张图、一篇文章能说清楚的。有兴趣的可以去看看浏览器的源码,深入了解。