一直都很想去了解关于浏览器工作原理相关的知识,却毫无头绪不知如何下手,想着带着问题去寻找答案,会比较符合我的学习之路。
有一道经典的面试题 —— 从输入URL到页面展示,这中间发生了什么?
本文就从此问开始,介绍基础知识,再逐步了解浏览器到底在此期间做了什么(以Chrome为例)。
进程与线程
打开一个页面,在任务管理器中看到许多进程
那么进程和线程是什么关系呢?我将进程比喻作工厂,线程就是工厂中的流水线。工厂可以选择同时开启多条流水线来处理订单——称为多线程并行处理。
这其中有许多特点需要注意:
- (线程与进程):一条线程奔溃,整个进程都会奔溃;多个线程共享进程的数据。
- (进程之间):进程之间不共享数据,但是可以通过一些机制通信。
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)。它们之间的协同操作、沟通,构成了我们解析文章问题的基础。
基于步骤,绘画了一张步骤草图。
-
首先浏览器会根据输入的内容,合成完整的URL。(不考虑搜索关键字情况)
-
接下来进入到页面资源请求阶段(默认请求的资源是HTML)。浏览器进程会通知网络进程发起网络请求,那就到了上面讨论的HTTP请求步骤。
-
在开启渲染进程前,会先检查其他渲染进程是否可以复用(如果请求的资源是同一域名下就可复用)。
-
响应数据处理完毕后,浏览器进程会通知渲染进程和网络进程建立数据通道。渲染进程拿完数据后会通知浏览器进程更新浏览器界面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新 Web 页面。
这也是为什么在输入url回车后还在原页面停留了一下,等一会才更新页面。
-
最后,渲染进程开始渲染页面。