详解从输入url到页面渲染

当你在浏览器中输入一个 URL 并按下回车键,浏览器会经历一系列步骤来加载并渲染页面。这些步骤包括 DNS 解析、缓存处理、建立连接、发送请求、接收响应、解析 HTML、构建 DOM 树和 CSSOM 树、执行 JavaScript、布局和绘制等。以下是这些步骤的详细解释,以及面试中常见的问题和细节。

1. 输入 URL 并按下回车

当你在浏览器中输入 URL 并按下回车键时,浏览器会开始处理这个请求。

2. DNS 解析

浏览器首先需要将域名解析为 IP 地址。这个过程称为 DNS 解析。

  • DNS 解析过程

    1. 浏览器缓存:浏览器会首先检查自己的 DNS 缓存,看看是否有对应的 IP 地址。
    2. 操作系统缓存:如果浏览器缓存中没有找到,浏览器会向操作系统查询 DNS 缓存。
    3. 路由器缓存:如果操作系统缓存中没有找到,操作系统会向路由器查询 DNS 缓存。
    4. ISP 缓存:如果路由器缓存中没有找到,路由器会向 ISP 的 DNS 服务器查询。
    5. 递归查询:如果 ISP 的 DNS 服务器中没有找到,DNS 服务器会进行递归查询,直到找到对应的 IP 地址。
  • 面试常见问题

    • 什么是 DNS 解析?
    • DNS 解析的过程是怎样的?
    • DNS 缓存的层级有哪些?

3. 检查缓存

在发送请求之前,浏览器会检查本地缓存(如 HTTP 缓存)中是否有对应的资源。如果有,并且缓存未过期,浏览器会直接从缓存中读取资源,而不需要发送请求。

  • 缓存机制

    • 强缓存:浏览器直接从缓存中读取资源,不会向服务器发送请求。常见的 HTTP 头部字段有 Expires 和 Cache-Control
    • 协商缓存:浏览器向服务器发送请求,服务器根据请求头部字段判断资源是否更新。如果资源未更新,服务器返回 304 状态码,浏览器从缓存中读取资源。常见的 HTTP 头部字段有 Last-Modified 和 ETag
  • 面试常见问题

    • 什么是强缓存和协商缓存?
    • 强缓存和协商缓存的区别是什么?
    • 常见的 HTTP 缓存头部字段有哪些?

4. 建立连接

如果缓存中没有找到资源,浏览器会与服务器建立连接。这个过程包括以下步骤:

  • TCP 三次握手

    1. 客户端发送 SYN 包到服务器,表示请求建立连接。
    2. 服务器收到 SYN 包后,回复 SYN-ACK 包,表示同意建立连接。
    3. 客户端收到 SYN-ACK 包后,回复 ACK 包,表示确认建立连接。
  • TLS 握手(如果使用 HTTPS):

    1. 客户端发送 ClientHello 消息,包含支持的加密算法等信息。
    2. 服务器回复 ServerHello 消息,选择加密算法,并发送服务器证书。
    3. 客户端验证服务器证书,并生成会话密钥,发送给服务器。
    4. 服务器使用会话密钥加密通信。
  • 面试常见问题

    • 什么是 TCP 三次握手?
    • TCP 三次握手的过程是怎样的?
    • 什么是 TLS 握手?
    • TLS 握手的过程是怎样的?

5. 发送 HTTP 请求

建立连接后,浏览器会向服务器发送 HTTP 请求,包含请求方法(如 GET、POST)、请求头部和请求体等信息。

  • 面试常见问题
    • 常见的 HTTP 请求方法有哪些?
    • HTTP 请求头部字段有哪些?
    • GET 和 POST 请求的区别是什么?

6. 服务器处理请求并返回响应

服务器接收到请求后,会处理请求并返回 HTTP 响应,包含状态码、响应头部和响应体等信息。

  • 面试常见问题
    • 常见的 HTTP 状态码有哪些?
    • HTTP 响应头部字段有哪些?
    • 什么是 HTTP/2?它与 HTTP/1.1 的区别是什么?

7. 浏览器解析 HTML

浏览器接收到响应后,会开始解析 HTML 文档,并构建 DOM 树。

  • DOM 树构建

    • 浏览器从上到下解析 HTML 文档,遇到标签时创建对应的 DOM 节点,并按照层级关系构建 DOM 树。
  • 面试常见问题

    • 什么是 DOM?
    • DOM 树的构建过程是怎样的?

8. 解析 CSS

在解析 HTML 的过程中,浏览器会遇到 CSS 文件或内联样式,并开始解析 CSS,构建 CSSOM 树。

  • CSSOM 树构建

    • 浏览器解析 CSS 规则,创建对应的节点,并按照层级关系构建 CSSOM 树。
  • 面试常见问题

    • 什么是 CSSOM?
    • CSSOM 树的构建过程是怎样的?

9. 解析 JavaScript

在解析 HTML 的过程中,浏览器会遇到 JavaScript 文件或内联脚本,并开始解析和执行 JavaScript 代码。

  • JavaScript 执行

    • 浏览器会暂停 HTML 解析,直到 JavaScript 代码执行完毕。
    • JavaScript 代码可以操作 DOM 和 CSSOM,修改页面内容和样式。
  • 面试常见问题

    • JavaScript 的执行过程是怎样的?
    • 什么是阻塞渲染?如何避免?

10. 构建渲染树

浏览器将 DOM 树和 CSSOM 树结合,构建渲染树(Render Tree)。

  • 渲染树构建

    • 渲染树包含页面中可见的元素及其样式信息。
    • 不可见的元素(如 display: none)不会包含在渲染树中。
  • 面试常见问题

    • 什么是渲染树?
    • 渲染树的构建过程是怎样的?

11. 布局(Layout)

浏览器根据渲染树计算每个元素的位置和大小,这个过程称为布局(或回流)。

  • 布局过程

    • 从渲染树的根节点开始,递归计算每个节点的位置和大小。
  • 面试常见问题

    • 什么是布局(Layout)?
    • 什么是回流(Reflow)?如何避免?

12. 绘制(Painting)

浏览器根据布局结果,将每个元素绘制到屏幕上,这个过程称为绘制(或重绘)。

  • 绘制过程

    • 浏览器将渲染树中的每个节点转换为屏幕上的实际像素。
  • 面试常见问题

    • 什么是绘制(Painting)?
    • 什么是重绘(Repaint)?如何避免?

总结

浏览器从输入 URL 到渲染出页面的过程涉及多个阶段,每个阶段都有其特定的任务和细节。在面试中,常见的问题包括:

  • DNS 解析的过程和缓存机制。
  • HTTP 缓存的机制和头部字段。
  • TCP 三次握手和 TLS 握手的过程。
  • HTTP 请求和响应的结构和常见方法。
  • DOM 树和 CSSOM 树的构建过程。
  • JavaScript 的执行过程和阻塞渲染。
  • 渲染树的构建、布局和绘制过程。

通过理解这些细节,可以更好地回答面试中的相关问题,并展示对浏览器工作原理的深入理解。


@@@@@@@@@@@@


 

1. 什么是 DNS 解析?

DNS 解析是将域名转换为 IP 地址的过程。浏览器需要通过 DNS 解析来找到服务器的 IP 地址,以便发送请求。

2. DNS 解析的过程是怎样的?

DNS 解析过程

  1. 浏览器缓存:浏览器首先检查自己的 DNS 缓存。
  2. 操作系统缓存:如果浏览器缓存中没有找到,浏览器会向操作系统查询 DNS 缓存。
  3. 路由器缓存:如果操作系统缓存中没有找到,操作系统会向路由器查询 DNS 缓存。
  4. ISP 缓存:如果路由器缓存中没有找到,路由器会向 ISP 的 DNS 服务器查询。
  5. 递归查询:如果 ISP 的 DNS 服务器中没有找到,DNS 服务器会进行递归查询,直到找到对应的 IP 地址。

3. DNS 缓存的层级有哪些?

DNS 缓存的层级

  1. 浏览器缓存
  2. 操作系统缓存
  3. 路由器缓存
  4. ISP 缓存

4. 什么是强缓存和协商缓存?

强缓存:浏览器直接从缓存中读取资源,不会向服务器发送请求。常见的 HTTP 头部字段有 Expires 和 Cache-Control

协商缓存:浏览器向服务器发送请求,服务器根据请求头部字段判断资源是否更新。如果资源未更新,服务器返回 304 状态码,浏览器从缓存中读取资源。常见的 HTTP 头部字段有 Last-Modified 和 ETag

5. 强缓存和协商缓存的区别是什么?

强缓存:浏览器直接从缓存中读取资源,不会向服务器发送请求。

协商缓存:浏览器向服务器发送请求,服务器根据请求头部字段判断资源是否更新。如果资源未更新,服务器返回 304 状态码,浏览器从缓存中读取资源。

6. 常见的 HTTP 缓存头部字段有哪些?

常见的 HTTP 缓存头部字段

  • Expires
  • Cache-Control
  • Last-Modified
  • ETag

7. 什么是 TCP 三次握手?

TCP 三次握手是建立 TCP 连接的过程,包括以下步骤:

  1. 客户端发送 SYN 包到服务器,表示请求建立连接。
  2. 服务器收到 SYN 包后,回复 SYN-ACK 包,表示同意建立连接。
  3. 客户端收到 SYN-ACK 包后,回复 ACK 包,表示确认建立连接。

8. TCP 三次握手的过程是怎样的?

TCP 三次握手的过程

  1. 客户端发送 SYN 包到服务器,表示请求建立连接。
  2. 服务器收到 SYN 包后,回复 SYN-ACK 包,表示同意建立连接。
  3. 客户端收到 SYN-ACK 包后,回复 ACK 包,表示确认建立连接。

9. 什么是 TLS 握手?

TLS 握手是建立安全连接的过程,包括以下步骤:

  1. 客户端发送 ClientHello 消息,包含支持的加密算法等信息。
  2. 服务器回复 ServerHello 消息,选择加密算法,并发送服务器证书。
  3. 客户端验证服务器证书,并生成会话密钥,发送给服务器。
  4. 服务器使用会话密钥加密通信。

10. TLS 握手的过程是怎样的?

TLS 握手的过程

  1. 客户端发送 ClientHello 消息,包含支持的加密算法等信息。
  2. 服务器回复 ServerHello 消息,选择加密算法,并发送服务器证书。
  3. 客户端验证服务器证书,并生成会话密钥,发送给服务器。
  4. 服务器使用会话密钥加密通信。

11. 常见的 HTTP 请求方法有哪些?

常见的 HTTP 请求方法

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD
  • OPTIONS
  • PATCH

12. HTTP 请求头部字段有哪些?

常见的 HTTP 请求头部字段

  • Host
  • User-Agent
  • Accept
  • Content-Type
  • Authorization
  • Cookie
  • Referer

13. GET 和 POST 请求的区别是什么?

GET 请求

  • 用于请求数据。
  • 参数包含在 URL 中。
  • 参数长度有限制。
  • 不安全,参数在 URL 中可见。

POST 请求

  • 用于提交数据。
  • 参数包含在请求体中。
  • 参数长度没有限制。
  • 相对安全,参数在请求体中不可见。

14. 常见的 HTTP 状态码有哪些?

常见的 HTTP 状态码

  • 200 OK:请求成功。
  • 301 Moved Permanently:永久重定向。
  • 302 Found:临时重定向。
  • 304 Not Modified:资源未修改。
  • 400 Bad Request:请求错误。
  • 401 Unauthorized:未授权。
  • 403 Forbidden:禁止访问。
  • 404 Not Found:资源未找到。
  • 500 Internal Server Error:服务器内部错误。

15. HTTP 响应头部字段有哪些?

常见的 HTTP 响应头部字段

  • Content-Type
  • Content-Length
  • Set-Cookie
  • Cache-Control
  • Expires
  • Last-Modified
  • ETag

16. 什么是 HTTP/2?它与 HTTP/1.1 的区别是什么?

HTTP/2 是 HTTP 协议的第二个主要版本,主要改进包括:

  • 多路复用:在一个 TCP 连接上可以发送多个请求和响应。
  • 头部压缩:使用 HPACK 算法压缩头部,减少传输数据量。
  • 服务器推送:服务器可以主动推送资源到客户端。
  • 二进制分帧:将数据分成二进制帧,提高传输效率。

17. 什么是 DOM?

DOM(Document Object Model) 是 HTML 和 XML 文档的编程接口,表示文档的结构。DOM 将文档表示为节点和对象,开发者可以通过编程语言操作这些节点和对象。

18. DOM 树的构建过程是怎样的?

DOM 树的构建过程

  1. 浏览器从上到下解析 HTML 文档。
  2. 遇到标签时,创建对应的 DOM 节点。
  3. 按照层级关系将节点添加到 DOM 树中。

19. 什么是 CSSOM?

CSSOM(CSS Object Model) 是 CSS 的编程接口,表示 CSS 样式表的结构。CSSOM 将样式表表示为节点和对象,开发者可以通过编程语言操作这些节点和对象。

20. CSSOM 树的构建过程是怎样的?

CSSOM 树的构建过程

  1. 浏览器解析 CSS 规则。
  2. 创建对应的节点。
  3. 按照层级关系将节点添加到 CSSOM 树中。

21. JavaScript 的执行过程是怎样的?

JavaScript 的执行过程

  1. 浏览器遇到 <script> 标签时,暂停 HTML 解析。
  2. 解析并执行 JavaScript 代码。
  3. JavaScript 代码可以操作 DOM 和 CSSOM,修改页面内容和样式。
  4. JavaScript 代码执行完毕后,继续解析 HTML。

22. 什么是阻塞渲染?如何避免?

阻塞渲染 是指浏览器在解析 HTML 时遇到 <script> 标签,会暂停 HTML 解析,直到 JavaScript 代码执行完毕。这会导致页面渲染延迟。

避免阻塞渲染的方法

  • 将 <script> 标签放在页面底部,确保 HTML 解析完成后再执行 JavaScript。
  • 使用 async 或 defer 属性加载外部脚本,异步执行 JavaScript。

23. 什么是渲染树?

渲染树(Render Tree) 是浏览器将 DOM 树和 CSSOM 树结合,构建的用于渲染页面的树结构。渲染树包含页面中可见的元素及其样式信息。

24. 渲染树的构建过程是怎样的?

渲染树的构建过程

  1. 浏览器将 DOM 树和 CSSOM 树结合。
  2. 创建渲染树节点,表示页面中可见的元素及其样式信息。
  3. 按照层级关系将节点添加到渲染树中。

25. 什么是布局(Layout)?

布局(Layout) 是浏览器根据渲染树计算每个元素的位置和大小的过程。布局过程也称为回流(Reflow)。

26. 什么是回流(Reflow)?如何避免?

回流(Reflow) 是浏览器重新计算元素的位置和大小的过程。回流会导致页面重新布局,影响性能。

避免回流的方法

  • 尽量减少对 DOM 的操作。
  • 批量修改 DOM,而不是逐个修改。
  • 使用 documentFragment 批量操作 DOM。
  • 使用 position: absolute 或 position: fixed 脱离文档流,减少对其他元素的影响。

27. 什么是绘制(Painting)?

绘制(Painting) 是浏览器根据布局结果,将每个元素绘制到屏幕上的过程。绘制过程也称为重绘(Repaint)。

28. 什么是重绘(Repaint)?如何避免?

重绘(Repaint) 是浏览器重新绘制元素的过程。重绘不会影响布局,但会导致页面重新渲染,影响性能。

避免重绘的方法

  • 尽量减少对样式的修改。
  • 批量修改样式,而不是逐个修改。
  • 使用 class 切换样式,而不是逐个修改样式属性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统&#xff0c;其核心设计理念是将一切资源抽象为文件&#xff0c;即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…

【蓝桥杯选拔赛真题85】python摆放箱子 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python摆放箱子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python摆放箱子 第十五届蓝桥杯青少年组python比赛选拔赛真题详细解析 一…

数据分析思维(六):分析方法——相关分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…

小程序中引入echarts(保姆级教程)

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

【SQLi_Labs】Basic Challenges

什么是人生&#xff1f;人生就是永不休止的奋斗&#xff01; Less-1 尝试添加’注入&#xff0c;发现报错 这里我们就可以直接发现报错的地方&#xff0c;直接将后面注释&#xff0c;然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…

基于JAVA+SpringBoot+Vue的校园二手书交易平台

基于JAVASpringBootVue的校园二手书交易平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; …

快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 1、滚动查询的使用场景 滚动查询区别于上一篇文章介绍的使用from、size分页检索&#xff0c;最大的特点是&#xff0c;它能够检索超过10000条外的…

【C++】深入理解 break 和 continue 语句

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;break 和 continue 介绍**break** 的作用**continue** 的作用注意事项 &#x1f4af;break 示例代码示例**执行结果****解析过程** &#x1f4af;continue 示例代码示例&am…

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及&#xff0c;即便是零编程基础或基础薄弱的用户&#xff0c;也可以借助AI完成许多技术任务。然而&#xff0c;要高效地使用AI完成编程任务&#xff0c;关键在于如何清晰表达需求&#xff0c;并逐步引导AI实现目标。 在本文中&#xff0c;我们将通过开发…

算法每日双题精讲 —— 滑动窗口(水果成篮,找到字符串中所有字母异位词)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…

基于Qt事件机制中的定时器事件的闹钟设计

目标 代码 pro文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …

后台管理系统DEMO

该项目后端使用SpringBootMyBatisPlusJWT&#xff0c;前端使用Vue3Vite2TSPiniaAxiosElementPlus等简单技术栈&#xff0c;实现了一个简约精致版的后台管理系统&#xff0c;包含非常基础的rbac权限功能&#xff0c;可以增删改查角色、用户、权限&#xff0c;角色添加权限、添加…

数据结构之线性表之链表(附加一个考研题)

链表的定义 链表的结构&#xff1a; 单链表-初始化 代码实现&#xff1a; 单链表-头插法 代码实现&#xff1a; 这里我给大家分析一下 我们每创建一个新的节点都要插在头节点的后面&#xff0c;我们一定要注意顺序 一定要先让新节点指向头节点指向的下一个节点&#xff0c;…

Python爬取城市天气信息,并存储到csv文件中

1.爬取的网址为&#xff1a;天气网 (weather.com.cn) 2.需要建立Weather.txt文件&#xff0c;并在里面加入如下形式的字段&#xff1a; 101120701济宁 101010100北京 3.代码运行后&#xff0c;在命令行输入Weather.txt文件中添加过的城市&#xff0c;如&#xff1a;济宁。 …

工厂+策略模式之最佳实践(疾病报卡维护模块API设计)

目录 &#x1f4bb;业务场景 &#x1f527;应用技术 ⚙概要流程 ❗开发注意 服务类上标注了 自定义注解 却无法直接利用getDeclaredAnnotation 获取 *Spring代理机制 代理机制的工作原理 代理的工作机制 代理的使用场景 已获取EmrXXXServiceImpl 的Class&#xff0c;…

【智行安全】基于Synaptics SL1680的AI疲劳驾驶检测方案

随著车载技术的快速进步&#xff0c;驾驶安全越来越受到重视&#xff0c;而疲劳驾驶是造成交通事故的重要原因之一。传统的驾驶监控技术因精度不足或反应迟缓&#xff0c;无法满足实时监测需求。因此&#xff0c;结合人工智能技术的疲劳驾驶检测系统成为行业新方向&#xff0c;…

Go-知识 注释

Go-知识 注释 行注释块注释包注释结构体&接口注释函数&方法注释废弃注释文档 在 go 语言中注释有两种&#xff0c;行注释和块注释 行注释 使用双斜线 // 开始&#xff0c;一般后面紧跟一个空格。行注释是Go语言中最常见的注释形式&#xff0c;在标准包中&#xff0c;…

2025年阿里云认证改版新消息!2025年阿里云认证考试内容有变!

阿里云认证已经确定在2025年要进行大改&#xff0c;这次改动幅度会比2023年改动更大&#xff0c;2023年主要改变是在考试题型上的变化&#xff0c;这次则主要是考试内容的变化了&#xff01; 2023年阿里云ACP认证考试的改版变化主要有&#xff1a; &#xff08;一&#xff09…

ArrayList 和LinkedList的区别比较

前言 ‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析&#xff0c;他们一个是Array&#xff08;动态数组&#xff09;的数据结构&#xff0c;一个是Linked&#xff08;链表&#xff09;的数据结构&#x…

STM32-笔记22-sg90舵机

一、接线 二、实验实现 动手让 SG90 每秒转动一下&#xff0c;0 -> 20 -> 40 -> 100 -> 180 如此循环。 舵机接A6 复制18-呼吸灯&#xff0c;重命名24-sg90舵机 把PWM重命名sg90 打开项目文件 在魔术棒和品上把PWM都去掉&#xff0c;加载sg90文件夹 加载之后…