在浏览器中输入URL到显示主页的过程?

首先推荐一篇经典的文章:深入理解现代浏览器
从发起 URL 请求开始,到首次显示页面的内容,在视觉上经历的三个阶段
第一个阶段,等请求发出去之后,到提交数据阶段,这时页面展示出来的还是之前页面的内容。(影响因素:网络)
第二个阶段,提交数据之后渲染进程会创建一个空白页面,显示空白页面的时间称为解析白屏,并等待 CSS 和 JavaScript 文件的加载完成,生成 CSSOM 和 DOM,然后合成布局树,最后还要经过一系列的步骤准备首次渲染。(通常情况下的瓶颈主要体现在下载 CSS 文件、下载 JavaScript 文件和执行 JavaScript。策略:前端性能优化——优化首次页面渲染
第三个阶段,等首次渲染完成之后,就开始进入完整页面的生成阶段了,然后页面会一点点被绘制出来。
从输入 URL 到页面展示完整流程示意图
在这里插入图片描述
整个过程需要三个进程(分别是浏览器进程、网络进程、渲染进程)之间的配合,配合过程如下:

  1. 首先,浏览器进程接收到URL请求,将该URL转发给网络进程
  2. 在网络进程中发起真正的URL请求
  3. 网络进程接收到了响应头数据,便解析响应头数据,并把数据转发给浏览器进程
  4. 浏览器进程接收到网络进程的响应头数据后,发送“提交导航”消息到渲染进程(用户发出URL 请求到页面开始解析的这个过程,就叫做导航
  5. 渲染进程接收到“提交导航”消息以后,开始准备接收HTML数据,接收数据的方式是直接和网络进程建立数据管道
  6. 最后渲染进程会向浏览器进程“确认提交”,告诉浏览器进程:已经准备好接收和解析页面数据了
  7. 浏览器进程接收到渲染进程“提交文档”的消息以后,便开始移除之前旧的文档,然后更新浏览器进程中的页面状态。

回到问题,在浏览器中输入URL到显示主页的过程
整个过程需要浏览器进程、渲染进程、网络进程之间的配合,我把这个过程分为四个阶段来阐述,分别是:用户输入阶段、url请求阶段、提交文档阶段、渲染阶段。
一、用户输入

  1. 合成URL(用户输入URL,浏览器会根据用户输入的信息判断是搜索还是网址,如果是搜索内容,就将搜索内容+默认搜索引擎合成新的URL;如果用户输入的内容符合URL规则,浏览器就会根据URL协议,在这段内容上加上协议合成合法的URL)
  2. 按下回车(当用户键入回车之后,意味着当前页面即将要被替换成新的页面,不过在这个流程继续之前,浏览器还给了当前页面一次执行 beforeunload 事件的机会,beforeunload 事件允许页面在退出之前执行一些数据清理操作,还可以询问用户是否要离开当前页面,因此用户可以通过 beforeunload 事件来取消导航,让浏览器不再执行任何后续工作。当前页面没有监听 beforeunload 事件或者同意了继续后续流程,浏览器导航栏显示loading状态,但是页面还是呈现前一个页面,这是因为新页面的响应数据还没有获得)

二、URL请求过程

  1. 浏览器进程通过进程间通信(IPC)把URL发送到网络进程
  2. 查找缓存。网络进程获取到URL,先去浏览器缓存中查找是否有缓存文件,如果有,拦截请求,直接返回资源副本;否则,进入网络请求过程;
  3. 进入网络请求流程的第一步就是进行DNS解析,获取服务器IP地址(找到服务器地址才能进行通信呀),并准备端口(火狐和谷歌同时访问b站,电脑会给谷歌和火狐分配不同的端口号),如果没有端口号,http默认80,https默认443。(IP地址:端口号=套接字socket)
  4. 等待TCP队列。现在已经把端口和 IP 地址都准备好了,那么下一步是不是可以建立 TCP 连接了呢?答案依然是“不行”。Chrome 有个机制,同一个域名同时最多只能建立 6 个 TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。当然,如果当前请求数量少于 6,会直接进入下一步,建立 TCP 连接。
  5. 利用IP地址和服务器建立TCP连接,三次握手,如果协议是HTTPS,还需要建立TLS连接
  6. 发起HTTP请求:构建请求行,请求头,并把cookie等数据加到请求头中。然后发送构建的请求信息。
  7. 然后通过底层的传输层、网络层、数据链路层、物理层的传输,数据到达了目的服务器的应用层。
  8. 应用层HTTP解析请求头和请求体,如果需要重定向,HTTP直接返回HTTP响应数据的状态code301或者302,同时在响应头的Location字段中附上重定向地址,浏览器会根据code和Location进行重定向操作;否则,返回新数据,200的状态码。
  9. 数据传输完成,TCP四次挥手断开连接。如果,浏览器或者服务器在HTTP头部加上如下信息,TCP就一直保持连接。保持TCP连接可以省下下次需要建立连接的时间,提示资源加载速度Connection:Keep-Alive
  10. 浏览器收到返回的响应头后,开始解析响应头(服务器依次返回响应行响应头响应体)
    1) 重定向,状态码为301或302。在响应头的location字段中告诉浏览器要重定向的URL
    2) 响应行状态码为200。表示可以继续处理该请求。然后进行响应数据类型的判断,返回的响应体数据类型content-type如果是字节流类型,则为下载类型。表示该请求提交给浏览器的下载管理器。URL请求导航结束。若为text/html则继续

总结:浏览器中的 HTTP 请求从发起到结束一共经历了如下八个阶段:构建请求、查找缓存、准备 IP 和端口、等待 TCP 队列、建立 TCP 连接、发起 HTTP 请求、服务器处理请求、服务器返回请求和断开连接。
三、提交文档
所谓提交文档,就是指浏览器进程将网络进程接收到的 HTML 数据提交给渲染进程,具体流程是这样的:

  1. 当浏览器进程接收到网络进程的数据之后,如果响应是HTML文件,便由浏览器进程中的UI线程联系渲染进程(IPC通信),向渲染进程发起“提交文档”的消息;如果响应是一个zip等文件,则交给下载管理器;
  2. 提交文档的消息由浏览器进程发出,让网络进程和渲染进程建立数据传输的管道(接收HTML)。完成后渲染进程“确认提交”的信息给浏览器进程。然后浏览器进程开始更新页面状态
    进入渲染阶段:

四、渲染阶段

  1. 构建DOM树(浏览器无法直接理解和使用HTML,所以需要将HTML转化为浏览器能够理解的DOM树。)
    css、图片、视频交给资源加载器加载,不会阻塞DOM树解析;js资源下载和执行会阻塞dom树的解析(defer和async)
  2. 根据CSS构建CSSOM树
    1) 把css转换为浏览器能够理解的结构——结构化样式表(styleSheets)
    2)标准化属性值。如 2em ->32px。转换为渲染引擎能够理解的,标准化的计算值。
    3)计算出DOM树中每个节点的具体样式computedStyle(涉及继承和层叠)。

将DOM树和CSSOM树结合,组合成一棵Render树。
4. 根据Render树进行布局(layout)
即确定每个树节点的宽、高、位置及元素之间的位置关系(第一次确定节点的大小和位置称为布局。随后对节点大小和位置的重新计算称为重排(reflow),也有些文章称之为回流。
4. 开始绘制(重绘发生于此阶段)
1)分层
渲染引擎为特定的节点生成专用的图层,并且生成一棵对应的图层树(LayerTree)
2) 图层绘制
渲染引擎会把图层的绘制拆分成很多小的绘制指令,即一个绘制列表
3)栅格化操作(raster)(栅格化线程)
主线程将绘制列表提交给合成线程;合成线程将图层划分为图块;最终图块会在GPU进程中生成位图。
5. 合成和显示栅格化操作完成后,合成器线程会生成一个绘制命令,浏览器进程根据位图绘制页面,最终呈现在了用户的浏览器上。

DNS解析过程

解析器(相当于DNS客户端)向DNS服务器发送请求,用的是递归的方式进行传输(意思是发送域名最终返回给我IP地址的结果就可以了),而本地DNS服务器和三层域名服务器(根域名、顶级域名、权威域名服务器)之间用的是迭代的方式传输。
在这里插入图片描述

浏览器输入URL显示页面过程大致可以分为以下几个步骤: 1. DNS解析:浏览器首先会解析URL的域名部分,将其转换为对应的IP地址。它会先检查浏览器缓存是否存在该域名的解析结果,如果没有,就会向本地操作系统或者网络的DNS服务器发送查询请求,获取对应的IP地址。 2. 建立TCP连接:一旦获取到目标服务器的IP地址,浏览器会通过TCP/IP协议与服务器建立连接。这个过程浏览器会与服务器进行三次握手,确保双方能够正常通信。 3. 发送HTTP请求:建立TCP连接后,浏览器会发送HTTP请求给服务器。请求包含了请求行(包括请求方法、URL路径和HTTP协议版本)、请求头(包含一些附加信息,如User-Agent、Cookie等)以及请求体(一般用于POST请求,传递数据)。 4. 服务器处理请求:服务器接收到浏览器发送的HTTP请求后,会根据请求的内容进行处理。处理过程可能包括查询数据库、读取文件等一系列操作,最终生成需要返回给浏览器的数据。 5. 接收响应并渲染页面:服务器处理完请求后,会将生成的响应数据封装成HTTP响应,并发送给浏览器浏览器接收到响应后,会根据响应头的信息判断响应的内容类型,然后对内容进行解析和渲染。对于HTML页面浏览器会解析HTML结构、加载CSS和JavaScript文件,并根据这些文件渲染出最终的页面。 6. 关闭TCP连接:页面渲染完毕后,浏览器会关闭与服务器的TCP连接。如果页面存在其他资源(如图片、样式表、脚本等),浏览器会继续发送相应的HTTP请求获取这些资源,并进行相应的渲染。 这就是浏览器输入URL显示页面的基本过程。其涉及到的具体细节和技术可以更加深入和复杂,但以上步骤概括了整个过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值