经典面试题:从输入URL到页面展示,这中间发生了什么?

116 阅读4分钟

WechatIMG217.jpeg 一直都很想去了解关于浏览器工作原理相关的知识,却毫无头绪不知如何下手,想着带着问题去寻找答案,会比较符合我的学习之路。

有一道经典的面试题 —— 从输入URL到页面展示,这中间发生了什么?

本文就从此问开始,介绍基础知识,再逐步了解浏览器到底在此期间做了什么(以Chrome为例)。

进程与线程

打开一个页面,在任务管理器中看到许多进程

截屏2023-08-14 16.05.57.png

那么进程和线程是什么关系呢?我将进程比喻作工厂,线程就是工厂中的流水线。工厂可以选择同时开启多条流水线来处理订单——称为多线程并行处理。

这其中有许多特点需要注意:

  • (线程与进程):一条线程奔溃,整个进程都会奔溃;多个线程共享进程的数据。
  • (进程之间):进程之间不共享数据,但是可以通过一些机制通信。

HTTP请求

需要一部分计算机网络知识。

HTTP 是一种允许浏览器向服务器获取资源的协议,是 Web 的基础。

在了解HTTP请求具体步骤前,需要先了解HTTP请求报文格式。

请求行
请求方法URL版本协议
请求头
头部字段名
头部字段名
....
请求体
一些携带数据....

例子:

请求行:GET /list HTTP/1.1

请求头:

Accept-Encoding:gzip, deflate, br

Accept-Language:zh-CN,zh;q=0.9

Content-Length:563

Content-Type:application/json

浏览器端向服务器发起HTTP请求的步骤:

  • 首先构建请求行,服务器将通过请求行来得到浏览器的请求方法(POST/GET/....)、请求URL、以及请求的协议版本。

  • 在真正发送请求前,浏览器会先在浏览器缓存中查找是否有要请求的文件。当有时,浏览器会直接返回该副本的缓存资源,截断请求。

    第二次打开网站会快点的原因之一。

  • 根据目标IP和端口号来查找要访问的服务器地址。但是只有域名信息,所以需要IP与域名的映射关系,即DNS域名解析。经过解析后,找到目标地址。同样,浏览器也会缓存解析结果。等到下一次访问相同域名时,就可以直接从缓存中取。

    第二次打开网站会快点的原因之二。

  • 建立TCP连接(因为只是简要了解,这里就不做详细介绍)

  • 发送HTTP请求,将HTTP请求报文发送至服务器。

  • 服务器接受到HTTP请求报文并处理结束,返回响应报文。和请求报文一样,分为响应行(版本协议、状态码)、响应头、响应体。其中处理结果是由状态码来告诉浏览器。

  • 断开TCP连接。

这是一个普通的HTTP请求步骤,当然并不是全部。有时需要重定向,以及持久保持TCP连接。这些都是需求的拓展。

简要介绍了进程/线程、HTTP请求步骤,就可以开始解答 从输入URL到页面展示,这中间发生了什么?

从输入URL到页面展示,这中间发生了什么?

其中最需要关注的几个进程为浏览器进程、渲染进程、网络进程(Network Service)。它们之间的协同操作、沟通,构成了我们解析文章问题的基础。

基于步骤,绘画了一张步骤草图。

无标题-2023-05-17-2313.png

  • 首先浏览器会根据输入的内容,合成完整的URL。(不考虑搜索关键字情况)

  • 接下来进入到页面资源请求阶段(默认请求的资源是HTML)。浏览器进程会通知网络进程发起网络请求,那就到了上面讨论的HTTP请求步骤。

  • 在开启渲染进程前,会先检查其他渲染进程是否可以复用(如果请求的资源是同一域名下就可复用)。

  • 响应数据处理完毕后,浏览器进程会通知渲染进程和网络进程建立数据通道。渲染进程拿完数据后会通知浏览器进程更新浏览器界面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新 Web 页面。

    这也是为什么在输入url回车后还在原页面停留了一下,等一会才更新页面。

  • 最后,渲染进程开始渲染页面。