深入理解浏览器(2)| 青训营笔记

69 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

浏览器导航

从请求网页到浏览器准备渲染网页的过程,叫做导航

标签页外面的一切都由浏览器进程处理。浏览器进程中有线程(UI线程)负责绘制浏览器的按钮和地址栏,有线程(网络线程)负责处理网络请求并从互联网接收数据,有线程(存储线程)负责访问文件和存储数据。

解析URL

解析用户在地址栏填写的关键字,如果是搜索字符串,浏览器会使用默认的搜索引擎,合成带有搜索内容的url,如果是请求的url,若url不完整则合成完整的url,浏览器进程通过进程间的IPC通信将请求交给网络线程

网络资源请求

查找缓存:

  • 按照浏览器缓存策略,网络进程会去检查该资源 是否允许缓存(Cache-Control),是否在本地缓存了该资源(缓存位置依次查找)

  • 如果有缓存资源则网络进程直接返回资源给浏览器进程,网络请求结束

  • 如果没有找到资源或者需要验证资源是否有效,则会真正进入网络请求流程

DNS解析:

  • 一般来说,用户看到的都是域名,一个域名可以有多个IP地址,为了拿到正确的IP地址,它有一套自己的解析系统,就是DNS系统。

  • 如果用户输入的是正确的IP地址,则进行TCP连接

  • 如果用户输入的是域名,则需要通过DNS解析,获得服务器的IP地址才能进行TCP连接。

    • DNS缓存查找过程:浏览器缓存->操作系统缓存->Hosts文件->非权威域名服务器 -> 根域名服务器 -> 顶级域名服务器 -> 权威域名服务器

TCP连接:

  • 请求进入 TCP 队列,单个域名是有 TCP 连接限制(最多6个)的,超出限制需要排队。

  • 浏览器和服务端通过三次握手建立 TCP 连接

  • 如果请求协议是 HTTPS,TCP 连接后还要建立 TLS 连接(安全地交换对称密钥)

发送HTTP请求:

建立连接之后,网络进程正式发出HTTP请求

浏览器会构建请求头,请求行等信息,并把和该域名相关的Cookie等数据加入请求头中,然后向服务器发送请求

  • 请求行简要地描述了客户端想要如何操作服务器端的资源,由请求方法、请求目标、版本号三部分构成
  • 头部字段是 key-value 的形式, key 和 value 之间用 : 分隔,用 CRLF 换行,表示字段结束

服务器响应返回数据

  • 服务器收到请求后,会根据请求信息生成一个响应数据返回(响应行,响应头,响应体等信息)

    • 状态行代表服务器的响应状态,主要有版本号,状态码,原因
  • 服务器返回信息给网络进程,网络进程接收后开始解析:

    • 解析响应头:如果发现返回状态码为301或者302,则说明服务器需要浏览器重定向到其他的url,网络进程会从响应头的Location中获得重定向的地址,发起新的网络请求。如果状态码为200,则表示浏览器可以继续处理该请求
    • 解析响应数据:通过content-type头字段区分数据类型,如果响应是HTML文件,那下一步就是把数据交给渲染器进程。但如果是一个zip文件或其他文件,那就意味着是一个下载请求,需要把数据传给下载管理器。

联系渲染器进程

所有查检完毕,网络线程确认浏览器可以导航到用户请求的网站,于是会通知UI线程数据已经准备好了。UI线程会联系渲染器进程渲染网页。

  • 默认情况下,每个页面都会分配一个渲染进程

    • 通常情况下,打开新的页面都会使用单独的渲染进程;
    • 但是如果从 A 页面打开 B 页面,且 A 和 B 都属于同一站点(拥有相同的协议和根域名)的话,那么B 页面会复用 A 页面的渲染进程;如果是其他情况,浏览器进程则会为 B 创建一个新的渲染进程。

提交导航

通过IPC从浏览器进程向渲染器进程提交导航。渲染器进程也会同时接收到不间断的HTML数据流。当浏览器进程收到渲染器进程的确认消息后,导航完成,文档加载阶段开始。

这个时候地址栏会进行更新,安全指示图标以及网站设置UI都会返回网页信息,并且前进和后退的按钮也会启用,会话历史也会存入磁盘

初始加载完成

提交导航之后,渲染器进程将会开始加载资源和渲染页面。