在讨论这个问题之前,要了解到浏览器的多进程机制:
接下来,我们会站在浏览器的角度,来看一下浏览器的工作流程。
根据地址栏的用户输入的信息,浏览器识别判断如果是URL地址,则开始导航过程;如果不是,则根据浏览器默认搜索引擎的规则,拼装成该搜素引擎搜索结果的URL地址,并开始导航。
在离开当前页面开始导航之前,会触发一个 Window: beforeunload event 事件,给用户一次取消导航的机会。在用户点击确认之后,才会正式开始进入导航流程,于此同时,浏览器标签上的状态也会变成正在加载的状态。
浏览器会先在缓存里查找有没有目标网页的缓存数据,如果有的话直接返回缓存数据,没有的话开始 DNS 解析;
浏览器会根据上一步的URL,来查找需要请求的目标服务器地址,这个过程会一层层的去解析URL地址,直至找到目标地址的IP。
hosts
文件里查找是否有目标网址的记录,有的话就把相应映射的IP返回;hosts
里没有相应的记录,就会开始在网络 DNS 节点上查找。这里首先会先从本机配置的 DNS 服务器上查找缓存,比如局域网路由器里默认或手动指定的某几个 DNS 服务器;bar.foo.com
, 会由跟域名解析器查找到 .com
一级域名,继续查找,如果有记录,则直接原路返回映射的IP;当然,上面的流程是递归查询
的流程,还有一种是迭代查询
的方式,在根域名解析器找不到的时候,就告诉客户端去二级域名解析器查找,以此类推。
在浏览器解析到目标URL对应主机IP的时候,网络进程会根据这个 IP 地址和服务器构建TCP连接,浏览器端会构建请求行、请求头等信息,并把和该域名相关的cookie信息放在请求头中一并发送过去。
服务器在收到请求信息后,会根据情况构建响应信息(响应行、响应头、响应体等),然后返回给浏览器端。
301
或者 302
, 浏览器就要从响应头里的 Location 字段读取要重定向的URL地址,然后对这个 URL 地址发起新的 HTTP 或者 HTTPS 请求;如果接收到的响应头状态码是 200
, 就可以继续处理该请求;Content-Type
字段是 application/octet-stream
之类的字节流类型,浏览器一般会把它当作下载类型来处理, 浏览器进程会触发下载管理器来下载该文件,同时中止当前导航流程;text/html
,浏览器则根据响应数据开始渲染流程;提交文档
的消息;提交文档
的消息后,会和网络进程直接建立数据传输的通道,用来接收响应体信息;确认提交
的消息给浏览器进程;合成线程
来渲染:将图层分成图块,利用光栅化转化成位图。合成线程发送 DrawQuad 命令到浏览器进程,由浏览器进程生成页面、并显示在页面上。