输入URL后,浏览器发生了什么[Chrome 浏览器内部工作原理(二)]

2023年10月11日星期三


Chrome浏览器除了标签页之外的所有内容都由浏览器进程处理。浏览器进程有如 UI 线程这样的线程,它绘制浏览器的按钮和输入字段,网络线程处理网络堆栈以从互联网接收数据,存储线程控制对文件的访问等。当你将 URL 输入到地址栏时,你的输入由浏览器进程的 UI 线程处理。

输入URL后,浏览器发生了什么

步骤 1:处理输入

当用户开始在地址栏中输入内容时,UI 线程首先判断“这是搜索查询还是 URL?”在 Chrome 中,地址栏也是一个搜索输入字段,因此 UI 线程需要解析并决定是将你的输入发送到搜索引擎,还是发送到你请求的站点。

步骤 2:开始导航

当用户按下回车键时,UI 线程会发起网络调用以获取网站内容。在标签页的角落显示加载动画,网络线程会通过适当的协议,如 DNS 查找和建立 TLS 连接来处理请求。
此时,网络线程可能会收到服务器重定向头,如 HTTP 301。在这种情况下,网络线程会与 UI 线程通信,告知服务器正在请求重定向。然后,将发起另一个 URL 请求。

步骤 3:读取响应

一旦响应体(payload)开始到来,网络线程会检查流的前几个字节(如果需要的话)。响应的Content-Type头应该说明数据的类型,但由于它可能缺失或错误,这里会进行 MIME 类型嗅探。如果响应是 HTML 文件,则下一步是将数据传递给渲染进程,但如果它是 zip 文件或其他文件,那么这意味着它是一个下载请求,所以会将数据传递给下载管理器。
这是 SafeBrowsing 检查发生的地方。如果域名和响应数据似乎与已知的恶意网站匹配,则网络线程会发出警报以显示警告页面。此外,还会进行跨源读取阻止Cross Origin Read Blocking(CORB)检查,以确保敏感的跨站数据不会到达渲染进程。

步骤 4:找到渲染进程

一旦所有检查完成,并且网络线程确信浏览器应该导航到请求的网站,网络线程就会通知 UI 线程数据已准备好。UI 线程随后找到一个渲染进程来继续渲染网页。
由于网络请求可能需要几百毫秒才能得到响应,因此应用了一种优化来加快此过程。当 UI 线程在 步骤 2 向网络线程发送 URL 请求时,它已经知道它们要导航到哪个网站。UI 线程试图在并行于网络请求的情况下主动查找或启动一个渲染进程。这样,如果一切按预期进行,当网络线程接收到数据时,一个渲染进程已经处于待命状态。如果导航重定向跨站,则可能需要不同的进程,这种情况下待命进程可能不会被使用。

步骤 5:提交导航

现在数据和渲染进程已准备就绪,浏览器进程向渲染进程发送 IPC 以提交导航。它还传递数据流,以便渲染进程可以继续接收 HTML 数据。一旦浏览器进程收到渲染进程已提交确认,导航完成,文档加载阶段开始。
此时,地址栏已更新,安全指示器和网站设置 UI 反映了新页面的网站信息。标签页的会话历史将更新,因此后退/前进按钮将遍历刚刚导航到的网站。为了便于在关闭标签页或窗口时恢复标签页/会话,会话历史将存储在磁盘上。

步骤 6:初始加载完成

一旦导航被提交,渲染进程继续加载资源并渲染页面。一旦渲染进程“完成”渲染,它将发送一个 IPC 消息回浏览器进程(这是在页面上所有框架的 onload 事件都已触发并执行完毕之后)。此时,UI 线程停止在标签页上的加载动画。