在地址栏里输入一个 URL,到这个页面呈现出来,中间会发生什么?

本文详细介绍了从输入URL到浏览器渲染页面的完整过程,包括查找服务器IP、DNS解析、HTTP请求构造、TCP传输、DOM和CSSOM树构建、渲染优化及缓存策略。重点讨论了缓存控制、HTTP请求头以及浏览器对资源下载的限制,揭示了优化网页加载速度的关键点。

输入 url 后,首先需要找到这个 url 域名的服务器 ip,为了寻找这个 ip,浏览器首先会寻 找缓存,查看缓存中是否有记录,缓存的查找记录为:浏览器缓存---->系统缓存---->路由器缓存,缓存中没有则查找系统的 hosts 文件中是否有记录,如果没有则查询 DNS 服务 器,得到服务器的 ip 地址后,浏览器根据这个 ip 以及相应的端口号,构造一个 http 请 求,这个请求报文会包括这次请求的信息,主要是请求方法,请求说明和请求附带的数 据,并将这个 http 请求封装在一个 tcp 包中,这个 tcp 包会依次经过传输层,网络层, 数据链路层,物理层到达服务器,服务器解析这个请求来作出响应,返回相应的 html 给浏览器,因为 html 是一个树形结构,浏览器根据这个 html 来构建 DOM 树,在 dom 树的构建过程中如果遇到 JS 脚本和外部 JS 连接,则会停止构建 DOM 树来执行和下载 相应的代码,这会造成阻塞,这就是为什么推荐 JS 代码应该放在 html 代码的后面,之 后根据外部央视,内部央视,内联样式构建一个 CSS 对象模型树 CSSOM 树,构建完成 后和 DOM 树合并为渲染树,这里主要做的是排除非视觉节点,比如 script,meta 标签和 排除 display 为 none 的节点,之后进行布局,布局主要是确定各个元素的位置和尺寸,之后是渲染页面,因为 html 文件中会含有图片,视频,音频等资源,在解析 DOM 的过 程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一 般是 4-6 个,当然在这些所有的请求中我们还需要关注的就是缓存,缓存一般通过 Cache-Control、Last-Modify、Expires 等首部字段控制。 Cache-Control 和 Expires 的区别 在于 Cache-Control 使用相对时间,Expires 使用的是基于服务器 端的绝对时间,因为存 在时差问题,一般采用 Cache-Control,在请求这些有设置了缓存的数据时,会先 查看 是否过期,如果没有过期则直接使用本地缓存,过期则请求并在服务器校验文件是否修 改,如果上一次 响应设置了 ETag 值会在这次请求的时候作为 If-None-Match 的值交给 服务器校验,如果一致,继续校验 Last-Modified,没有设置 ETag 则直接验证 Last-Modified,再决定是否返回 304。

### 浏览器 URL 输入页面渲染的完整流程 当用户在浏览器地址栏输入URL并按下回车键后,一系列复杂的操作随即展开。以下是详细的处理过程: #### 1. DNS 查询 一旦接收到有效的URL请求,浏览器会先解析域名对应的IP地址。如果本地DNS缓存中不存在该记录,则发起DNS查询以获取服务器的具体位置信息[^2]。 #### 2. 建立TCP连接 通过三次握手建立与目标Web服务器之间的通信信道。对于HTTPS协议还需要额外完成SSL/TLS加密协商过程。 #### 3. 发送HTTP/HTTPS 请求 构建GET方法的数据包发送给远程主机上的指定端口,默认情况下HTTP使用80端口而HTTPS采用443端口。此阶段还包括设置必要的头部字段如User-Agent、Accept-Language等。 #### 4. 接收响应数据 服务器接收到来自客户端发出的请求之后返回相应的HTML文档以及其他资源文件(CSS样式表、JavaScript脚本)。这些内容通常被分割成多个分片传输回来,在网络状况良好时能够显著提高下载效率。 #### 5. 解析DOM树结构 随着首个字节到达,浏览器开始逐步解释标记语言定义的内容,并将其转换为内部表示形式——即Document Object Model (DOM)对象模型。与此同时还会启动对其他外部依赖项(图片链接、字体描述符)的新一轮异步加载工作。 #### 6. 构建渲染树 基于已有的DOM节点以及关联样式的计算结果形成可视化布局信息。值得注意的是,由于存在动态变化的可能性,某些部分可能暂时无法确定最终形态直到所有必需条件都满足为止。 #### 7. 绘制界面元素 按照上述步骤建立起完整的视觉呈现体系之前,还需经历一次或多次重绘(Repaints) 和 回流(Layout)[^1] 。前者仅涉及颜色属性改变而不影响几何尺寸;后者则意味着整个页面或者局部区域内的空间分配发生变化从而触发重新排列子组件的位置关系。 #### 8. 执行 JavaScript 脚本 在整个过程中间穿插着各种事件监听器注册动作,允许开发者编写交互逻辑控制程序行为。然而需要注意一点:出于性能考虑,现代浏览器往往采取延迟策略尽可能减少不必要的阻塞现象发生[^3]。 #### 9. 启动预加载和预渲染机制 针对未来可能出现的需求提前准备相关联的对象实例化副本放在后台默默运行等待时机成熟即可无缝切换过去继续前进。这类前瞻性措施有助于缩短实际感知时间差提升用户体验满意度水平。 ```javascript // 示例代码展示如何利用link标签实现预加载功能 <link rel="preload" href="/styles.css" as="style"> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yongqiang Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值