浏览器的地址栏从输入一个URL地址到页面呈现经历了哪些事情?
1. URL解析「识别URL」
2. 检查缓存
有缓存将缓存中的内容渲染,没有再去服务器请求
- 强缓存,协商缓存:针对资源文件请求
- 本地存储:针对于数据请求
3. DNS解析
DNS通过域名找到对应服务器的外网IP
网站中,每发送一个TCP请求,都要进行DNS解析(一但当前域名解析过一次,浏览器一般会缓存解析记录,缓存时间一般在1分钟左右,后期发送的请求如果还是这个域名,则跳过解析步骤 =>这是一个性能优化点)
真实项目中,一个大型网站,他要请求的资源是分散到不同的服务器上的(每一个服务器都有自己的一个域名解析)
- WEB服务器(处理静态资源文件,例如:html/css/js等 的请求)
- 数据服务器(处理数据请求)
- 图片服务器 (处理图片请求)
- 音视频服务器
- ......
这样导致,我们需要解析的DNS会有很多次
优化技巧:DNS Prefetch 即 DNS 预获取
让页面加载(尤其是后期资源的加载)更顺畅更快一些
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//static.360buyimg.com">
<link rel="dns-prefetch" href="//misc.360buyimg.com">
<link rel="dns-prefetch" href="//img10.360buyimg.com">
<link rel="dns-prefetch" href="//img11.360buyimg.com">
<link rel="dns-prefetch" href="//img12.360buyimg.com">
.......
4. 基于TCP的三次握手,构建客户端和服务器端的连接通道。
只有建立好连接通道,才能基于HTTP等传输协议,实现客户端和服务器端的信息交互
5. 基于HTTP/HTTPS等传输协议,实现客户端和服务器之间的信息通信
基于HTTP等传输协议,客户端把一些信息传递给服务器
- HTTP请求报文(所有客户端传递给服务器的内容,统称为请求报文)
- 请求头
- 请求体
- 强缓存 和 协商缓存(性能优化:减少HTTP请求的次数)
- 强缓存 ( Cache-Control 和 Expires )
- 协商缓存 ( Last-Modified 和 Etag )
6. 服务器处理请求
服务器接受到请求,并进行处理,最后把信息返回给客户端
服务器返回的时候是:先把响应头信息返回,然后继续返回响应主体中的内容
7. TCP四次挥手「把建立好的网络通道释放掉」
把信息返回给客户端(断开连接TCP的四次挥手)
- 当客户端把请求信息发送给服务器的时候,就挥第一次手:客户端告诉服务器端,我已经把请求报文都给你了,你准备关闭吧
- 第二次挥手:由服务器发起,告诉浏览器,我接收完请求报文,我准备关闭,你也准备吧;
- 第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完毕,你准备关闭吧;
- 第四次挥手:由浏览器发起,告诉服务器,我响应报文接收完毕,我准备关闭,你也准备吧;
Connection: Keep-Alive 保持TCP不中断(性能优化点,减少每一次请求还需要重新建立链接通道的时间,四次挥手不执行)
8. 客户端渲染「呈现出页面和效果」
一次完整的HTTP事务
- 建立起TCP/HTTP传输通道(客户端和服务器端)
- 客户端正常发送请求
- 服务器端正常把信息返回
- 断开TCP/HTTP传输通道