不只是前端,后端、产品和测试也需要了解的浏览器知识(二)

目录标题

  • 一、业务系统呈现给用户的节点
    • 1. 输入 URL 并解析
      • 1.1 用户输入 URL 并按下回车键
      • 1.2 浏览器解析 URL
      • 1.3 DNS 解析
    • 2. 建立连接、发送请求并接收响应
      • 2.1 建立 TCP 连接
      • 2.2 发送 HTTP 请求
      • 2.3 服务器处理请求
      • 2.4 发送 HTTP 响应
      • 2.5 浏览器接收响应
    • 3. 解析和加载资源、渲染页面
      • 3.1 解析 HTML
      • 3.2 加载和执行资源
      • 3.3 渲染页面
    • 4. 用户交互
    • 5. 小结
  • 二、系统呈现过程中的技术点
    • 1. DNS解析优化
      • 1.1 启用 DNS 预解析
      • 1.2 DNS缓存优化
      • 1.3 负载均衡和冗余
      • 1.4 减少 DNS 查询次数
    • 2. http协议优化
      • 2.1 请求方法优化
      • 2.2 状态码优化
      • 2.3 请求头和响应头优化
      • 2.4 HTTP/2 和 HTTP/3 优化
    • 4. CDN优化
    • 5. 页面渲染时优化
      • 5.1 HTML 优化
      • 5.2 CSS 优化
      • 5.3 JavaScript 优化
      • 5.4 图像优化
      • 5.5 其他优化策略
    • 6. 小结
  • 三、总结

继上篇《不只是前端,后端、产品和测试也需要了解的浏览器知识(一)》介绍了浏览器的基本情况、发展历史以及市场占有率。
本篇文章将介绍浏览器基本原理。在掌握基本原理后,通过技术深入,在研发过程中不断创新,推动产品性能、用户体验的提升,来实现业务的增长,创造可持续的价值。

一、业务系统呈现给用户的节点

当用户访问我们的业务系统时,浏览器和服务器之间会进行一系列复杂的交互过程。浏览器整体的导航流程如下:

在这里插入图片描述

以下是用户从输入 URL 到看到业务系统页面的详细步骤:

1. 输入 URL 并解析

1.1 用户输入 URL 并按下回车键

用户在浏览器地址栏中输入业务系统的 URL,例如 https://www.businesssystem.com,并按下回车键。

1.2 浏览器解析 URL

浏览器解析输入的 URL,确定协议(如 HTTPS)、主机名(如 www.businesssystem.com)、端口号(如果有)、路径、查询参数等。

1.3 DNS 解析

在这里插入图片描述

浏览器需要将主机名转换为 IP 地址。这个过程称为 DNS 解析,通常包括以下步骤:

  • 浏览器首先检查本地 DNS 缓存,看看是否有对应的 IP 地址。
  • 如果本地缓存中没有,浏览器会向操作系统查询。
  • 操作系统会检查自己的缓存,并可能向本地的 DNS 服务器发出请求。
  • 本地 DNS 服务器可能会递归查询其他 DNS 服务器,直到找到对应的 IP 地址。

2. 建立连接、发送请求并接收响应

2.1 建立 TCP 连接

一旦获得了 IP 地址,浏览器会通过 TCP/IP 协议与服务器建立连接。对于 HTTPS,浏览器还会进行 SSL/TLS 握手,以建立安全连接。流程如下:

在这里插入图片描述

2.2 发送 HTTP 请求

连接建立后,浏览器会构建一个 HTTP 请求并发送给服务器。请求包括请求行(例如 GET /index.html HTTP/1.1)、请求头(如 User-Agent、Accept 等)以及可能的请求体(对于 POST 请求)。

2.3 服务器处理请求

服务器接收到请求后,会根据请求的内容进行处理:

  • 服务器解析请求,确定所需的资源(如 HTML 文件、图片、数据等)。
  • 服务器可能需要与后端数据库或其他服务进行交互,以生成响应内容。
  • 服务器构建 HTTP 响应,包括状态行(如 HTTP/1.1 200 OK)、响应头(如 Content-Type、Content-Length 等)和响应体(实际的页面内容)。

2.4 发送 HTTP 响应

服务器将构建好的 HTTP 响应发送回浏览器。

2.5 浏览器接收响应

浏览器接收到服务器的响应后,会根据响应头的信息处理响应体:

  • 如果响应是重定向(如 301 或 302),浏览器会根据Location 头再次发起请求。
  • 如果响应包含压缩内容(如 gzip),浏览器会解压缩。
  • 浏览器会根据 Content-Type 头确定如何处理响应体(如 HTML、CSS、JavaScript、图片等)。

发送请求和接受响应流程如下:

在这里插入图片描述

3. 解析和加载资源、渲染页面

3.1 解析 HTML

浏览器开始解析 HTML 文档,构建 DOM 树。解析过程中,浏览器会处理各种 HTML 标签,并根据需要发起其他请求(如 CSS、JavaScript、图片等)。

3.2 加载和执行资源

  • CSS:浏览器解析 CSS 文件并构建 CSSOM 树,与 DOM 树结合形成渲染树。
  • JavaScript:浏览器解析和执行 JavaScript 代码,可能会修改 DOM 树或 CSSOM 树。
  • 图片和其他资源:浏览器会异步加载这些资源,并在加载完成后进行渲染。

3.3 渲染页面

浏览器根据渲染树计算每个元素的布局(位置和大小),并将页面绘制到屏幕上。这个过程可能会涉及多次重绘和重排(reflow/repaint),尤其是在 JavaScript 修改 DOM 或 CSS 的情况下。

页面渲染流程如下:
在这里插入图片描述

4. 用户交互

页面加载完成后,用户可以与页面进行交互。浏览器会响应用户的操作(如点击、输入等),并可能通过 JavaScript 动态更新页面内容。

5. 小结

业务系统的呈现过程主要是:URL解析、与服务器建立连接、服务器处理请求并返回响应、下载和解析响应、页面渲染。

二、系统呈现过程中的技术点

1. DNS解析优化

1.1 启用 DNS 预解析

DNS 预解析(DNS Prefetching):浏览器在用户点击链接之前,提前解析该链接的域名,从而减少等待时间。

<link rel="dns-prefetch" href="//example.com">

1.2 DNS缓存优化

合理设置 DNS 记录的 TTL(Time-To-Live),使得 DNS 记录可以在客户端和中间缓存服务器上保存适当的时间,减少重复解析请求。

  • 对于不经常变化的记录,可以设置较长的 TTL 值(如 24 小时)。
  • 对于经常变化的记录,可以设置较短的 TTL 值(如几分钟到几小时)。

1.3 负载均衡和冗余

  • 负载均衡:使用 DNS 负载均衡技术,将流量分配到多台服务器上,防止单点故障。
  • 冗余配置:配置多个权威 DNS 服务器,确保在一个服务器故障时,其他服务器可以继续提供解析服务。

1.4 减少 DNS 查询次数

  • 合并资源:尽量将资源放在同一个域名下,减少跨域名的 DNS 查询次数。
  • 减少外部资源:尽量减少页面中引用的外部资源(如第三方脚本和样式),以减少额外的 DNS 查询。

2. http协议优化

2.1 请求方法优化

  • 使用合适的请求方法:确保使用正确的 HTTP 方法(GET、POST、PUT、DELETE 等)来表示操作的意图。例如,使用 GET 方法获取数据,使用 POST 方法提交数据。
  • 避免不必要的请求:合并请求,减少页面中的请求次数。例如,CSS 和 JavaScript 文件可以合并,图像可以使用精灵图(sprite)。

2.2 状态码优化

  • 正确使用状态码:确保服务器返回正确的 HTTP 状态码。例如,200 表示成功,404 表示资源未找到,500 表示服务器错误。
  • 重定向优化:减少重定向次数,避免不必要的 301 或 302 重定向。

2.3 请求头和响应头优化

  • 压缩传输内容:使用 Gzip 或 Brotli 压缩传输内容,减少传输数据量。
  • 缓存控制:使用缓存控制头(如 Cache-Control、Expires)来缓存静态资源,减少重复请求。
  • 内容安全策略(CSP):设置内容安全策略头,防止跨站脚本攻击(XSS)。
  • 减少头部大小:删除不必要的请求和响应头,减少头部大小,加快传输速度。

2.4 HTTP/2 和 HTTP/3 优化

  • a. 多路复用
    • 启用 HTTP/2 或 HTTP/3:这些协议支持多路复用,可以在一个 TCP 连接中同时发送多个请求和响应,减少延迟。
    • 减少域名分片:HTTP/2 和 HTTP/3 中,多路复用使得域名分片(将资源分布到多个子域名)不再必要,反而可能降低性能。
  • b. 头部压缩
    • 使用 HPACK(HTTP/2)或 QPACK(HTTP/3)头部压缩:这些协议支持头部压缩,减少传输的数据量。
  • c. 减少延迟
    • 使用优先级和依赖:HTTP/2 和 HTTP/3 支持请求优先级和依赖,确保关键资源优先加载。
    • 启用 QUIC 协议(HTTP/3):QUIC 协议基于 UDP,减少了连接建立的延迟,提供更快的传输速度。

4. CDN优化

  • 使用 CDN:将静态资源分发到全球各地的节点,减少用户访问的延迟。
  • 边缘计算:利用 CDN 的边缘计算能力,在靠近用户的节点上处理部分逻辑,减少服务器负载。
  • 静态资源托管:将静态资源(如图像、CSS、JavaScript)托管在 CDN 上,减少网络延迟,加快加载速度。

在这里插入图片描述

5. 页面渲染时优化

5.1 HTML 优化

a. 减少 DOM 复杂度

  • 简化 HTML 结构:减少嵌套层级,避免过度复杂的 DOM 结构。
  • 删除不必要的元素:移除无用的 HTML 标签和注释。

b. 延迟加载非关键内容

  • 使用 defer 和 async:对非关键 JavaScript 文件使用 defer 或 async 属性,避免阻塞页面渲染。
  • 懒加载图像和视频:使用 loading=“lazy” 属性或 JavaScript 实现懒加载,延迟加载视口外的图像和视频。

5.2 CSS 优化

a. 减少 CSS 文件大小

  • 压缩 CSS 文件:使用工具(如 CSSNano、CleanCSS)压缩 CSS 文件,减少文件大小。
  • 移除未使用的 CSS:使用工具(如 PurgeCSS)移除未使用的 CSS 规则。

b. 优化 CSS 加载

  • 使用外部样式表:将 CSS 放在外部样式表中,而不是内联样式,便于缓存和管理。
  • 放置 CSS 在 中: 确保 CSS 文件在 中加载,以便尽快渲染页面。
  • 避免 CSS 阻塞渲染:将关键 CSS 内联到 HTML 中,非关键 CSS 异步加载。

5.3 JavaScript 优化

a. 减少 JavaScript 文件大小

  • 压缩和混淆:使用工具(如 UglifyJS、Terser)压缩和混淆 JavaScript 文件,减少文件大小。
  • 移除未使用的代码:使用工具(如 Webpack 的 Tree Shaking)移除未使用的代码。

b. 优化 JavaScript 加载

  • 分离关键和非关键脚本:将关键脚本放在 中,非关键脚本放在页面底部或使用 defer 和 async。
  • 代码分割:使用 Webpack 等工具进行代码分割,按需加载模块。

c. 优化 JavaScript 执行

  • 减少重排和重绘:避免频繁操作 DOM,使用文档片段(Document Fragment)或虚拟 DOM 技术。
  • 使用节流和防抖:对高频率事件(如滚动、输入)使用节流(throttle)和防抖(debounce)技术,减少不必要的函数调用。
  • 减少 JavaScript 阻塞:避免长时间运行的 JavaScript 任务,使用 Web Workers 将复杂计算移到后台线程。

5.4 图像优化

a. 减少图像文件大小

  • 压缩图像:使用工具(如 ImageOptim、TinyPNG)压缩图像文件,减少文件大小。
  • 选择合适的格式:根据图像内容选择合适的格式(如 JPEG、PNG、WebP),WebP 通常比 JPEG 和 PNG 更小。

b. 优化图像加载

  • 使用响应式图像:使用 srcset 和 sizes 属性提供不同分辨率的图像,适应不同设备。
  • 懒加载图像:使用 loading=“lazy” 属性或 JavaScript 实现图像懒加载。

5.5 其他优化策略

a. 优化字体加载

  • 使用字体显示策略:使用 font-display 属性控制字体加载行为,避免字体闪烁(FOIT)和不可见文本(FOUT)。
  • 减少字体文件大小:使用子集化工具(如 Google Fonts 的子集化功能)只加载需要的字符集,减少字体文件大小。

6. 小结

在实际业务中我们需要针对页面呈现过程中的每一个节点,去制定不同的优化策略。

三、总结

本文主要介绍了业务系统呈现给用户所经历的各个节点,以及作为技术人能在各节点中进行优化的点, 通过这些技术优化点,在研发过程中不断创新,推动产品性能、用户体验的提升,来实现业务的增长,创造可持续的价值。

参考阅读
《浏览器工作原理与实践》
《一次完整的http请求过程》(https://www.cnblogs.com/bonne-chance/p/18137852)
《前端需要了解的CDN知识》(https://juejin.cn/post/6913704568325046279?searchId=202407292115041101A6E22E0045FF583A)

如果各位看官喜欢,留下你的的评论,留下你的赞👍🏻后续可以对浏览器深入分享。

最后欢迎大家交流学习,共同成长。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们处理,核实后本网站将在24小时内删除侵权内容。

在这里插入图片描述

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

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

相关文章

模拟算法(4)_外观数列

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(4)_外观数列 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目链…

golang学习笔记27-反射【重要】

本节也是GO核心部分&#xff0c;很重要。包括基本类型的反射&#xff0c;结构体类型的反射&#xff0c;类别方法Kind()&#xff0c;修改变量的值。 目录 一、概念&#xff0c;基本类型的反射二、结构体类型的反射三、类别方法Kind()四、修改变量的值 一、概念&#xff0c;基本…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

Linux忘记root用户密码怎么重设密码

直接说步骤&#xff1a; 1.重启客户机 2.在选择内核页面快速按e键&#xff0c;进入编辑模式 进入后应该是这个样子 在这里只能按上下键切换行 找到Linux16这里 3.按右方向键切换到行尾&#xff0c;也就是UTF-8处&#xff0c;在后面添加一个空格&#xff0c;然后加上这段话 …

【ubuntu】ubuntu20.04安装chrome浏览器

1.下载 https://download.csdn.net/download/qq_35975447/89842972 https://www.google.cn/chrome/ 2.安装 sudo dpkg -i google-chrome-stable_current_amd64.deb 3.使用

SkyWalking监控SQL参数

前言 SkyWalking可以记录每个请求中执行的所有SQL&#xff0c;但是默认情况下&#xff0c;SkyWalking不记录SQL参数导致使用起来不是很方便&#xff0c;每次都得看日志才能知道具体的参数。不过SkyWalking提供了一个配置参数&#xff0c;开启后&#xff0c;便可记录SQL执行的参…

【目标检测】yolo的三种数据集格式

目标检测中数据集格式之间的相互转换--coco、voc、yolohttps://zhuanlan.zhihu.com/p/461488682?utm_mediumsocial&utm_psn1825483604463071232&utm_sourcewechat_session【目标检测】yolo的三种数据集格式https://zhuanlan.zhihu.com/p/525950939?utm_mediumsocial&…

CNN模型对CIFAR-10中的图像进行分类

代码功能 这段代码展示了如何使用 Keras 和 TensorFlow 构建一个卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;用于对 CIFAR-10 数据集中的图像进行分类。主要功能包括&#xff1a; 加载数据&#xff1a;从 CIFAR-10 数据集加载训练和测试图像。 数据预处理&#…

解决:使用layui.treeTable.updateNode,更新表格数据后,done里面的事件丢失问题

1. 背景 在给树形表格添加行点击事件&#xff0c;并且只更新当前行数据。 treeTable.updateNode("SpeProjListId", result.LAY_DATA_INDEX, result);更新数据后&#xff0c;点击事件失效。 1. 给字段绑定事件&#xff1a; class"link_a link_style" , {…

企业级数据备份一般都是怎么做的?来唠唠嗑

小白最近去了很多企业看了一下他们的存储方案&#xff0c;基本上都是单硬盘数据存储&#xff0c;一个硬盘10TB&#xff08;实际可用8TB左右&#xff09;。 这些大概是大部分微小企业存储数据的办法&#xff0c;也是他们能想到的最好办法了吧。 截至2024年的今天&#xff0c;咱…

Web安全 - 安全防御工具和体系构建

文章目录 安全标准和框架1. 国内安全标准&#xff1a;等级保护制度&#xff08;等保&#xff09;2. 国际安全标准&#xff1a;ISO27000系列3. NIST安全框架&#xff1a;IDPRR方法4. COBIT与ITIL框架 防火墙防火墙的基本作用防火墙的三种主要类型防火墙的防护能力防火墙的盲区 W…

【蚂蚁HR-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

CSS | 面试题:你知道几种移动端适配方案?

目录 一、自适应和响应式 二、为什么要做移动端适配&#xff1f; 三、当前流行的几种适配方案 (1) 方案一&#xff1a;百分比设置&#xff08;不推荐&#xff09; (2) 方案二&#xff1a;rem 动态设置 font-size px 与 rem 的单位换算 手动换算 less/scss函数 webpac…

C0004.Qt中QComboBox设置下拉列表样式后,下拉列表样式无效的解决办法

问题描述 我们平时在使用Qt Creator对控件QComboBox的样式进行设置后&#xff0c;在运行程序启动界面时&#xff0c;发现设置的样式无效&#xff0c;效果如下&#xff1a; /* 设置下拉菜单框的样式 */ QComboBox QAbstractItemView {border: 1px solid rgb(161,161,161); /* …

TransFormer 视频笔记

TransFormer BasicsAttention单头注意力 single head attentionQ&#xff1a; query 查寻矩阵 128*12288K key matrix 128*12288SoftMax 归一 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/19e3cf1ea28442eca60d5fc1303921f4.png)Value matrix 12288*12288 MLP Bas…

【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发

注意 该接口的调用需要在开发者联盟申请设备基础信息权限与穿戴用户状态权限&#xff0c;穿戴用户状态权限还需获得用户授权。 实时查询穿戴设备可用空间、电量状态。订阅穿戴设备连接状态、低电量告警、用户心率告警。查询和订阅穿戴设备充电状态、佩戴状态、设备模式。 使…

基于大数据技术的颈椎病预防交流与数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【计算机网络】详解UDP协议格式特点缓冲区

一、UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度&#xff1b;如果16位UDP检验和出错&#xff0c;报文会被直接丢弃。 1.1、检验和出错的几种常见情况 数据传输过程中的比特翻转&#xff1a;在数据传输过程中&#xff0c;由于物理介质或网络设…

python-FILIP/字符串p形编码/数字三角形

一&#xff1a;FILIP 题目描述 给你两个十进制正整数 a,b​&#xff0c;输出将这两个数翻转后的较大数。 「翻转」在本题中的定义详见「说明 / 提示」部分。输入 第一行&#xff0c;两个十进制正整数 a,b。输出 第一行&#xff0c;a 和 b 翻转后的较大数。样例输入1 734 893 样…