【客户端容器】 | 青训营笔记

48 阅读6分钟

浏览器架构

  • 单进程架构
  • 多进程架构
  • 面向服务架构

多进程架构

一个页面的打开包括四个进程,而多个页面的时候浏览器进程、网络进程、GPU 进程等,这些都是通用的进程 每个标签页的都是独立的渲染进程,进程之间的资源( CPU、内存等)和行为( UI、逻辑等)互不共享,所以即便某个标签页崩溃了也不会影响其他标签页

chorme浏览器进程如下图所示 yuque_diagram (2).jpg

从输入 URL 到页面展示

用户输入

构建请求

用户URL框输入内容之后,浏览器进程先判断URL框中输入的是一个URL地址还是一个Query查询条件

  • 如果是url,直接请求站点资源
  • 如果是查询条件,就将输入发送给搜索引擎

但不论是URL还是查询条件,都会构建成一个请求信息,构建好后准备发起网络请求

请求信息由协议,主机,端口,路径,查询参数,锚点六部分组成

查找缓存

但在发生真正的网络请求之前,浏览器会先在浏览器缓存中查询是否有要请求的文件。其中,浏览器缓存是一种在本地保存资源副本,以供下次请求时直接使用的技术。

当发现请求的资源已经在浏览器缓存中存有副本,它会拦截请求,返回该资源的副本,并直接结束请求,而不会再去源服务器重新下载。

这样做的好处有: 缓解服务器端压力,提升性能(获取资源的耗时更短了); 对于网站来说,缓存是实现快速资源加载的重要组成部分。

当然,如果缓存查找失败,就会进入网络请求过程了。

网络请求

如果缓存中不存在该资源,则浏览器进程会发起网络请求,向服务端请求该资源。浏览器进程会通过IPC通信把URL发送至网络进程,网络进程接收到URL后,会先与服务器建立连接,再发起网络请求,以下是具体流程

通过 TCP 与服务器建立连接

由于HTTP协议作为应用层协议,在工作前是需要浏览器和服务器先建立TCP连接 image.png

准备IP地址和端口号

建立TCP连接是需要准备IP地址和端口号,而IP地址和端口号是通过DNS域名解析获取的(也就是把URL映射对应生成IP地址和端口号,就叫域名解析)

等待 TCP 队列

准备好了IP和端口号也不是立马就建立TCP连接,因为Chrome 有个机制,同一个域名同时最多只能建立 6 个 TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成

建立TCP连接

建立TCP连接时 服务器和客户端会经历三次握手 1 浏览器向服务器发送TCP数据:SYN(seq=x)seq 2 服务器向浏览器发送TCP数据:ACK(seq=x+1)SYN(Y) 3 浏览器向服务器发送TCP数据:ACK(seq=y+1)

发送 HTTP 请求

一旦建立了 TCP 连接,浏览器就可以和服务器进行通信了 连接建立之后,浏览器端会构建请求行、请求头等信息,并把和该域名相关的 Cookie 等数据附加到请求头中,然后向服务器发送构建的请求信息,而HTTP中的数据正是在这个通信过程中传输的。

服务器根据浏览器的请求信息来准备相应的内容闭并返回给浏览器。

读取响应头信息

响应头包含了服务器自身的一些信息,比如服务器生成返回数据的时间、返回的数据类型(JSON、HTML、流媒体等类型),以及服务器要在客户端保存的 Cookie 等信息。

网络线程在接收到服务器返回的响应头后,网络进程开始解析响应头

重定向

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

没有重定向

如果没有重定向则检查响应头的Content-Typ,它告诉浏览器服务器返回的响应体数据是什么类型,然后浏览器会根据 Content-Type 的值来决定如何显示响应体的内容。

  1. 如果响应头中的 Content-type 字段的值是 text/html,则代表响应主体是一个HTML文件,网络进程就将其转发给浏览器进程,浏览器进程接收到网络进程的响应头数据之后,发送CommitNavigation消息到渲染进程,发送CommitNavigation时会携带响应头、等基本信息
  2. 如果响应头中的 Content-Type 的值是 application/octet-stream,显示数据是字节流类型的,通常情况下,浏览器会按照下载类型来处理该请求,交给下载管理器处理

准备渲染进程

默认情况下一个tab页面就有一个渲染进程,但有些时候多个页面也会同时运行在一个渲染进程中,而这种情况就是当多个页面都属于同一站点(相同的协议名和根域名)的话,新页面就会复用父页面的渲染进程

提交文档

浏览器进程将网络进程接收到的 HTML 数据提交给渲染进程,具体流程是这样的:

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

渲染阶段

一旦文档被提交,渲染进程便开始页面解析和子资源加载了,详情在这篇文章之前做过总结

【浏览器】Chrome浏览器的执行机制(内附相关知识点面经串联)