从输入 URL 到页面展示完整流程示意图
从图中可以看出,整个过程需要各个进程之间的配合,所以在开始正式流程之前,我们还是先来快速回顾下浏览器进程、渲染进程和网络进程的主要职责。
- 浏览器进程主要负责用户交互、子进程管理和文件储存等功能。
- 网络进程是面向渲染进程和浏览器进程等提供网络下载功能。
- 渲染进程的主要职责是把从网络下载的 HTML、JavaScript、CSS、图片等资源解析为可以显示和交互的页面。因为渲染进程所有的内容都是通过网络获取的,会存在一些恶意代码利用浏览器漏洞对系统进行攻击,所以运行在渲染进程里面的代码是不被信任的。这也是为什么 Chrome 会让渲染进程运行在安全沙箱里,就是为了保证系统的安全。
从输入 URL 到页面展示
1.用户输入
当用户在地址栏上输入关键字后,浏览器进程会判断输入的是搜索内容还是URL
当用户敲下回车后,这意味着当前页面即将被替换成新页面,但是在这之前,浏览器还给了当前页面一个执行beforeunload事件的机会。
beforeunload事件允许页面在退出前做一个数据清空、询问用户是否要离开当前页面、页面可能还有一些未提交的表格等处理,用户可以取消导航,让浏览器不在做后续的流程
当页面没有监听到beforeunload事件或用户同意了跳转,那么浏览器就会进入到下图所示的状态
此时,页面的图标便进入了加载阶段,页面的内容还没有改变。
2.URL请求过程
浏览器进程通过进程间通信(IPC)将URL发送给网络进程,由网络进程来进行真正的网络请求,那具体流程是怎样的呢?
首先,网络进程会在缓存中查找有没有资源副本,如果有缓存,直接将缓存交给浏览器进程,如果没有,进行网络请求。在发起请求之前,网络进程会进行DNS解析,获取服务器的IP地址。如果请求协议是HTTPS,那么还需要建立TLS连接
接下来就是用IP地址+端口号建立TCP连接了,连接建立之后,浏览器会构建请求行、请求头等信息,并把该域名相关的Cookie等数据附加到请求头上,组成HTTP报文发送给服务器
服务器在收到HTTP报文后,根据请求信息生成响应报文,并发送给浏览器的网络进程,网络进程收到响应报文后,通过响应行、响应头的信息来解析响应体
(1)重定向
网络进程在接收到响应报文后,开始解析响应头,如果返回的状态码是301/302,那么说明服务器希望浏览器重定向到其他URL,这时网络进程会根据Location字段,重新发起HTTP/HTTPS请求,一切又重新开始了。
(2)响应数据类型处理
URL的请求数据类型有时是下载类型,有时又是一个HTML文档,那浏览器如何进行区分呢?
答案:Content-Type, 它告诉浏览器服务器返回的数据类型,浏览器依据Content-Type进行区分。
不同 Content-Type 的后续处理流程也截然不同。如果 Content-Type 字段的值被浏览器判断为下载类型,那么该请求会被提交给浏览器的下载管理器,同时该 URL 请求的导航流程就此结束。但如果是 HTML,那么浏览器则会继续进行导航流程。由于 Chrome 的页面渲染是运行在渲染进程中的,所以接下来就需要准备渲染进程了。
3.准备渲染进程
默认情况下,浏览器会为每一个新页面准备一个渲染进程,但有些情况下,多个页面共用同一个渲染进程
那什么情况下多个页面会同时运行在一个渲染进程中呢?
Chrome 的默认策略是,每个标签对应一个渲染进程。但如果从一个页面打开了另一个新页面,而新页面和当前页面属于同一站点的话(同一站点:协议+根域名 相同),那么新页面会复用父页面的渲染进程。官方把这个默认策略叫 process-per-site-instance。
渲染进程准备好后,还不能立刻渲染页面,因为响应数据还在网络进程里面,并没有提交给渲染进程,所以下一步进入了提交文档阶段
4.提交文档
所谓提交文档,就是浏览器进程将网络进程收到的HTML数据交给渲染进程,具体流程是这样的:
- 首先浏览器进程收到网络进程的响应头数据后,便向渲染进程发送【提交文档】的消息
- 渲染进程在收到【提交文档】的消息后,会和网络进程建立数据传输的通道
- 当文档数据传输完成之后,渲染进程发送【确认提交】的信息给浏览器进程
- 浏览器进程收到【确认提交】后,会更新界面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新 Web 页面。
5.渲染页面
一旦文档被提交,渲染进程便开始页面解析和子资源加载了,一旦页面渲染完成,渲染进程会发送一个消息给浏览器进程,浏览器进程收到消息后,会停止浏览器界面的加载动画。