浏览器工作原理

主要分为导航、获取数据、HTML解析、css解析、执行javaScript、渲染树几个步骤。

1.导航

DNS查询

DNS服务器类似于电话簿,里面包含公共的IP地址以及相关主机名数据库,我们输入一个域名,他能帮我们映射到对应的IP地址。(第一次查询某个网站的时候,IP地址会被缓存一段时间,所以DNS 查询只发生在我们第一次访问一个网站时)

TCP握手

当浏览器知道了网站的IP地址时,他会进行TCP三次握手(更准确的说是 SYN、SYN-ACK、ACK,因为 TCP 有三个消息传输,用于协商和启动两台计算机之间的TCP 会话)与持有资源的服务器建立连接。

第一次 浏览器向服务器发送一个 SYNC 消息,要求进行同步(浏览器:服务器,帮我建立一个连接)

第二次 服务器将回复一个 SYNC-ACK 消息(服务器:收到,我也需要你帮我打开一个连接)

第三次 浏览器将回复一个 ACK 信息(浏览器:我即将打开)

TCP连接(双向连接)已经通过3次握手建立,TLS协商可以开始。

TLS协商

对于通过https建立的安全连接,需要另外进行一次握手。这种握手(TLS协商)决定了哪个密码将被用于加密通信,验证服务器,并在开始实际的数据传输之前建立一个安全的连接。

在这一步骤中,浏览器和服务器之间还交换了一些信息

  • 客户端 hello。浏览器向服务器发送一条信息,其中包括它所支持的TLS版本和密码套件,以及一串随机字节,称为 客户端随机数
  • 服务器 hello 和证书。服务器发回一条信息,其中包括服务器的SSL证书、服务器选择的密码套件和服务器随机数,这是服务器生成的另一个随机字节串。
  • 认证。浏览器会向颁发证书的机构核实服务器的 SSL 证书。这样,浏览器就可以确定服务器就是它所说的那个人。
  • 预主密码。浏览器会再发送一串随机的字节,称为主密钥,用浏览器从服务器的 SSL 证书上获取的公钥进行加密。主密码只能由服务器用私钥解密。
  • 使用私钥。服务器解密预主密码
  • 创建会话密钥。浏览器和服务器从客户端随机数、服务器随机数和预主密码中生成会话密钥。
  • 客户端完成。浏览器向服务器发送一个消息,说它已经完成。
  • 服务器完成。服务器向浏览器发送一个消息,表示它也完成了。
  • 安全对称加密实现。握手完成,通信可以继续使用会话密钥。

2.获取数据

HTTP请求

在我们与服务器建立安全连接后,浏览器将发送一个初始的 HTTP GET 请求。首先,浏览器将请求页面的 HTML 文件。它将使用 HTTP 协议来做这件事。

HTTP(超文本传输协议)是一个获取资源的协议,如HTML文件。它是网络上任何数据交换的基础,它是一个客户-服务器协议,这意味着请求是由接收者发起的,通常是网络浏览器

HTTP 响应

一旦服务器收到请求,它将对其进行处理并回复一个 HTTP 响应。在响应的正文中,我们可以找到所有相关的响应头和我们请求的HTML文档的内容,然后HTMl文件会引入不同的css和js文件

3.HTML解析

当浏览器接收到服务器的相应数据之后,就开始了解析这些数据,解析将由浏览器引擎完成

浏览器引擎是每个主要浏览器的核心组件,它的主要作用是结合结构 (HTML) 和样式 (CSS),以便它可以在我们的屏幕上绘制网页。 它还负责找出哪些代码片段是交互式的。

常用浏览器引擎

Gecko :火狐

WebKit :谷歌、safari

Blink (基于 Chromium):uc、百度、Edge

 HTML 解析涉及两个步骤:词法分析 和 树构造(构建称为 DOM 树的东西)。

词法分析

将一些输入转换成标签,词法分析过程结束时的结果是一系列 0 个或多个以下标签:DOCTYPE、开始标签 (<tag>)、结束标签(</tag>)、自闭合标签 (<tag/>) 、属性名称、值、注释、字符、文件结尾或元素中的纯文本内容。

构建DOM

基于先前解析的标签创建树状结构。

解析器从上到下逐行工作。 当解析器遇到非阻塞资源(例如图像)时,浏览器会向服务器请求这些图像并继续解析。 另一方面,如果它遇到阻塞资源(CSS 样式表、在 HTML 的 <head> 部分添加的 Javascrpt 文件或从 CDN 添加的字体),解析器将停止执行,直到所有这些阻塞资源都被下载。 这就是为什么,如果你正在使用 Javascript,建议在 HTML 文件的末尾添加 <script> 标签,或者如果你想将它们保留在 <head> 标签中,你应该向它们添加 defer 或 async 属性( async 允许在下载脚本后立即执行异步操作,而 defer 只允许在整个文档被解析后执行。)。

预加载器 & 使页面更快

主要就是在HTML在需要使用他引入的文件时,文件已经提前加载完毕(正常情况下是执行那一行才才去加载)

4.css解析

和构建DOM数类似,构建CSSOM

5.执行JavaScript

在解析 CSS 并创建 CSSOM 的同时,还会下载其他资产,包括 JavaScript 文件。 这要归功于我们在之前文章中提到的预加载器。

预加载器就像一个解析器,它在主解析器处理 HTML 代码时扫描 HTML 文件。 它的作用是查找样式表、脚本或图片(也需要从服务器检索)等资源并请求它们。 希望在解析 HTML 时,这些资源已经下载并准备好进行处理。

当我们从服务器获取 Javascript 文件后,代码被解释、编译、解析和执行。 计算机无法理解 Javascript 代码,只有浏览器可以。 JS 代码需要被翻译成计算机可以使用的东西,这是 Javascript 浏览器引擎的工作(不要与浏览器引擎混淆)。 根据浏览器的不同,JS 引擎可以有不同的名称和不同的工作方式。

Javascript 引擎

作用:浏览器js引擎将代码转换成计算机能识别的东西。

常用js引擎

v8:谷歌、node

SpiderMonkey:火狐

JavaScriptCore:safari、macOS

ChakraCore:Edge

编译、解释、即时编译

编译:在编译过程中,一个称为编译器的软件将用高级语言编写的代码一次性转换为机器代码。 创建一个目标文件,该文件可以在任何机器上运行。 采取这些步骤后,就可以执行代码了。

解释:在解释过程中,解释器逐行检查 Javascript 代码并立即执行。 没有进行编译,因此没有创建目标代码(代码的输出由解释器本身使用其内部机制创建)。 旧版本的 Javascript 使用这种类型的代码执行。

即时编译:即时编译是给定语言的解释器的一个特性,它试图同时利用编译和解释。 是在纯编译期间,代码是在执行之前被编译,然而在 JIT 编译中,代码在执行时(在运行时)被编译。 所以我们可以说源代码是动态转换为机器代码的。 较新版本的 Javascript 使用这种类型的代码执行。

简而言之,这三个过程可以总结为:

  • 编译器:编译代码
  • 解释器:运行代码
  • JIT 编译器:在运行代码时进行编译

JavaScript处理

当 Javascript 代码进入 Javascript 引擎时,它首先被解析。 这意味着代码被读取,并且在这种情况下,代码被转换为称为抽象语法树 (AST) 的数据结构。 代码将被拆分成与语言相关的部分(如 functionconst 关键字),然后所有这些部分将构建抽象语法树。

构建 AST 后,它会被翻译成机器代码并立即执行,因为现代 Javascript 使用即时编译。 这段代码的执行将由 Javascript 引擎完成,利用称为“调用堆栈”的东西。

调用堆栈是解释器(如 Web 浏览器中的 JavaScript 解释器)跟踪其在调用多个函数的脚本中的位置的机制——当前正在运行的函数以及从该函数中调用的函数等。

6.渲染树

在解析阶段构建的树(DOM、CSSOM)被组合成一种叫做渲染树的东西。 这用于计算最终将绘制到屏幕上的所有可见元素的布局。 渲染树的目的是确保页面内容以正确的顺序绘制元素。 它将作为在屏幕上显示像素的绘画过程的输入。

结合 DOM 和 CSSOM

  • 浏览器将开始在 DOM 树的根部施展魔法并遍历每个可见节点。 一些节点,如脚本或元标记是不可见的,因此它们被忽略。 还有一些节点会被 CSS 隐藏(例如 display: "none" 属性),它们也会被忽略。 我们只对可见节点感兴趣,因为只有它们对屏幕上的输入有影响。
  • 对于在 DOM 中找到的每个可见节点,将在 CSSOM 中找到相应的规则并应用它们。

以上步骤的结果将是一个包含所有可见节点、内容和样式的渲染树

布局(回流)阶段

渲染树包含有关显示哪些节点及其计算样式的信息,但不包含每个节点的尺寸或位置

接下来需要做的是计算这些节点在设备视口(浏览器窗口内)内的确切位置及其大小。 这个阶段称为重排, 浏览器在渲染树的根部开始这个过程并遍历它。

回流步骤不会只发生一次,而是每次我们更改 DOM 中影响页面布局的某些内容时,即使是部分更改,都会触发回流。 重新计算元素位置的情况示例如下:

  • 在 DOM 中添加或删除元素
  • 调整浏览器窗口大小
  • 更改元素的宽度、位置或使其浮动

绘画(重绘)阶段

在浏览器决定哪些节点需要可见并计算出它们在视口中的位置后,就可以在屏幕上绘制它们(渲染像素)了。 这个阶段也被称为光栅化阶段,浏览器将在布局阶段计算的每个盒子转换为屏幕上的实际像素。

就像布局阶段一样,绘画阶段不会只发生一次,而是每次我们改变屏幕上元素的外观时。 这些情况的例子是:

  • 改变元素的轮廓
  • 改变背景颜色
  • 改变不透明度或可见性

绘画意味着浏览器需要将元素的每个视觉部分绘制到屏幕上,包括文本、颜色、边框、阴影和替换元素(如按钮和图像),并且需要超快地完成。 为了确保重绘可以比初始绘制更快地完成,屏幕上的绘图通常被分解成几层。 如果发生这种情况,则需要进行合成

分层和合成

合成是一种将页面的各个部分分成层的技术,分别绘制它们并在称为合成器线程的单独线程中合成为页面。 当文档的各个部分绘制在不同的层中并相互重叠时,合成是必要的,以确保它们以正确的顺序绘制到屏幕上并且内容被正确呈现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【kubeflow文档】Kubeflow Training Operator

What is Training Operator Training Operator是一个Kubernetes原生项目&#xff0c;用于对使用各种ML框架&#xff08;如PyTorch、TensorFlow、XGBoost等&#xff09;创建的机器学习&#xff08;ML&#xff09;模型进行微调和可扩展的分布式训练。 用户可以将HuggingFace、Dee…

宜选影票api接口如何申请密钥和授权呢?

宜选影票API接口的密钥申请和授权过程一般包括以下步骤&#xff0c;以下将按照清晰的格式分点表示和归纳相关信息&#xff1a; 注册开发者账号&#xff1a; 前往宜选影票的官方网站或开发者平台。注册一个开发者账号&#xff0c;填写必要的个人信息和联系方式。申请API访问权限…

二刷算法训练营Day22 | 二叉树(8/9)

目录 详细布置&#xff1a; 1. 235. 二叉搜索树的最近公共祖先 2. 701. 二叉搜索树中的插入操作 3. 450. 删除二叉搜索树中的节点 详细布置&#xff1a; 1. 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共…

用这个AI工具,做公众号爆款图文,5分钟一篇10w+,居然这么简单!(附工具教程)

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 之前X小鹿一直在各…

mac虚拟光驱工具:Daemon Tools for Mac

Daemon Tools for Mac是一款功能强大的虚拟光驱工具&#xff0c;它为用户提供了在Mac上模拟物理光驱的能力&#xff0c;从而方便用户处理各种光盘映像文件。以下是关于Daemon Tools for Mac的详细介绍&#xff1a; 守护进程工具&#xff1a;Daemon Tools不仅是一个简单的虚拟光…

【讯为Linux驱动开发】2.注册一个字符设备

【问】如何描述一个字符设备&#xff1f; dev结构体 其中需要关心三个成员变量&#xff1a; 所属模块 &#xff1a;struct module *owner; 文件操作结构体&#xff1a; const struct file_operations *ops 设备号 &#xff1a; dev_t 当应用层使用指令open("/dev/hello&…

学生成绩管理系统(大一大作业)

功能 实现添加&#xff0c;排序&#xff0c;修改&#xff0c;保存等功能 库函数 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<string.h> 头文件 #define functioncreate(major) void major##compare(mana mn){\int i,j,s…

使用Matlab软件绘制函数图像

【实验目的】 1.利用Matlab实现平面上曲线和三维空间中曲线绘制&#xff0c;重点掌握隐函数、极坐标图像绘制的相关命令。 2.利用Matlab实现三维曲面绘制&#xff0c;加深对高等数学课程所学内容的理解 【实验内容与实现】 1、用两种方法绘制下面的曲线图 &#xff08;1&am…

Autodesk 3ds Max软件下载安装;3ds Max功能强大的三维建模、渲染软件安装包获取

3ds Max&#xff0c;无论是初学者还是资深设计师&#xff0c;都能通过3ds Max在数字世界中实现自己的创意&#xff0c;打造出令人惊叹的三维作品。 在3ds Max中&#xff0c;灯光系统是至关重要的一环。它提供了光度学灯光和标准灯光两种主要类型&#xff0c;用于照亮和增强场景…

Spring家族中的消息通信解决方案

相信大家对消息通信架构以及各种消息中间件应该都不陌生。在分布式系统的设计和开发过程中&#xff0c;消息通信是用于实现系统解耦、提高扩展性的一大技术体系。而业界关于如何实现消息通信系统也有很多解决方案和对应的开发框架。不知道你有没有发现&#xff0c;在我们每天都…

计算机英文教材太难啃?Higress 和通义千问帮你!

作者&#xff1a;张添翼&#xff08;澄潭&#xff09; 计算机相关英文教材的中译本质量堪忧&#xff0c;对于计算机专业的学生来说&#xff0c;应该深有体会。因为大部分教材的译者本人可能未必完全吃透书中技术内容&#xff0c;又或者是领域技术大拿&#xff0c;但并不擅长英…

数据结构的归并排序(c语言版)

一.归并排序的基本概念 1.基本概念 归并排序是一种高效的排序算法,它采用了分治的思想。它的基本过程如下: 将待排序的数组分割成两个子数组,直到子数组只有一个元素为止。然后将这些子数组两两归并,得到有序的子数组。不断重复第二步,直到最终得到有序的整个数组。 2.核心…

LabVIEW2017破解安装教程

LabVIEW2017破解安装教程&#xff1a; 1、新版LabVIEW2017分为32位和64位两个平台&#xff0c;多种语言版本(需要LabVIEW2017中文版的朋友请选择WinChn版本)&#xff0c;大家选择自行选择符合系统的版本下载并解压 2、本次安装以Win 7 64位系统为例&#xff0c;运行“2017LV-64…

龙蜥社区 5 月度运营大事件回顾

各位龙蜥社区的朋友们&#xff0c;你们好&#xff01; 龙蜥社区 5 月运营月报如期而至&#xff01;本次从特别图送、龙蜥生态、龙蜥活动、龙蜥 SIG 月度动态、精彩内容推荐等几方面总结、回顾了 5 月发生的重要事件。

设计模式之过滤器模式FilterPattern(十)

一、过滤器模式 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种设计模式&#xff0c;这种模式允许开发人员使用不同的标准来过滤一组对象&#xff0c;通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模…

【长亭雷池WAF——“动态防护”功能深度体验】

前言&#xff1a; 在当今的网络安全环境中&#xff0c;Web应用防火墙&#xff08;WAF&#xff09;扮演着至关重要的角色。它们不仅能够防御常见的Web攻击&#xff0c;如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;等&#xff0c;还能够应对日益复杂的网络威胁。 长亭…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…

CAM350如何快速删除Gerber文件上的东西?

文章目录 CAM350如何快速删除Gerber文件上的东西?CAM350如何快速保存已经修改的Gerber文件? CAM350如何快速删除Gerber文件上的东西? CAM如何导入Gerber文件见此篇 今天遇上了一个删除Gerber文件上部分字母的任务&#xff0c;CAM350只能一点点删除线的操作把我手指头差点按…

订单排队与链动模式塑造社交电商新格局

在数字化浪潮中&#xff0c;社交电商凭借其独特的魅力与潜力&#xff0c;正逐渐崭露头角。本文将解读一种融合了订单排队与链动模式的创新商业模式。这一模式旨在通过提高消费者复购率&#xff0c;优化销售流程&#xff0c;从而推动销售增长&#xff0c;塑造社交电商新生态。 …

Mybatis03-ResultMap及分页

1、属性名和字段名不一致问题 1.问题 数据库中的字段 新建一个项目Mybatis-04&#xff0c;拷贝之前&#xff0c;测试实体类字段不一致的情况 public class User {private int id;private String name;private String password; }select * from mybatis.user where id #{id} …