导航流程:从输入URL到页面展示

今天我来说下整个导航流程,首先,我问个问题,看大家是否能详细回答——在浏览器中,从输入URL到页面展示,这中间发生了什么?

如果你能详细的回答,那么这篇文章对你来说,是小巫见大巫了。

首先,我们从图说起,看下图:
在这里插入图片描述
如果你看过我之前的文章《浅析Chrome浏览器的多进程架构》,那你肯定知道打开Chrome会有一个浏览器进程、一个网络进程和至少一个渲染进程存在。而在整个导航流程中,这些进程是相互配合的
整个流程包含了许多步骤,其中用蓝色背景标记的是比较核心的知识点。这个过程可以大致描述如下:

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

这其中,用户发出URL请求到页面开始解析的这个过程,就叫作导航

从输入URL到页面展示

下面我们详细分析下这些阶段。

1.用户输入

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

  • 如果是搜索内容,地址栏会使用浏览器默认的搜索引擎,来合成新的带搜索关键字的URL,这也是为什么我们搜索会常常跳到百度页面的原因。
  • 如果判断输入内容符合URL规则,比如输入的是www.taobao.com,那么地址栏会根据规则,把这段内容加上协议,合成完整的URL - https://www.taobao.com

当用户输入关键词并键入回车之后,这意味着当前页面即将要被替换成新的页面,不过在这个流程继续之前,浏览器还给了当前页面一次执行beforeunload事件的机会,beforeunload事件允许页面在退出之前执行一些数据清理操作,还可以向用户询问是否要离开当前页面,比如当前页面可能有未提交完成的表单等情况,因此用户可以通过beforeunload事件来取消导航,让浏览器不再执行后续的工作。
在这里插入图片描述
从图中可以看出,当浏览器刚开始加载一个地址之后,标签页上的图便进入了加载状态。但此时图中页面显示的依然是之前打开的页面内容,并没有立即替换为淘宝的页面。因为需要等待提交文档阶段,页面内容才会被替换。

2.URL请求过程

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

首先,网络进程会查找本地缓存是否缓存了该资源(由服务器响应头中的Cache-Control决定是否缓存该资源,Max-Age决定缓存时间,单位是秒)。如果有缓存资源,那么直接返回资源给浏览器进程;如果在缓存中没有查找到资源,那么直接进入网络请求流程。这请求的第一步就是进行DNS解析,以获取请求域名的服务器IP地址。如果请求协议是HTTPS,那么还需要建立TLS连接(以后会详细讲述HTTPS中TLS/SSL)。

接下来就是利用IP地址和服务器建立TCP链接。连接建立之后,浏览器端会构建请求行、请求头等信息,并把该域名相关的Cookie等数据附加到请求头中,然后向服务器发送构建的请求信息。

服务器接收到请求信息后,会根据请求信息生成响应数据(包括响应行、响应头和响应体等信息),并发给网络进程。等网络进程接收了响应行和响应头之后,就开始解析响应头的内容了。

(1)重定向

在接收到服务器返回的响应头后,网络进程开始解析响应头,如果发现返回的状态码是301或者302(可以通过crul工具查看),那么说明服务器需要浏览器重定向到其他URL。这时网络进程会从响应头的Location字段里面读取重定向的地址,然后再发起新的HTTP或HTTPS请求,一切又重头开始了。参考下图:
在这里插入图片描述
此图中返回的响应行中的状态码是301,表示要进行重定向,网络进程会请求Location中的地址,发起新一轮的URL请求。
在这里插入图片描述

此图中返回的响应行中的状态码是200,表示请求OK,可以继续往下进行处理该请求了。

(2)响应数据类型处理

URL请求的数据类型,有时候是一个下载类型(比如音频文件),有时候是HTML页面,浏览器是怎么区分的呢?

答案是Content-Type。Content-Type是HTTP头中一个非常重要的字段,它告诉浏览器服务器返回的响应体数据是什么类型,然后浏览器会根据Content-Type的值来决定如何显示响应体的内容。
在这里插入图片描述
此图中表示返回的数据类型是text/html,也就是HTML页面。
在这里插入图片描述
此图中表示返回的数据类型是application/octet-stream,表示是字节流类型,当做数据下载类型处理。

不同的Content-Type的后续处理流程也截然不同。如果Content-Type字段的值被浏览器判断为下载类型,那么该请求会被提交给浏览器的下载管理器,同时该URL请求的导航流程就此结束。

3.准备渲染进程

默认情况下,Chrome会为每一个页面分配一个渲染进程,也就是说,每打开一个新页面就会配套创建一个新的渲染进程。但是,也有一些例外。

(1)多个页面会同时运行在一个渲染进程中

同一站点:指根域名(不包括www这样的第一个字段,比如baidu.com)和协议都是相同的URL。

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

但是如果不是同一站点的话,Chrome会为新的页面分配新的渲染进程。

(2)强制创建新的渲染进程

如果从一个页面中通过a链接打开了属于同一站点的页面,但是a链接的rel属性值使用了noopener和onreferrer,即如下代码:

<a target="_blank" rel="noopner noreferrer" href="xxxx">test</a>

这个时候,Chrome会为新的页面分配一个新的渲染进程。

4.提交文档

所谓提交文档,就是指浏览器进程将网络进程接收到的HTML数据交给渲染进程,具体流程如下:

  • 首先当浏览器进程接收到网络进程的响应头数据之后,便向渲染进程发起 “提交文档” 的消息。
  • 渲染进程接收到 “提交文档” 的消息后,会和网络进程建立传输数据的 “管道”。
  • 等文档数据传输完成之后,渲染进程会返回 “确认提交” 的消息给浏览器进程。
  • 浏览器进程在收到 “确认提交” 的消息后,会更新浏览器界面状态,包括了安全状态、地址栏的URL、前进后退的历史状态,并更新Web页面。
    在这里插入图片描述
    这也解释了为什么在浏览器的地址栏里输入一个地址后,之前的页面没有立马消失,而是要加载一会儿才会更新页面。

到这里,一个完整的导航流程就 “走” 完了,之后就要进入渲染阶段。

5.渲染阶段

一旦文档被提交,渲染进程便开始页面解析和子资源加载了,之后的课程会讲解整个渲染流水线,喜欢此课程的朋友,请加个关注。

发布了10 篇原创文章 · 获赞 0 · 访问量 121

猜你喜欢

转载自blog.csdn.net/weixin_42071117/article/details/104660680
今日推荐