【小结】从输入URL到页面显示发生了什么?(一)导航

本文总结从输入URL到页面显示的第一部分内容:导航(从用户发出URL请求到页面解析之前的过程)

基本概念

  • chrome浏览器包含5个进程:
    1. 浏览器进程:主要负责用户交互、子进程管理和文件储存等功能。
    2. 网络进程:面向渲染进程和浏览器进程等提供网络下载功能。
    3. 渲染进程:主要职责是把从网络下载的 HTML、JavaScript、CSS、图片等资源解析为可以显示和交互的页面。(为保证系统安全,渲染进程运行在安全沙箱中)
    4. 4.插件进程: 负责插件的运行,因插件易奔溃,所以需要通过插件进行来隔离,以保证插件进程奔溃不会对浏览器和页面造成影响。
    5. GPU进程: GPU的初衷时为了实现3D CSS的效果,只是随后网页/chrome的UI界面都选择GPU来绘制。

所以打开一个chrome页面至少包含四个进程:一个网络进程,一个浏览器进程,一个渲染进程以及一个GPU进程。

  • 默认情况下,chrome会为每个页面分配一个渲染进程,也就是说每打开一个新页面就会配套创建一个新的渲染进程。但是也有一些例外,例如从A页面打开B页面,如果A和B是同一站点,则会公用同一个渲染进程。同一站点(same-site)定义为根域名加上协议。

主要过程

【小结】从输入URL到页面显示发生了什么?(一)导航
从图中可以看出,整个过程需要各个进程之间的配合,这个过程可以大致描述为如下。

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

补充说明

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

    1. 如果是搜索内容,地址栏会使用浏览器默认的搜索引擎,来合成新的带搜索关键字的 URL。
    2. 如果判断输入内容符合 URL 规则,那么地址栏会根据规则,把这段内容加上协议,合成为完整的 URL。
      输入完成回车之后有一个beforeunload事件可询问用户是否离开当前页面。确认之后标签页上的图标进入加载状态。页面中的内容还是之前的。因为需要等待提交文档阶段,页面内容才会被替换。
  • url请求过程: 浏览器进程通过进程间通信(IPC)把URL请求发送至网路进程。在网络进程中发真正的请求流程。具体过程如下:

    1. 网络进程首先查找是否有本地缓存,如有,直接返回缓存,否则,进图网络请求流程:
    2. DNS解析,获取到IP地址
    3. 利用IP地址和服务器建立TCP链接,如果时HTTPS请求,那么还需要建立TLS链接。
    4. 建立连接之后,构建请求行,请求头等信息,并向服务器发送请求信息。
    5. 服务器收到请求信息之后,返回响应数据。等网络进程接收到响应行和响应头之后,就开始解析响应头的内容。
    6. 如果响应头中的状态码是301/302,说明需要重定向,网络进程从响应头的Location字段读取重定向的地址,发起新的请求。
    7. 如果响应头中的状态码是200,则继续处理该请求。根据Content-Type字段判断响应数据的类型
    8. 如果是application/octet-stream字节流类型,该请i去会被提交给浏览器的下载管理器进行下载,同时该URL请求的导航流程到此结束
    9. 如果是text/html HTML格式,浏览器会继续进行导航流程。
    10. 浏览器准备好渲染进程(新建/复用),渲染进程准备好之后,还不能立即进入文档解析状态,因为此时的文档数据还在网络进程中,并没有提交给渲染进程,所以下一步就进入了提交文档阶段。
    11. 所谓提交文档,就是指浏览器进程将网络进程接收到的 HTML 数据提交给渲染进程,具体流程是这样的:首先当浏览器进程接收到网络进程的响应头数据之后,便向渲染进程发起“提交文档”的消息;渲染进程接收到“提交文档”的消息后,会和网络进程建立传输数据的“管道”;等文档数据传输完成之后,渲染进程会返回“确认提交”的消息给浏览器进程;浏览器进程在收到“确认提交”的消息后,会更新浏览器界面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新 Web 页面。
    12. 导航流程结束,即将进入渲染流程。

参考文章: 04 | 导航流程:从输入URL到页面展示,这中间发生了什么?