这是我参与「第四届青训营 」笔记创作活动的第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都会返回网页信息,并且前进和后退的按钮也会启用,会话历史也会存入磁盘
初始加载完成
提交导航之后,渲染器进程将会开始加载资源和渲染页面。