面试官: 输入url到展示 的完整过程

当我们在浏览器地址栏输入一个 URL 并按下回车,页面加载的过程中会涉及多个关键步骤,包括 DNS 解析、TCP 连接、HTTP 请求、服务器处理、浏览器渲染 等。下面是详细的执行流程:


🔹 1. 用户输入 URL

用户在浏览器地址栏输入一个 URL,例如:

https://www.example.com
  • 如果 URL 没有协议(如 http:// 或 https://),浏览器会默认补充 http:// 或 https://

  • 如果只输入关键字(如 example),浏览器会使用默认搜索引擎查询。

  • 如果之前访问过,浏览器可能直接从缓存加载(强缓存 / 协商缓存)。


🔹 2. 浏览器进行 DNS 解析

目标:找到 www.example.com 对应的 IP 地址

浏览器首先检查是否已有缓存:

  1. 浏览器缓存(DNS 解析缓存)

  2. 操作系统缓存/etc/hosts 或 C:\Windows\System32\drivers\etc\hosts

  3. 路由器缓存(路由器可能有 DNS 解析缓存)

  4. ISP DNS 服务器(向本地 ISP 运营商的 DNS 服务器查询)

  5. 根 DNS 服务器 → 顶级域名服务器(TLD) → 权威 DNS 服务器,最终获取 IP 地址。

最终,www.example.com 被解析为 IP 地址,例如:

93.184.216.34

🔹 3. 建立 TCP 连接(三次握手)

目标:客户端与服务器建立可靠的 TCP 连接

浏览器通过 TCP 三次握手 与服务器建立连接:

  1. 客户端发送 SYN(请求建立连接)

  2. 服务器返回 SYN-ACK(确认连接请求)

  3. 客户端返回 ACK(连接建立)

如果是 HTTPS,还需要进行 TLS/SSL 握手

  • 服务器提供 SSL 证书,客户端验证证书有效性(防止中间人攻击)。

  • 双方协商加密算法,交换密钥,确保数据安全。


🔹 4. 发送 HTTP 请求

目标:浏览器请求服务器上的页面资源

浏览器向服务器发送 HTTP 请求,例如:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive

关键部分:

  • GET:请求方法(也可能是 POSTPUTDELETE)。

  • Host: www.example.com:服务器主机名(虚拟主机)。

  • User-Agent:浏览器信息。

  • Accept:告诉服务器客户端希望接收的资源类型。

  • Connection: keep-alive:保持 TCP 连接,避免重复建立连接。


🔹 5. 服务器处理请求

目标:服务器解析请求,并返回对应的 HTML 页面

服务器收到请求后,执行以下操作:

  1. 查找缓存(CDN / 服务器缓存 / 代理缓存)。

  2. 请求静态资源(如果请求的是 HTML、CSS、JS、图片)。

  3. 执行动态代码(如 PHP、Node.js、Python 生成 HTML)。

  4. 访问数据库(如 MySQL、MongoDB)查询数据并返回页面。

  5. 生成 HTTP 响应,例如:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Cache-Control: max-age=3600

并返回 HTML 内容。


🔹 6. 浏览器解析 HTML

目标:浏览器解析 HTML 结构,构建页面

浏览器解析 HTML 页面时,执行以下步骤:

  1. 解析 HTML,构建 DOM 树

  2. 解析 CSS,生成 CSSOM 树

  3. 解析 JavaScript

  • 如果 script 不是 async/defer,会 阻塞解析

  • async:异步加载并立即执行

  • defer:异步加载,等 HTML 解析完成后执行

合并 DOM 和 CSSOM,构建渲染树

计算布局(Layout)

  • 确定元素的大小、位置

绘制(Painting)

  • 将元素渲染到屏幕


🔹 7. 加载外部资源

目标:加载 CSS、JS、图片等外部资源

  • CSS:影响页面布局,会阻塞渲染(但不会阻塞 HTML 解析)。

  • JS

    • 可能修改 DOM(导致重排)。

    • async/defer 可优化加载顺序。

  • 图片、视频、字体

    • 通过 Lazy Loading 延迟加载,提高性能。


🔹 8. 浏览器渲染页面

最终,浏览器将渲染完成的页面 绘制到屏幕

  1. 栅格化(分成像素块)。

  2. 合成图层(不同层级合成)。

  3. GPU 加速(硬件加速渲染)。


🔹 9. 用户交互 & 浏览器事件

  • JS 监听用户事件(点击、滚动等)。

  • 浏览器根据用户操作重新渲染页面(如 requestAnimationFrame)。

  • 回流(Reflow)和重绘(Repaint)

    • 回流:布局改变(影响性能)。

    • 重绘:颜色、阴影等改变(较轻量)。


🚀 关键优化点

  1. 使用 CDN 加速(减少 DNS 解析时间)。

  2. 开启 HTTP/2(支持多路复用,减少 TCP 连接)。

  3. 开启 Gzip 压缩(减少 HTML/CSS/JS 体积)。

  4. 利用缓存Cache-ControlETag)。

  5. 减少 DOM 操作(避免回流、重绘)。

  6. 懒加载 & 代码拆分(按需加载资源)。


💡 总结:输入 URL 到页面展示的完整流程

步骤

过程

1. 输入 URL

用户在浏览器地址栏输入 URL

2. DNS 解析

获取域名对应的 IP 地址

3. TCP 连接

三次握手建立 TCP 连接(HTTPS 需要 TLS 握手)

4. 发送 HTTP 请求

浏览器向服务器请求 HTML 页面

5. 服务器处理请求

服务器查询数据库 / 读取缓存,并返回 HTML

6. 浏览器解析 HTML

解析 DOM、CSSOM、执行 JS,构建渲染树

7. 加载外部资源

加载 CSS、JS、图片等

8. 渲染页面

计算布局,绘制到屏幕

9. 用户交互

监听点击、滚动等事件,并更新 UI


🎯 面试官可能的追问

✅ 面试官:DNS 解析过程中有哪些优化手段?
回答

  • 使用 DNS 预解析<link rel="dns-prefetch" href="//example.com">)。

  • 使用 CDN,让用户访问最近的服务器。

  • 配置 本地 hosts 文件,减少 DNS 查询时间。

✅ 面试官:如何优化浏览器渲染性能?
回答

  • 减少回流(Reflow):避免频繁修改 DOM 结构。

  • 使用 requestAnimationFrame:优化动画流畅度。

  • 使用 will-change:让 GPU 预渲染关键元素。

✅ 面试官:为什么 JS 可能会阻塞页面渲染?
回答

  • JS 可能修改 DOM,浏览器必须先执行 JS,再继续解析 HTML。

  • 解决方案:使用 async/defer,或将 JS 放在 body 末尾。


💡 总结

输入 URL 到页面展示的过程涉及 DNS 解析、TCP 连接、HTTP 请求、服务器处理、浏览器解析和渲染等多个步骤。通过优化缓存、CDN、HTTP/2 和浏览器渲染策略,可以极大提高页面加载速度!🚀

最后:

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@大迁世界

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

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

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

打赏作者

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

抵扣说明:

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

余额充值