鲁斯前端布鲁斯前端

文章中英模式

布鲁斯前端面试题目 - 从输入网址到页面显示的过程

深入解析从浏览器输入URL到页面完全加载的完整过程,包含DNS查询、TCP连接、HTTP请求、渲染过程等环节,掌握前端面试中的网络与浏览器核心知识。

影片縮圖

懒得看文章?那就来看视频吧

从输入网址到页面显示的完整流程概述

当你在浏览器地址栏输入一个URL并按下Enter后,会经过以下主要阶段:

  1. 1. URL解析
  2. 2. DNS解析(域名 → IP地址)
  3. 3. 建立TCP连接
  4. 4. 发送HTTP请求
  5. 5. 服务器处理请求并返回HTTP响应
  6. 6. 浏览器解析HTML并请求其他资源
  7. 7. 浏览器渲染页面
  8. 8. 关闭连接
  ┌──────────────────────────────────────────────────┐
  │                                                  │
  │  1️⃣ URL解析                                      │
  │  https://example.com/page                       │
  │                                                 │
  │  2️⃣ DNS解析                                      │
  │  example.com ──> IP (93.184.216.34)            │
  │                                                 │
  │  3️⃣ TCP连接                                      │
  │  客户端 ⇄ 服务器 (三次握手)                       │
  │                                                 │
  │  4️⃣ HTTP请求                                     │
  │  GET /page HTTP/1.1 ──>                        │
  │                                                 │
  │  5️⃣ 服务器响应                                    │
  │  <── 200 OK + HTML内容                          │
  │                                                 │
  │  6️⃣ 请求其他资源                                  │
  │  获取 CSS/JS/图片                                │
  │                                                 │
  │  7️⃣ 渲染页面                                     │
  │  DOM ──> CSSOM ──> 渲染 ──> 布局 ──> 绘制        │
  │                                                 │
  │  8️⃣ 关闭连接                                     │
  │                                                 │
  └──────────────────────────────────────────────────┘

接下来我们会详细解释每个阶段发生的事情。

第一阶段: URL解析

浏览器首先解析URL的各个部分:

https://www.example.com:443/path/to/page?query=string#fragment
|-----||--------------||---||------------||-----------||----|
 协议     主机(域名)    端口    路径          查询参数    片段
  • 1. 协议(Protocol): http, https, ftp等
  • 2. 主机(Host): 域名或IP地址
  • 3. 端口(Port): 特定服务的通信端口(如HTTP默认80,HTTPS默认443)
  • 4. 路径(Path): 服务器上资源的路径
  • 5. 查询参数(Query string): 向服务器传递的参数
  • 6. 片段(Fragment): 页面内的锚点,仅浏览器使用不发送给服务器

第二阶段: DNS解析过程

DNS将网址(如www.example.com)转换为电脑能理解的IP地址(如192.168.1.1)。

DNS查询的顺序:

  1. 1. 浏览器缓存: 先看浏览器是否记住这个网址
  2. 2. 电脑缓存: 再看电脑是否记住
  3. 3. 路由器缓存: 再问家里的路由器
  4. 4. 网络供应商: 最后问网络供应商(ISP)
  5. 5. DNS服务器查询: 如果都没有,就向网络上的DNS服务器一层层查询

DNS解析需要时间,这就是为什么网站会使用CDN来加速这个过程。

第三阶段: 建立连接

找到IP地址后,浏览器需要与服务器建立连接:

TCP三次握手:

  1. 1. 第一次握手: 浏览器说「嗨,我想连接」
  2. 2. 第二次握手: 服务器回应「好的,我收到了,可以连接」
  3. 3. 第三次握手: 浏览器说「太好了,我们开始通讯吧」

HTTPS的安全握手:

如果是HTTPS网站,在TCP连接后还会进行安全握手:

  1. 1. 打招呼: 浏览器说「我能用这些加密方式」
  2. 2. 确认方式: 服务器选一种加密方式回应
  3. 3. 身份确认: 服务器出示「身份证」(数字证书)
  4. 4. 交换密钥: 双方协商出一把「密钥」
  5. 5. 开始加密: 之后的通讯都用这把密钥加密

这就像你和银行通话前,先确认对方真的是银行,然后用只有你们知道的暗号交谈,防止别人偷听。这也是为什么HTTPS比HTTP多花一点时间,但更安全。

第四阶段: 发送HTTP请求

TCP连接建立后,浏览器构造HTTP请求发送到服务器:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...
Accept: text/html,application/xhtml+xml,...
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Cookie: user_session=abc123; visit_count=5

HTTP请求包含:

  • 1. 请求行: 包含HTTP方法(GET, POST等)、请求路径和HTTP版本
  • 2. 请求头: 包含各种元数据如User-Agent, Accept等
  • 3. 请求体: GET通常无请求体,POST包含表单数据等
  • 4. Connection: keep-alive: 告诉服务器保持TCP连接开启,让多个HTTP请求共用同一连接。HTTP/1.1预设启用,无需配置。这减少了建立新连接的开销,加快页面加载速度。

第五阶段: 服务器处理请求并返回响应

服务器接收请求后:

  1. 1. 服务器解析HTTP请求
  2. 2. 执行必要的处理(查询数据库、处理业务逻辑等)
  3. 3. 组装HTTP响应并返回
HTTP/1.1 200 OK
Date: Mon, 23 May 2023 22:38:34 GMT
Server: Apache/2.4.52 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 138
Cache-Control: max-age=3600

<!DOCTYPE html>
<html>
<head>
  <title>Example Website</title>
</head>
<body>
  <h1>Hello, World!</h1>
  <!-- 页面内容 -->
</body>
</html>

HTTP响应包含:

  • 1. 状态行: HTTP版本、状态码和状态信息
  • 2. 响应头: 包含各种元数据
  • 3. 响应体: 包含实际的HTML内容或其他资源

第六阶段: 浏览器解析HTML并请求其他资源(CRP路径)

浏览器收到HTML后:

  1. 1. 解析HTML,构建DOM树
  2. 2. 遇到外部资源(CSS, JavaScript, 图片等)时发起新的HTTP请求
  3. 3. 解析CSS,构建CSSOM树
  4. 4. 执行JavaScript代码,可能会修改DOM和CSSOM

在这个过程中,浏览器可能会并行发起多个请求,但受到HTTP协议版本和浏览器限制:

  • 1. HTTP/1.1: 每个域名有6-8个并行连接限制
  • 2. HTTP/2: 单个连接可处理多个请求,大幅提高性能

第七阶段: 浏览器渲染页面(CRP路径)

所有必要资源加载后,浏览器进行渲染过程:

  1. 1. 计算样式: 结合DOM和CSSOM,确定每个节点的最终样式
  2. 2. 布局(Layout/Reflow): 计算每个元素在屏幕上的位置和大小
  3. 3. 绘制(Paint): 填充像素,绘制文字、颜色、图像等
  4. 4. 合成(Compositing): 将不同层合成到一起

这个过程非常复杂,现代浏览器会进行各种优化:

  • 1. 增量渲染: 不等所有资源加载完就开始渲染
  • 2. 分层渲染: 将页面分成多个层进行独立处理
  • 3. 硬件加速: 使用GPU加速某些渲染操作

第八阶段: 关闭连接

页面完全加载后,如果HTTP头中指定了"Connection: close",TCP连接会关闭,通过四次挥手过程:

如果使用HTTP/1.1的Keep-Alive机制或HTTP/2,连接可能保持打开状态以便复用,提高性能。

🔥 常见面试题目

(一) 简述从地址栏输入URL到页面显示的完整过程?

解答:完整过程包含以下关键步骤:

  +-------------+    +-------------+    +-------------+    +-------------+
  |   网络阶段  | -> |   响应阶段  | -> |   解析阶段  | -> |   渲染阶段  |
  +-------------+    +-------------+    +-------------+    +-------------+
  | 1. URL解析  |    | 1. 处理请求 |    | 1. 构建DOM  |    | 1. 样式计算 |
  | 2. DNS查询  |    | 2. 返回响应 |    | 2. 构建CSSOM|    | 2. 布局     |
  | 3. TCP连接  |    | 3. 接收数据 |    | 3. 执行JS   |    | 3. 绘制     |
  | 4. HTTP请求 |    |             |    |             |    | 4. 合成     |
  +-------------+    +-------------+    +-------------+    +-------------+

  流程顺序:
  输入URL ➜ URL解析 ➜ DNS查询 ➜ TCP连接 ➜ (HTTPS则加SSL/TLS) ➜ HTTP请求 ➜
  服务器处理 ➜ 返回响应 ➜ 解析HTML/CSS/JS ➜ 渲染页面 ➜ 页面交互

重点是理解这个过程涉及网络通信、服务器处理、浏览器解析与渲染四大阶段,每个阶段都有优化空间。

(二) 浏览器渲染过程中的关键路径是什么?如何优化?

解答:参考前端性能优化题目的 解释网页的渲染过程(CRP路径)

(三) HTTPS对比HTTP在这个过程中增加了哪些步骤?

解答:HTTPS在HTTP基础上增加了SSL/TLS握手过程,主要用于建立安全连接:

  客户端                                      服务器
    |                                            |
    |  -------- Client Hello --------------->   |  1. 发送支持的加密套件和随机数
    |                                            |
    |  <------- Server Hello ----------------   |  2. 回应选定套件、随机数和证书
    |                                            |
    |  -------- 验证+预主密钥 ------------->   |  3. 验证证书并发送加密的预主密钥
    |                                            |
    |  <------- 确认加密通信 ---------------   |  4. 双方生成会话密钥并确认
    |                                            |
    |  === 开始加密HTTP通信 ================>   |
    |  <=================================>      |

这个握手过程发生在TCP连接之后、HTTP请求之前,为通信提供加密保护和身份验证,有效防止中间人攻击。