浏览器工作原理-导航流程

本文最后更新于:2020年11月26日 晚上

下面从一道常见的题目来开启浏览器工作原理之旅:用户输入URL到页面展示,这个过程发生了什么

浏览器架构

开始之前先了解一下浏览器的架构,此处以chrome为例。

单进程浏览器

早期chrome浏览器是单进程架构,所有的功能模块都运行在同个进程里,进程里面有浏览器主线程、网络线程、插件线程和其它线程。这么多个功能模块运行在同个进程里,当其中任何一个线程崩溃了,进程也会跟着崩溃,甚至导致浏览器也崩溃,这就导致了单进程浏览器不稳定不流程不安全。所以早期浏览器的体验也是比较差的。

多进程浏览器

08年chrome发布了多进程浏览器,那时的多进程架构主要有浏览器主进程、渲染进程和插件进程。而现在的浏览器架构有浏览器主进程渲染进程网络进程插件进程GPU进程等。简单了解下各进程的主要作用:

浏览器进程:主要负责用户交互、子进程管理和文件存储等;

网络进程:面向浏览器进程和渲染进程提供网络下载等功能;

渲染进程:负责将从网络下载的HTML、JavaScript、图片等资源解析成可以显示和交互的界面;

导航流程

用户从输入URL到页面渲染展示出来之前的过程就是导航流程。

用户输入

上面有提到各进程的主要功能,其中浏览器主进程用于处理用户交互,因此用户输入URL这个动作是发生在浏览器进程中,这里浏览器进程还有做一个处理,会自动识别用户输入的是搜索关键词还是URL,如果是搜索关键词会进行额外的处理并提交给搜索引擎,这里已经知道用户输入的是URL,则直接提交网络请求消息给网络进程。

URL请求过程

检查缓存

接下来就是页面资源请求过程。浏览器进程通过IPC将网络请求发给网络进程,网络进程接收到浏览器进程的请求后,这个时候并不会直接发起网络请求,而是先查看本地是否有缓存,如果本地有缓存,则直接返回缓存的资源给浏览器进程,没有缓存才发起网络请求,进入网络请求流程

网络请求

网络请求需要先进行DNS解析拿到IP地址,通过IP地址与服务器进行TCP三次握手连接。连接成功后浏览器向服务器发送构建的信息,服务器返回响应数据。

网络进程根据返回的响应数据,先进行重定向处理:判断返回的状态码是否是301或302,如果有则重定向,根据location字段重新发起新的网络请求。

如果返回200则继续流程,接着进行数据类型处理:返回的数据类型一般是HTML字节流,也有可能是下载文件,网络进程根据返回的Content-Type字段判断,如果是下载文件,则将该请求发给下载管理器,同时本次导航流程到此结束;如果是HTML字节流,则继续流程,浏览器进程开始准备渲染进程。

准备渲染进程

默认情况下chrome会为每个页面分配一个渲染进程,即每个标签页对应一个渲染进程。但当从当前页面打开新的页面,且两个页面是属于同一站点:即根域名和协议是一样的,则会共用同一个渲染进程。

渲染进程准备好之后,还不能马上进入解析文档阶段,因为此时文档数据还在网络进程中,因此下一步要进入提交文档阶段。

提交文档

这里的“文档”指的是服务器返回的响应数据。浏览器进程发送“提交文档”的消息给渲染进程,渲染进程接收到消息后与网络进程建立起传输数据的“管道”,等数据传输完成之后,渲染进程会返回“确认提交”的消息给浏览器进程,浏览器进程接收到消息后会更新浏览器界面状态,包括安全状态、地址栏URL、前进后退的历史状态并更新web界面。

到这里就走完了一个完整的导航流程,而页面的显示则需要下面的渲染阶段