经典面试题:从URL输入到页面展示经历了什么

148 阅读6分钟

前言

众所周知,这是一道经典面试题,他可以全面的考察面试者的浏览器知识掌握程度,网上也有很多关于它的答案,这篇文章就让我来带领大家重温一遍这个 知识点;

用户输入

首先,当用户在地址栏输入数据之后,浏览器会判断用户输入的是搜索内容还是请求的URL。

  • 如果是搜索内容,浏览器将使用 默认的搜索引擎,来合成带搜索关键字的URL。
  • 如果输入的内容是合URL规则的地址,那么地址栏会根据规则,给这段内容加上协议,合成完整的URL。

当用户输入关键字并键入回车键之后,这意味着当前页面即将被替换成新的页面,不过在这之前,浏览器还给了当前页面一次beforeunload事件的机会,beforeunload事件还允许页面再退出之前执行一次数据清理的操作,还可以询问用户是否确定离开,比如当前页面可能还有未提交完成的表单等情况,因此用户可以通过beforeunload事件来取消导航,让浏览器不在执行任何后续工作。

当当前页面没有监听beforeunload事件或者同意了继续后续流程,那么浏览器就进入了加载状态,但是此时页面还是原来的内容,并没有被立即替换,这是因为需要等到提交文档阶段,页面才会被替换。

URL请求过程

上面过程完成之后,便进入了页面资源请求过程,这时浏览器进程会通过进程间通信(IPC)机制,把URL请求发送至网络进程,网络进程接收到URL请求之后,会在这里发起真正的URL请求流程,具体流程如下:

首先,网络进程会查找本地缓存是否缓存了该资源,如果有则直接返回该资源给浏览器进程,如果没有那就直接进入网络请求流程;

请求的第一步是要进行DNS解析,以获取请求域名的IP地址,如果请求协议是HTTPS协议,那么还需要建立TLS连接。

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

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

重定向

在接收到服务器返回的响应头后,网络进程就开始解析响应头,如果发现返回的状态码是301或者302,那么说明服务器需要浏览器重定向到其他URL。这是网络进行会从响应头的Location字段里面读取重定向的地址,然后重新发起HTTPS或者HTTP请求,然后重头开始上面的流程。

我们可以使用curl -I + URL的命令查看接收服务器返回的响应头信息。如下图所示是掘金的响应头信息:

curl -I http://juejin.cn/

image.png 由上图可以看出,掘金的服务器会通过重定向将HTTP请求转换成HTTPS请求,也就是说当你使用http向掘金服务器发起请求时,服务器会返回一个状态码为301或者302的响应头,并把Location字段中字段填到地址栏上,这就相当于告诉了浏览器要重新导航到新的地址栏上。

当再一次发起请求后,就会返回一个状态码是200的响应头,这就告诉浏览器一切正常,可以继续往下处理改请求了;

响应数据类型处理

在处理了跳转信息之后,URL获取到请求数据之后,资源的数据类型也有很多种,有时候是会下载类型,有时候又是正常的HTML页面,你们浏览器如何区分它们呢?

答案是Content-Type。Content-Type是HTTP头中的一个非常重要的字段,他会告诉浏览器服务器返回的响应体数据是什么类型,然后浏览器会根据Content-Type的值来决定如何显示响应体的内容。比如Conten-Type字段的值如果是text/html,这就是告诉浏览器,服务器返回的数据是HTML格式。如果是applicantion/octet-stream则告诉浏览器返回的数据类型是字节流 类型,通常情况下浏览器会按照下载类型来处理该请求。

到这里,数据的获取就完成了,接下来就需要准备渲染进程了。

准备渲染过程

默认情况下,浏览器会为每个页面分配一个新的渲染进程,但是如果新打开的页面与当前页面是同一站点,同一站点的意思就是当两个页面的根域名,协议相同,其子域名和端口可以不一致。那此时新的页面就会沿用父页面的渲染进程。

渲染进程准备好之后,还不能立即进入文档解析阶段,因为此时的文档数据还在网络进程中,并没有提交给渲染进程,所以下一步就进入提交文档阶段。

提交文档

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

  • 首先,当浏览器进程收到网络进程的响应头数据之后,便向渲染进程发起'提交文档'的消息;
  • 渲染进程接收到'提交文档'的消息后,便和网络进程建立数据传输的'管道';
  • 等数据传输完成之后,渲染进程会将'确认提交'的消息发给浏览器进程;
  • 浏览器进程在收到'确认提交'的信息后,会更新页面的状态,包括了安全状态,地址栏的URL,前进后退的历史状态,并更新web页面;

这也就解释了为什么在浏览器的地址栏里面输入了一个地址之后,之前的页面并没有立马消失,而是要加载一会儿才会更新页面;

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

渲染阶段

一旦文档被提交,渲染进程就开始页面解析和子资源加载了,因为页面加载的内容比较多,所以在后面的文章进行讲解,我们只需要知道,一旦页面生成,渲染进程就会发送一个消息给浏览器进程,浏览器接收到消息之后,会停止标签图标上的加载动画。

总结

以上,就是浏览器从URL输入到页面展示所发生的的所有事情啦,可以看出,这里面的细节还是很多的,希望大家看完文章后都能有个深刻的印象,感谢阅读!