浏览器渲染过程

浏览器的渲染过程是多个线程、进程和阶段的复杂编排,它将原始的 HTML、CSS 和 JavaScript 转换为屏幕上的交互像素。

  1. 你在浏览器中输入一个 URL 并按下回车键

  2. 网站在你的屏幕上呈现出来

注意:本文中,将使用 “客户端(client)”、“浏览器(browser)” 和 “服务器(server)” 术语。在这里,“浏览器” 是一种 “客户端”,在本文的语境中,它们是一个东西,而 “服务器”是指托管网站的网络服务器。

导航与网络

当你在浏览器的地址栏中输入一个 URL 并按下回车键时,渲染过程就开始了。假设我们正在尝试加载 “https://example.com”。浏览器不知道从哪里获取这个网站的内容。这只是一个我们人类能够理解的名称,浏览器理解不了——它需要将这个名称转换为一个 IP 地址——这就是 DNS 查找发挥作用的地方了。

提示:DNS 代表域名系统(Domain Name System)。这个系统使用指定的权威域名服务器将域名映射到数字 IP 地址。

DNS 查询步骤 Demo 演示:

图片

上图展示了 DNS 的查找过程,也称为查询之旅(query journey)。查询之旅涉及将你输入的域名转换为 IP 地址所需的每一个步骤。查询的第一站是递归服务器(recursive server),然后它会联系一系列权威域名服务器将域名转换为 IP 地址。最终,返回请求域名所对应的 IP 地址。

提示:域名服务器是用于查找 IP 地址所关联域名的专用服务器。你可以在域名的 DNS 记录(domain’s DNS records)中找到这些域名服务器。

现在我们有了 IP 地址,浏览器就可以与托管网站的服务器建立连接了。建立连接是通过 TCP 握手过程完成的。

TCP/TLS 握手

TCP(传输控制协议)握手是一个包含三个步骤的过程,用于在客户端和服务器之间建立连接。它由客户端和服务器之间交换的一组数据包组成,以确保连接可靠。这三个步骤分别是:

  1. SYN:客户端向服务器发送一个同步数据包(SYN)来发起连接

  2. SYN-ACK:服务器用一个确认数据包(SYN-ACK)响应客户端

  3. ACK:客户端向服务器发送一个确认(ACK)来完成握手

到这一步,我们只是与服务器建立了连接。下一步是确保这个连接的安全性。还记得 URL 旁边的 “https” 锁图标吗?这定义了一个安全连接,是通过另一个称为 TLS 握手的握手过程完成的,它涉及几个步骤。但在我们深入探讨之前,如果你能理解一些与 TLS 握手相关的术语,会更容易掌握。

  1. 密码(Cipher):一种用于加密和解密数据的算法,用于在互联网上安全地传输数据

  2. 证书(Certificate):一个文件,包含有关网站身份和公钥(public key)的信息,用作数字签名来验证网站的真实性

  3. 证书颁发机构(Certificate Authority,CA):一个受信任的实体,向网站颁发数字证书,由它来验证网站的身份并确保证书的真实性

  4. 公钥(Public Key):用于加密发送至互联网的数据,在服务端与客户端中共享,确保建立安全连接

  5. 私钥(Private Key):用于解密从客户端收到的数据,它是保密的,不对外共享

TLS 握手过程包含多个步骤,我将它主要概括为 4 个类别:

  1. 问候消息(Hello Messages):客户端发送一个 “ClientHello” 消息来发起握手,服务器用一个 “ServerHello” 消息加上数字证书进行响应

  2. 密钥交换(Key Exchange):服务器可发送密钥交换信息,客户端则回应自己的密钥交换信息(如有要求,还可提供证书)

  3. 密码规范(Cipher Spec):客户端发送一个 “CipherSpec” 消息以切换到协商好的加密方式,然后发送一个 “Finished” 消息

  4. 服务器完成(Server Finalization):服务器回复自己的 “CipherSpec” 和 “Finished” 消息,完成握手并建立安全连接

提示:SSL,即安全套接层(Secure Sockets Layer),是最初为 HTTP 开发的安全协议。近来年,SSL 被 TLS(即传输层安全协议)所取代。尽管 “SSL” 这个名称仍然被广泛使用,实际上现在 SSL 握手改成是 TLS 握手才是更符合实际的。

让我们通过下面的演示来看看这个过程:

图片

到这一步,还没有实际的内容或应用程序数据被传输。服务器只是确认了连接并建立了一个安全通道。浏览器(客户端)在幕后处理所有这些协商过程。只有在 TLS 握手完成并且双方都交换了 “Finished” 消息之后,他们才能开始安全地发送和接收加密内容。

HTTP 请求/响应周期

现在浏览器请求网站的内容。服务器处理这个请求并发送回一个响应。这就是 HTTP 请求/响应周期发挥作用的地方。后端开发人员负责处理请求,而前端开发人员更关注这个周期的响应部分

观看下面的演示来可视化这个周期(HTTP 请求流):

图片

我们在上面的演示中看到了一个叫做 “TTFB” 的东西。TTFB 代表首次字节时间(Time To First Byte)。它是客户端请求发送到服务器之后、服务器发送响应返回、直到客户端接收到第一个字节时,这中间所耗费的时间。它是衡量服务器响应时间和网站性能的一个重要指标。较低的 TTFB 表示服务器响应更快。

提示:良好的 TTFB 值应该是 0.8 秒或更少大于 1.8 秒就属于较差的了。介于两者之间的值属于 “需要改进”。

正如你在演示中看到的,在收到第一个字节后,响应继续加载。服务器仍在处理请求并将剩余数据发送回客户端。从这里,浏览器开始介入处理响应。

标记化(Tokenization)

浏览器将开始解析这个 HTML 响应。它读取 HTML 的原始字节,并根据文件指定的编码(如 UTF-8)将它们转换为单个字符。以下是原始字节可能的一个样子:

01001000 01010100 01001101 01001100

提示:每组八个比特代表一个字节,每个字节可以根据编码标准转换为一个字符、符号或指令。例如,在 UTF-8 编码中,字母 A 的二进制序列是 01000001,字母 B 则是 01000010

浏览器将字符串字符转换为不同的标记(tokens)并对它们进行分组,例如,<html><body> 以及尖括号内的其他字符串,每个标记都是一个有意义的单元,代表一个 HTML 组件。

HTML 标记化 Demo:

图片

DOM 树创建

DOM(文档对象模型)树是 HTML 文档结构的层次表示。它将元素表示为节点树,每个节点代表文档中的一个元素、属性或文本内容。:

作为参考,这是我们收到的响应定义成一个简单的 HTML 文档,类似于下面这样:主要有一个 h1 标签、一个  p 标签、一个 a 标签和一点 CSS 样式。

<html lang="en-US"><head><style>.heading {color:#0099ff; font-size: 14px}p {margin: 0.5em 0;}a {color: #0099ff; text-decoration: underline;}</style></head><body><h1 class="heading">My Page</h1><p>A paragraph with a <a href="https://example.com/about">link</a></p></body>
</html>

DOM 是一个树状结构,所以可以很容易的表示父子关系。

图片

每次浏览器渲染网页时,它都会经历这个多步骤的过程:将 HTML 字节解析为字符,识别标记,将它们转换为节点,最后构建 DOM 树。虽然 DOM 树定义了 HTML 元素的结构和关系,但它并不决定它们的视觉外观。这是由接下来要讲的 CSSOM 决定的。

CSSOM 树创建

CSS 对象模型(CSSOM)是应用于 HTML 文档的 CSS 样式的表示,它类似 DOM 树,但表示的是 CSS 样式而不是 HTML 结构。CSSOM 用于计算文档中每个元素的最终样式。

查看这个演示来了解 CSSOM 树是如何创建的:

图片

浏览器将这些样式解析为一个精简、内存高效且优化的数据结构,旨在有效地组织样式规则,允许根据匹配的选择器快速检索和应用样式。

一旦构建了 DOM 和 CSSOM,浏览器就可以开始创建渲染树了。

渲染树创建

渲染树是 DOM 和 CSSOM 树的组合,它表示页面的视觉结构,包括布局和样式信息。渲染树用于计算布局并在屏幕上绘制元素。

图片

从上面的演示中可以看到,渲染树是 DOM 和 CSSOM 树的组合。它只包含将在屏幕上显示的元素。它为每个元素计算了样式和布局信息,允许浏览器准确地渲染页面。这就把我们带到了渲染过程的最后一个阶段——布局。

布局

你一定使用 CSS 做过定义过不同 “布局“。在浏览器渲染场景, “布局“这个术语,表示计算页面上每个元素的确切位置和大小的过程。

布局过程涉及根据渲染树确定来每个元素的尺寸、边距、填充、边框和定位。你可能见过元素相互重叠,例如模态窗口、下拉菜单等,这就是布局过程发挥作用的地方。

即使 HTML 标记是有序的,由于 CSS 属性会改变布局,元素也不一定按照它们编写的顺序出现。让我们看看这些属性如何影响布局。

图片

写在 HTML 代码里的 DOM 顺序不会改变,但当我们使用 CSS 属性改变布局时,布局过程必须参与处理。当然,其他一些 CSS 属性,诸如 position、display、top、left 和 z - index,同样会影响布局,从而触发布局过程。

从上面的演示中看到的,元素的流受到它们的显示类型(display)的影响:块元素垂直堆叠,而内联元素水平流动;而定位属性如 static, relative, absolute, fixed 和 sticky 则进一步决定了元素如何相互排列——例如,相对定位使元素偏离其正常位置而不影响周围的布局,而绝对定位使元素完全脱离文档流。

经过布局这一步骤,就得到了一个显示每个元素的精确计划。接下来就进入到绘制步骤了,在这个步骤中 HTML 文档最终以视觉形式被渲染到屏幕上。

绘制

在绘制阶段,浏览器将从上一步拿到的结构化布局信息翻译出来,将页面中的每个元素绘制到屏幕上。这个过程设计填充颜色、应用图片、边框、阴影和其他视觉样式,绘制顺序基于堆叠上下文(stacking context),确保元素根据 z-index 和其他属性正确分层。

绘制阶段演示 Demo:

图片

绘制过程也是会优化的,以尽量减少需要重新绘制的像素数量。浏览器使用分层(layering)、合成(compositing)和缓存(caching )等技术来提高页面渲染效率。

拓展内容

JavaScsript 扮演的角色

本文中没有讨论浏览器如何解析和优化  JavaScript,这是一个完全不同的故事。简单说,它会在初始渲染后操作 DOM 和 CSSOM,创建动态和交互式的网页体验。

浏览器渲染引擎

不同的浏览器使用不同的渲染引擎,如 Blink(Chrome)、WebKit(Safari)和 Gecko(Firefox)。这些引擎可能具有不同的性能特征和兼容级别。某些 CSS 功能或 JavaScript 方法可能在一个引擎中支持,但在其他引擎中不支持,或者它们的行为可能不一致。此外,不同的引擎对 HTML 元素所应用的默认样式也可能有所差异。

总结

最后,总结浏览器渲染过程的所有步骤:

  1. DNS 查找:当输入 URL 时,浏览器执行 DNS 查找,将域名转换为 IP 地址,以便定位到网站服务器

  2. TCP/TLS 握手:浏览器发起 TCP 握手与服务器建立连接。如果网站是基于 https 的,还会进行 TLS 握手来加密传输的数据

  3. HTTP 请求/响应周期:建立连接后,浏览器发送一个 HTTP 请求获取网站的内容,服务器响应以必要的 HTML、CSS、JavaScript 或其他其他资源

  4. 标记化:浏览器将 HTML 响应的原始数据,将其转换为单个字符,然后转换为标记(如<html><body>

  5. DOM 树创建:浏览器构建 DOM(文档对象模型)树,这是 HTML 文档结构的层次表示,每个节点代表一个元素或文本内容

  6. CSSOM 树创建:浏览器解析 CSS 并创建 CSSOM(CSS 对象模型)树,它表示与 HTML 文档元素相关联的样式

  7. 渲染树创建:DOM 和 CSSOM 树组合形成渲染树,这是页面布局的视觉表示,只包括可见元素及其计算样式

  8. 布局:浏览器根据 CSS 属性(如边距、填充和定位(如 static、absolute))计算屏幕上每个元素的确切大小和位置

  9. 绘制:浏览器基于渲染树将像素绘制到屏幕上,填充颜色、图片、边框和阴影,这些都是由 CSS 定义的

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

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

相关文章

华鲲振宇天工TG225 B1国产服务器试装openEuler22.03 -SP4系统

今天测试了一下在华鲲振宇公司的天工TG225 B1国产服务器上进行openEuler22.03 -SP4操作系统的试装&#xff0c;本文记录整个测试过程。 一、服务器信息 1、服务器型号 Huakun TG225 B1 (D) 2、登录IPMI帐户信息 初始用户名Tech.ON 密码TianGong8000 二、磁盘RAID配置 测试…

Qemu-STM32(十二):STM32F103 框架代码添加

简介 本系列博客主要描述了STMF103的qemu模拟器实现&#xff0c;进行该项目的原因有两点: 作者在高铁上&#xff0c;想在STM32F103上验证一个软件框架时&#xff0c;如果此时掏出开发板&#xff0c;然后接一堆的线&#xff0c;旁边的人估计会投来异样的目光&#xff0c;特别是…

英伟达与通用汽车深化合作,澳特证券am broker助力科技投资

在近期的GTC大会上&#xff0c;英伟达CEO黄仁勋宣布英伟达将与通用汽车深化合作&#xff0c;共同推进AI技术在自动驾驶和智能工厂的应用。此次合作标志着自动驾驶汽车时代的加速到来&#xff0c;同时也展示了英伟达在AI技术领域的最新进展。      合作内容包括&#xff1a;…

将 Markdown 表格结构转换为Excel 文件

在数据管理和文档编写过程中&#xff0c;我们经常使用 Markdown 来记录表格数据。然而&#xff0c;Markdown 格式的表格在实际应用中不如 Excel 方便&#xff0c;特别是需要进一步处理数据时。因此&#xff0c;我们开发了一个使用 wxPython 的 GUI 工具&#xff0c;将 Markdown…

HarmonyOS NEXT 关于鸿蒙的一多开发(一次开发,多端部署) 1+8+N

官方定义 定义&#xff1a;一套代码工程&#xff0c;一次开发上架&#xff0c;多端按需部署。 目标&#xff1a;支撑开发者快速高效的开发支持多种终端设备形态的应用&#xff0c;实现对不同设备兼容的同时&#xff0c;提供跨设备的流转、迁移和协同的分布式体验。 什么是18…

Nacos

简介 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台&#xff0c;旨在为微服务架构提供高可用、高性能的解决方案。其核心功能包括服务注册与发现、动态配置管理、服务健康监测、动态 DNS …

Win11系统下qq远程不能控制对方电脑(鼠标点不动)的解决方法

在被控制的电脑上&#xff0c;打开控制面板&#xff0c;点击系统和安全 点击更改用户账户控制设置 下拉用户控制设置至最低&#xff0c;从不通知&#xff0c;点击确定 返回控制面板系统与安全&#xff0c;带年纪允许远程访问 点击允许远程协助连接这台计算机 重启电脑 再次打…

猎豹移动营收连续三季增长,AI驱动的猎豹成绩单怎么分析?

3月26日&#xff0c;猎豹移动发布2024年Q4及全年财报&#xff0c;这份财报我们到底该该怎么分析呢&#xff1f; 首先&#xff0c;整体财务表现稳健&#xff0c;营收连续三季增长。从财务数据来看&#xff0c;猎豹移动整体表现稳健。2024年Q4及全年财报显示&#xff0c;总收入达…

函数:链式访问

链式访问是将函数的返回值当作回传值就是链式访问 这是原本的字符数回传代码 int main() {int len strlen("seig heil");printf("%d", len);return 0; } 运行结果&#xff1a; 这是链式访问的代码&#xff1a; int main() {printf("%d\n",s…

C++ map容器总结

map基本概念 简介&#xff1a; map中所有元素都是pair pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实值&#xff09; 所有元素都会根据元素的键值自动排序 本质&#xff1a; map/multimap属于关…

23种设计模式-代理(Proxy)设计模式

代理设计模式 &#x1f6a9;什么是代理设计模式&#xff1f;&#x1f6a9;代理设计模式的特点&#x1f6a9;代理设计模式的结构&#x1f6a9;代理设计模式的优缺点&#x1f6a9;代理设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是代理设计模式…

UE4学习笔记 FPS游戏制作29 更换武器时更换武器的图标

文章目录 制作物体图标UI添加获取武器图标的方法使用事件分发器&#xff0c;通知UI要换枪定义事件分发器调用事件分发器注册事件分发器 制作物体图标UI 在Fpp-UI上添加一个图片&#xff0c;改名为五weaponIcon&#xff0c;勾选SizeToContent,锚点放在右下角&#xff0c;对齐改…

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS&#xff1f; 在前后端开发过程中&#xff0c;我们经常会遇到 跨域请求被浏览器拦截 的问题。例如&#xff0c;你在 http://localhost:3000 调用 https://api.example.com 时&#xff0c;可能会…

【RAG综述系列】之 RAG 相关背景和基本原理

系列文章&#xff1a; 【RAG综述系列】之 RAG 相关背景和基本原理 【RAG综述系列】之 RAG 特点与挑战以及方法与评估 【RAG综述系列】之 RAG 先进方法与综合评估 【RAG综述系列】之 RAG 应用和未来方向 正文&#xff1a; 检索增强生成&#xff08;Retrieval-Augmented Gen…

德昂观点:如何看待MicroStrategy改名为Strategy?

2025年2月&#xff0c;纳斯达克上市公司MicroStrategy&#xff08;股票代码&#xff1a;MSTR&#xff09;宣布更名为“Strategy”&#xff0c;并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新&#xff0c;更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…

计算机视觉算法实战——手术导航:技术、应用与未来

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 手术导航中的计算机视觉&#xff1a;领域介绍 计算机视觉在手术导航领域的应用代表了现代医学与人工智…

Java全栈面试宝典:内存模型与Spring设计模式深度解析

目录 一、JVM内存模型进阶篇 &#x1f525; 问题13&#xff1a;堆与栈的六大维度对比 内存结构对比图 核心差异对照表 &#x1f525; 问题14&#xff1a;三区联动内存模型解析 代码内存分配图解 三区协作流程图 二、Spring设计模式全景解析 &#x1f31f; Spring框架七…

FALL靶场通关攻略

1&#xff0c;下载好靶机后打开&#xff0c;通过kali扫描靶机ip和端口&#xff0c;得到靶机ip为192.168.50.144 2&#xff0c;扫描目录 3&#xff0c;访问靶机 4&#xff0c;访问扫描到的test.php,得到缺少GET请求参数的提示 5&#xff0c;使用FUZZ来扫出参数为file 6&#xff…

《C++11:bind绑定器与function包装器》

CSTL中提供了bind1绑定器&#xff0c;通常与函数对象一起使用。 函数对象是重载了operator&#xff08;&#xff09;函数的对象。 将二元函数对象operator&#xff08;&#xff09;的第一个参数绑定为固定的x来构造一元函数对象。返回绑定了第一个参数的函数对象。 将二元函数…

JS 防抖与节流

防抖 核心思想&#xff1a;延迟执行&#xff0c;只有在事件触发的频率降低到一定程度后才会执行&#xff0c;而且如果事件持续触发&#xff0c;之前地所有执行都会被取消。 有的操作是高频触发的&#xff0c;但是其实只需要一次触发。比如短时间内多次缩放页面resize&#xff0…