1、浏览器主进程解析地址栏,判断输入内容:
如果搜索内容则转到浏览器配置的搜索引擎
如果是URL地址,则开始请求站点(合成请求信息)
2、如果是URL地址,主进程通过IPC告知网络进程的请求站点的内容
3、主进程通知网络进程的同时会并行查找和启动渲染进程
4、网络进程接收到主进程的请求信息,网络服务会进行缓存查找、DNS查找、tcp连接,发起请求
4.1、查找浏览器缓存,是否命中( 包含http缓存的强缓存、协商缓存)---第二次请求才会加速
1、前端缓存分为:http缓存和浏览器缓存(浏览器的磁盘缓存和内存缓存与http缓存密切相关、当然浏览器还有存储型缓存)
2、浏览器缓存获取顺序,根据三级缓存原理进行判断:
1)浏览器会率先查找内存缓存,如果资源在内存中存在,那么直接从内存中加载
2)如果内存中没找到,接下去会去磁盘中查找,找到便从磁盘中获取
3)如果磁盘中也没有找到,那么就进行网络请求,并将请求后符合条件的资源存入内存和磁盘中
3、这里会涉及到其他知识点:什么资源会缓存在浏览器内存什么资源会缓存在浏览器磁盘
1)在渲染进程中加载的js资源会放到内存缓存
2)css资源一般放到磁盘缓存
4.2、查找本地hosts文件
4.3、dns解析域名找到对应IP (DNS缓存、本地域名服务器、权威域名服务器、顶级域名服务器、根域名服务器)--首次访问可以用cdn加速
**DNS原理**
1、查找DNS 缓存,没有找到的话再去请求本地 DNS 服务器,由它负责完成域名的解析。
2、本地 DNS 会依次请求根域名服务器拿到对应的顶级域名服务器的地址
3、然后请求顶级域名服务器,拿到权威域名服务器的地址,
4、之后权威域名服务器会返回最终的 IP 给本地 DNS 服务器,由它再返给浏览器
二级域名和更多级的域名都在权威域名服务器解析,域名服务器只有三级。
因为域名服务器之所以这样分级是为了通过负载均衡来分散压力,具体的域名解析都是由各自的权威域名服务器来处理的,根域名和顶级域名服务器只是做了个转发。
三级就已经能达成目的了,更多级可以自己分,比如 CDN 服务就是自己做了更多级的负载均衡。
cdn原理
1、CDN 不是一种协议,只是基于 DNS 协议实现的一种分布式网络。
2、前面说到根域名和顶级域名服务器只是做了转发,最终域名解析都是在权威域名服务器做的。
3、那权威域名服务器是不是可以再做一层转发呢?
4、权威 DNS 服务器通过 CNAME 的配置(DNS 协议里指定别名的方式)把请求转发到了 baidu 的 DNS 调度系统,并为请求分配最佳节点IP地址(baidu 的 DNS服务器再根据 IP 返回用户所在区域的一台机器的 IP)。
5、LocalDNS获取 baiduDNS 返回的解析IP地址。
4.4、tcp三次握手建立连接然后发起http请求(三次握手、调用操作系统Socket库)
1、通过tcp三次握手完成与服务器建立连接
1)等待TCP队列:http1.1 同一个域名最多只能建立6个TCP连接,一个TCP同时只能处理一个请求,如果同一域名下有10个请求发生,其中4个会进入排队等待状态
2、发起http请求
3、如果该IP地址对应的CDN节点已缓存该资源(本地已经有一个人访问就会缓存),则会将数据直接返回给用户,例如,图中步骤7和8,请求结束。
4、如果该IP地址对应的CDN节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点,例如,图中的北京节点,并返回给用户,请求结束。
当然这里也会涉及CDN缓存时间
5、服务器收到信息并返回对应文件
6、网络进程读取响应信息,浏览器根据状态码开始处理
6.1、状态码为301、302(重复4步骤)
6.2、状态码为200,通过判断Content-type,如果是字节流数据,启动下载线程;如果是html, 将响应信息通过IPC传输给浏览器主进程;
7、浏览器主进程对响应信息进行缓存,并将数据通过IPC通道传给渲染进程
8、渲染进程不断接收浏览器主进程发送的HTML数据并进行开始加载文档;一旦渲染进程渲染完成,会通过IPC告知浏览器主进程页面已经加载完成。
浏览器主进程会额外处理打开地址所在标签页的会话历史记录,并将记录存储在磁盘上,之后可以通过后退/前进按钮进行历史导航处理。
8.1、加载文档过程:解析html构建DOM树、CSSOM树、执行js文件;生成render树,GPU绘制, 合成图层,将内容显示到屏幕上
9、断开TCP连接
----自己总结用