当前位置: 首页 > news >正文

浏览器的奇幻之旅:从输入网址到页面出现的幕后故事

今天主打拆解浏览器解析地址及渲染页面,为了方便我本人和大家理解,会借用一些比喻,让过程更加清晰,好的,马上开始喽!

想象一下,你在浏览器地址栏输入了一个网址,按下回车的瞬间,一场惊心动魄的数字冒险就开始了!浏览器就像一位英勇的骑士,带着你穿越互联网的迷雾,最终把精美的网页呈现在你眼前。今天,我们就来揭秘这场冒险的全部过程,看看浏览器是如何一步步把网址变成你看到的页面的。

开局附上一张图,不想看文字的,直接看图

第一步:打电话问地址(DNS 解析)

当你输入网址(比如www.example.com)时,浏览器首先需要知道这个网址对应的服务器在哪里。这就像你要寄快递,得先知道收件人的地址一样。这个过程叫做 DNS 解析,也就是把域名转换成 IP 地址。

浏览器会先检查自己的 “小本本”(DNS 缓存),看看有没有这个网址的记录。如果没有,它会像个好奇宝宝一样,依次询问系统缓存、路由器缓存、ISP(网络服务提供商)的 DNS 服务器,甚至进行全球递归搜索,直到找到正确的 IP 地址。这个过程可能需要几毫秒到几秒不等,不过现代浏览器的缓存机制已经优化得很好了,大部分时候都能快速找到地址。(本质上是去找ip地址,因为IP地址很难记,所以有了域名解析

第二步:建立快递通道(TCP 连接)

有了 IP 地址,浏览器就可以和服务器建立连接了。这个过程就像搭建一条快递通道,确保数据能安全、有序地传输。TCP 协议采用 “三次握手” 的方式来建立连接:

  1. 第一次握手:浏览器向服务器发送一个 “你好” 的信号(SYN 包),告诉服务器它想建立连接。
  2. 第二次握手:服务器收到后,回复一个 “我收到了” 的信号(SYN+ACK 包),同时也向浏览器发送一个 “你好”。
  3. 第三次握手:浏览器确认服务器的回复,发送一个 “确认收到” 的信号(ACK 包),至此连接建立成功。

通过这三次握手,浏览器和服务器就像两个初次见面的朋友,确认了彼此的身份和意图,准备开始愉快地交流。

第三步:发送快递订单(HTTP 请求)

连接建立后,浏览器就可以向服务器发送请求了。这个请求就像你在快递单上填写的信息,告诉服务器你想要什么资源(比如 HTML 页面、CSS 样式、图片等)。HTTP 请求报文包含请求行、请求报头和请求正文三部分,其中请求行指定了请求方法(如 GET、POST)和资源路径,请求报头包含了一些附加信息(如缓存策略、用户代理等)。

服务器收到请求后,会根据请求的内容进行处理,并返回一个 HTTP 响应。响应报文同样包含状态码、响应报头和响应正文,状态码告诉浏览器请求是否成功(如 200 表示成功,404 表示未找到资源)。

第四步:解析 HTML:构建页面骨架

浏览器拿到 HTML 文件后,就开始像建筑师一样,用这些代码构建页面的骨架 ——DOM 树。DOM(Document Object Model)是文档对象模型,它将 HTML 中的标签、属性和内容转化为一个树形结构,每个节点代表一个 HTML 元素。

在解析 HTML 的过程中,浏览器会遇到 CSS 和 JavaScript。这时候,它会像一个谨慎的管家,先处理 CSS,因为 CSS 会影响页面的样式和布局。如果遇到外部 CSS 文件,浏览器会暂停 HTML 解析,先下载并解析 CSS 文件,这就是所谓的 “CSS 阻塞渲染”。而 JavaScript 则更霸道,它会完全阻塞 HTML 解析,直到脚本下载并执行完毕,因为 JavaScript 可能会修改 DOM 结构,影响后续的解析和渲染。

实际案例:CSS 阻塞导致的白屏
假设你正在访问一个新闻网站,页面中有一个超大的 CSS 文件负责全站样式。当浏览器下载这个 CSS 文件时,页面会一直处于空白状态,直到 CSS 完全加载并解析完成。例如,纽约时报网站曾因 CSS 加载缓慢导致页面出现 “内容样式短暂失效”(FOUC),用户只能看到无样式的原始内容,直到 CSS 就位。现代浏览器通过媒体查询优化,例如将打印样式表标记为media="print",使其不阻塞屏幕渲染,从而减少首屏白屏时间。

第五步:渲染树构建:给骨架穿上衣服

CSS 解析完成后,浏览器会构建 CSSOM(CSS Object Model),即 CSS 对象模型。CSSOM 描述了页面的样式信息,包括元素的颜色、字体、布局等。然后,浏览器将 DOM 树和 CSSOM 合并成渲染树,这个渲染树只包含可见的元素(比如 display: none 的元素不会被包含)。

渲染树构建完成后,浏览器会进行布局计算(Layout),确定每个元素在页面上的位置和尺寸。这就像设计师在设计图纸上标注每个家具的位置一样。布局计算完成后,浏览器会进行绘制(Painting),将每个元素的视觉属性(如颜色、边框、阴影等)绘制到屏幕上。最后,浏览器会进行合成(Composite),将不同的图层合并成最终的页面,这个过程由 GPU 加速,确保页面的流畅显示。

实际案例:JavaScript 阻塞导致的页面冻结
想象你在一个电商网站点击 “立即购买” 按钮时,页面突然卡住了 —— 按钮无法点击,滚动也失效。这可能是因为按钮的点击事件绑定了一个耗时的 JavaScript 循环。例如,一段包含千万次迭代的for循环会完全阻塞主线程,导致页面无响应。现代浏览器通过异步编程(如setTimeoutWeb Workers)将任务分解,避免主线程被占用,确保用户交互的流畅性。

第四和第五其实也可以说是一步,一大步,都是在请求回来服务器资源之后,进行页面的一个渲染。

  1. DOM树构建:解析HTML标签生成文档对象树

  2. CSSOM构建:解析样式表生成CSS对象模型

  3. 渲染树合成:合并DOM和CSSOM,过滤不可见元素,生成建设蓝图

  4. 布局计算:精确计算每个元素的坐标尺寸(重排阶段)

  5. 绘制上色:将布局转化为屏幕像素(重绘阶段)

  6. 合成层优化:使用GPU加速合成,像全息投影般高效呈现

第六步:优化与缓存:提升用户体验

在整个过程中,浏览器会采取各种优化策略来提升性能:

  • 预加载:通过<link rel="preload">标签,浏览器可以提前加载关键资源(如字体、图片),减少后续的等待时间。
  • 缓存机制:浏览器会缓存 DNS 记录、HTTP 响应等资源,避免重复请求。强缓存(Expires/Cache-Control)和协商缓存(Last-Modified/ETag)可以有效减少服务器压力和网络延迟。
  • 异步加载:使用 async 或 defer 属性,让 JavaScript 脚本异步加载,避免阻塞页面渲染。async 属性允许脚本在加载完成后立即执行,而 defer 属性会延迟脚本执行,直到 HTML 解析完成。
  • GPU 加速:现代浏览器利用 GPU 进行分层合成和硬件解码,提升渲染性能。例如,Chrome 的分层合成技术可以只更新变动的部分,减少 GPU 计算负担。

实际案例:图片懒加载拯救购物车
某电商网站的商品列表包含数百张图片,导致首屏加载时间超过 5 秒,用户流失率飙升。通过懒加载优化后,页面仅在图片进入可视区域时才加载真实图片,首屏加载时间降至 1.5 秒。例如,淘宝商品列表使用占位图占位,滚动时动态加载真实图片,既节省流量又提升体验。

实际案例:预加载字体消除文字闪烁
一个博客网站使用了自定义字体,但用户反馈页面加载时文字会先显示默认字体,再突然切换为自定义字体。通过预加载字体技术,浏览器提前下载字体文件并等待其加载完成后再显示文本,彻底消除了字体闪烁问题。例如,使用FontFaceObserver库检测字体加载状态,确保文字渲染的一致性。

第七步:连接结束:挥手告别

当页面渲染完毕,浏览器会与服务器断开连接,释放资源。这个过程叫做四次挥手,类似于 TCP 连接的三次握手,但更复杂一些。四次挥手确保数据传输完毕后,双方都能优雅地关闭连接。

下次当你在浏览器中打开一个网页时,不妨想象一下这场奇幻之旅,感受一下浏览器背后的技术魅力吧!

http://www.xdnf.cn/news/529849.html

相关文章:

  • ISO 26262-5 硬件详细设计
  • RV1126多线程获取SMARTP的GOP模式数据和普通GOP模式数据
  • 如何用体育数据做分析:从基础统计到AI驱动的决策科学
  • DB31/T 1545—2025《卫生健康数据分类分级要求》上海地方标准全面解析与未来对医院数据管理以及数据编程影响
  • gtest 库的安装和使用
  • 【保姆级】Nginx简介以及安装
  • vue3中element-plus修改el-tooltip的宽度
  • vue2使用three.js实现一个旋转球体
  • AI自媒体封面生成系统
  • c++字符串常用语法特性查询示例文档(二)
  • HarmonyOS开发样式布局
  • web常见的攻击方式
  • UniApp 实现的文件预览与查看功能#三方框架 #Uniapp
  • 阻塞队列:线程安全与生产者消费者模型解析
  • nginx 流量控制
  • map与set封装
  • Web安全基础
  • 十三、面向对象底层逻辑-Dubbo序列化Serialization接口
  • MacBook连接不上星巴克Wi-Fi的解决方法
  • 《Effective Python》第三章 循环和迭代器——在遍历参数时保持防御性
  • 江协科技EXTI外部中断hal库实现
  • 需求频繁变更?AI 驱动的自动化解决方案实践
  • 企业销售管理痛点解析与数字化解决方案
  • Unity 如何使用Timeline预览、播放特效
  • 第十六届蓝桥杯复盘
  • C#中的ThreadStart委托
  • 软件架构风格系列(7):闭环控制架构
  • 基于不透光法的柴油机排放精准监测
  • Android13 以太网(YT8531)
  • 【JavaScript】用 Proxy 拦截对象属性