输入 URL 到页面渲染的整个流程

输入 URL 到页面渲染的整个流程

DNS

  • (Domain Name System)域名系统
  • DNS 的作用就是通过域名查询到具体的 IP。
  • TCP 握手之前就已经进行了 DNS 查询,这个查询是操作系统自己做的。当你在浏览器中想访问 www.google.com 时,会进行一下操作
    • 操作系统会首先在本地缓存中查询 IP
    • 没有的话会去系统配置的 DNS 服务器中查询
    • 如果这时候还没得话,会直接去 DNS 根服务器查询,这一步查询会找出负责 com 这个一级域名的服务器
    • 然后去该服务器查询 google 这个二级域名
    • 接下来三级域名的查询其实是我们配置的,你可以给 www 这个域名配置一个 IP,然后还可以给别的三级域名配置一个 IP

以上介绍的是 DNS 迭代查询,还有种,是递归查询,前者是客户端去做请求,后者是由系统配置的DNS服务器做请求,得到结果后将数据返回给客户端。

DNS是基于UDP做的查询

  • 接下来是TCP握手,应用层会发数据给传输层,这里TCP协议会指明两端的端口号,然后下发给网络层。网络层中的IP协议会确定IP地址,并且指示了数据传输中如何跳转路由器,然后包会被封装到数据链路层的数据帧结构中,最后就是物理层面的传输了

  • 数据在进入服务端之前,可能还会先经过负责负载均衡的服务器,它的作用就是将请求合理的分发到多台服务器上,这时假设服务端会响应一个 HTML 文件。

  • 首先浏览器会判断状态码是什么,如果是 200 那就继续解析,如果 400 或 500 的话就会报错,如果 300 的话会进行重定向,这里会有个重定向计数器,避免过多次的重定向,超过次数也会报错。

  • 浏览器开始解析文件,如果是 gzip 格式的话会先解压一下,然后通过文件的编码格式知道该如何去解码文件。

  • 文件解码成功后会正式开始渲染流程,先会根据 HTML 构建 DOM 树,有 CSS 的话会去构建 CSSOM 树。如果遇到 script 标签的话,会判断是否存在 async 或者 defer ,前者会并行进行下载并执行 JS,后者会先下载文件,然后等待 HTML 解析完成后顺序执行。

  • 如果以上都没有,就会阻塞住渲染流程直到 JS 执行完毕。遇到文件下载的会去下载文件,这里如果使用 HTTP/2 协议的话会极大的提高多图的下载效率。

  • CSSOM 树和 DOM 树构建完成后会开始生成 Render 树,这一步就是确定页面元素的布局、样式等等诸多方面的东西

### 浏览器 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值