浏览器原理:从输入URL到页面展现,发生了什么?

167 阅读5分钟

这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

前导

  • 浏览器进程:负责用户交互、子进程管理和文件储存等功能。
  • 网络进程:负责向渲染进程和浏览器进程等提供网络下载功能。
  • 渲染进程:把从网络下载的代码、图片等资源解析为页面。 渲染进程的内容通过网络获取,因此会存在一些恶意代码利用浏览器漏洞对系统进行攻击,所以运行在渲染进程里面的代码是不被信任的。这也是为什么 Chrome 会让渲染进程运行在安全沙箱里,为了保证系统的安全。 image.png

步骤

  1. 浏览器进程接收到用户输入的 URL 请求,浏览器进程将该 URL 转发给网络进程。
  2. 在网络进程中发起真正的 URL 请求。
  3. 网络进程接收到了响应头数据,解析响应头数据,并将数据转发给浏览器进程。浏览器进程接收到网络进程的响应头数据
  4. 发送“提交导航 (CommitNavigation)”消息到渲染进程;渲染进程接收到“提交导航”的消息
  5. 开始准备接收 HTML 数据,接收数据的方式是直接和网络进程建立数据管道
  6. 渲染进程会向浏览器进程“确认提交”,这是告诉浏览器进程:“已经准备好接受和解析页面数据了”。
  7. 浏览器进程接收到渲染进程“提交文档”的消息之后,便开始移除之前旧的文档,然后更新浏览器进程中的页面状态。

导航:用户发出 URL 请求到页面开始解析的过程

具体分析

1. 用户输入

当用户在地址栏中输入一个查询关键字时,地址栏会判断输入的关键字是搜索内容,还是请求的 URL。

  • 搜索内容,地址栏会使用浏览器默认的搜索引擎,来合成新的带搜索关键字的 URL。
  • 判断输入内容符合 URL 规则,比如输入的是 time.geekbang.org,那么地址栏会根据规则,把这段内容加上协议,合成为完整的 URL,如 time.geekbang.org。

当用户输入关键字并键入回车后,当前页面即将要被替换成新的页面,在这个流程之前,浏览器还给了当前页面一次执行 beforeunload 事件的机会(beforeunload 事件允许页面在退出之前执行一些数据清理操作,询问是否要离开当前页面,可以通过 beforeunload 事件来取消导航)当前页面没有监听 beforeunload 事件或者同意了继续后续流程

将如图所示: image.png 当浏览器刚开始加载一个地址之后,标签页上的图标便进入加载状态。但此时图中页面显示的依然是之前打开的页面内容,并未替换为将要跳转的页面。到提交文档阶段,页面内容才会被替换。

2. URL 请求过程

进入页面资源请求过程。这时,浏览器进程会通过进程间通信(IPC)把 URL 请求发送至网络进程,网络进程接收到 URL 请求后,会在这里发起真正的 URL 请求流程。

首先,网络进程会查找本地缓存是否缓存了该资源

  • 有缓存资源,返回资源给浏览器进程
  • 没有查找到资源,进入网络请求流程。

(1)要进行 DNS 解析,以获取请求域名的服务器 IP 地址。如果请求协议是 HTTPS,那么还需要建立 TLS 连接。

(2)利用 IP 地址和服务器建立 TCP 连接。

(3)浏览器端会构建请求行、请求头等信息,并把和该域名相关的 Cookie 等数据附加到请求头中,然后向服务器发送构建的请求信息。

(4)服务器接收到请求信息后,会根据请求信息生成响应数据(包括响应行、响应头和响应体等信息),并发给网络进程。

(5)网络进程接收了响应行和响应头之后,就开始解析响应头的内容了。

3. 准备渲染进程

默认情况下,Chrome 会为每个页面分配一个渲染进程。但是,也有一些例外,浏览器会让同一站点的多个页面直接运行在同一个渲染进程中。

同一站点(same-site)

“同一站点”一般定义为根域名(例如,geekbang.org)加上协议(例如,https:// 或者 http://), 还包含了该根域名下的所有子域名和不同的端口,比如下面这三个:

Chrome 的默认策略是,每个标签对应一个渲染进程。但如果从一个页面打开了另一个新页面,而新页面和当前页面属于同一站点的话,那么新页面会复用父页面的渲染进程。官方把这个默认策略叫 process-per-site-instance。

4. 提交文档

浏览器进程将网络进程接收到的 HTML 数据提交给渲染进程。

具体流程

(1)当浏览器进程接收到网络进程的响应头数据之后,便向渲染进程发起“提交文档”的消息

(2)渲染进程接收到“提交文档”的消息后,会和网络进程建立传输数据的“管道”

(3)文档数据传输完成后,渲染进程会返回“确认提交”的消息给浏览器进程

(4)浏览器进程在收到“确认提交”的消息后,会更新浏览器界面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新 Web 页面。

当渲染进程确认提交之后,更新内容如下图所示:

image.png

5. 渲染阶段

渲染进程开始页面解析和子资源加载了。渲染进程会发送一个消息给浏览器进程,浏览器接收到消息后,会停止标签图标上的加载动画。如下所示:

image.png 渲染结束,一个完整的页面生成了。