跳到主要内容

基础必备

提示 🤠

navigation-timing 提供了可用于衡量一个网站性能的数据。与用于相同目的的其他基于JavaScript的机制不同,该API可以提供可以更有用和更准确的端到端延迟数据。

浏览器渲染过程

参考资料

浏览器 Navigation_timing_API

W3C navigation-timing

work_flow

阶段一

  1. 准备卸载页面
  2. 重定向开始
  3. 卸载页面开始 2和3同时开始
  4. 卸载页面结束
  5. 重定向结束 (之前页面资源释放结束)
  6. 开始发起请求 (如果上一个页面为空则跳过之前)
  7. 查看本地缓存

阶段二

  1. 查询域开始 (DNS)
  2. 这部分可以优化--下面介绍和cdn配合
  3. 查询域结束
  4. 建立连接(TCP)
  5. 加密(可选)
  6. 连接建立成功 (握手结束)-->体现出网络质量
  7. 发起请求
  8. 服务器接收到请求,并发起相应
  9. 服务器处理
  10. 服务器发送数据结束 (可优化点服务器处理速度)

阶段三

  1. 解析 dom 开始 (阶段三可优化)
  2. 解析 dom 结束
  3. 加载依赖
  4. dom 事件绑定
  5. dom 准备完成
  6. dom 渲染完毕
  7. 执行 onload 事件内的脚本
总结

DNS 解析速度(阶段二);

TCP 连接速度(阶段二);

Response 返回速度(阶段二);

Processing 这个阶段,优化页面(阶段三, 前端优化重点))

onload 阶段决定什么时候初始化好(阶段三, 前端优化重点);

DNS

DNS 是Domain Name System, 域名系统,⽤于将域名转换为IP

根、顶级域

点之后的字母

参考链接: wiki 根

com,net,cn......

顶级域名

通过 .来区分,一个为顶级域名(一级域名),两个为(二级域名) 以此类推

baidu.com 就是一级域名,也叫顶级域名

域名资源记录

记录: 域名要对应ip,一个对应就叫做一个记录

域名资源: 域名

记录类型含义
SOA(StartOf Authority, 起始授权记录)⼀个区域解析库有且只能有⼀个 SOA 记录,⽽且必须放在第⼀条,(一般这个不用理会,谁卖谁维护)
A记录(主机记录)⽤于名称解析的重要记录,将特定的主机名映射到对应主机的 IP 地址上, 映射:域名 -> ipv4
CNAME记录(别名记录)⽤于返回另⼀个域名,即当前查询的域名是另⼀个域名的跳转, 主要⽤于域名的内部跳转,为服务器配置提供灵活性
NS记录(域名服务器记录)⽤于返回保存下⼀级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
MX(邮件记录)⽤于返回接收电⼦邮件的服务器地址
IPv6主机记录(AAAA记录)与A记录对应,⽤于将特定的主机名映射到⼀个主机的IPv6地址, 映射:域名 -> ipv6

参考链接: wiki 域名系统 记录类型

域名服务器

需要解析就要去找到服务器,域名解析的服务器就叫做域名服务器;

参考链接: wiki 根域名服务器

参考链接: wiki 名称服务器

域名解析

ip 地址

x.x.x.x 文本 ipv4

x.x.x.x为int,4 个字节。一个字节范围 0~255。

F:F:F:F:F:F 文本 ipv6

总结:ip 域名其实就是一个编号

把域名转换成 ip 地址,采用递归和迭代两种方式

find_ip

参考链接: wiki 域名系统 域名解析

在几十年前,计算机性能远不如现在,当你数据达到百万级就要考虑性能问题了,因此不可能吧所有的域名都放在一个机器上

所以在访问高频服务器时候会快,低频的会慢

DNS 作者想到一个办法: 分级维护

分级维护:

  1. 当你要访问网站的时候首先要解析域名, dns 服务器收到请求之后优先从本地缓存找(高频域名),如果缓存没有(找不到),就要向根域名(Root server)服务器(全球有 13 台,中国只有镜像,所以 IPV6 诞生)去查询

  2. 根域名服务器只去维护后缀;把后缀这一类的域名拿出来之后告诉 dns 服务器这个后缀的服务器去向哪个服务器查询

  3. dns 收到这个服务器地址之后, 接着去找 TLD 服务器,它负责维护一级域名, 同样的它也干活, 返回名称服务器的 ip

  4. dns 收到 TLD 服务器返回来的名称服务器地址之后, 再去名称服务器上去查询这个域名的 ip

  5. dns 收到名称服务器返回的 ip 地址之后, 先把它丢到缓存里, 然后才会返回给客户端

缓存算法(空间换时间)

理论上来说,什么样的数据都可以写进缓存

但是有的有必要写缓存,有的没必要写缓存,有的是临时缓存

缓存算法最重要的就是:数据命中率

数据命中率,访问有效性

如何提高这个命中率:需要去动态的维护缓存里面的数据