前言
上一篇总结了http缓存和cookie、session,这篇总结一下cdn、dns和http2
DNS
DNS(Domain Names System),域名系统,是互联网一项服务,是进行域名和与之相对应的 IP 地址进行转换的服务器
查询方式
- 递归查询(查询者一定要给到请求者结果,比如本地域名服务器向根域名服务器请求,根域名服务器没有就会向顶级域名服务器询问。。。直到查询到结果,返回给请求者)
- 迭代查询(比如根域名服务器没有本地域名服务器请求的结果,会告知本地域名服务器向顶级域名服务器请求的方式,但是不会自己发送请求)
DNS缓存
- 浏览器DNS缓存,减少网络请求消耗
- 操作系统DNS缓存,电脑中自定义的hosts文件
查询过程
解析域名的过程:
- 在浏览器DNS缓存中查找
- 没有命中,继续从操作系统DNS中寻找
- 如果也没有命中,操作系统把域名发送给本地域名服务器,本地域名服务器从自身的缓存中递归查询缓存,如果找到返回查询结果
- 如果没有命中,本地域名服务器向上迭代查询。根服务器告知顶级域名服务器的地址,向顶级域名服务器查询,顶级域名服务器返回权限域名服务器的地址,向权限域名服务器查询,权限域名服务器返回结果给本地域名服务器
- 本地域名服务器拿到返回结果,把结果缓存起来,并将结果返回给操作系统
- 操作系统拿到结果缓存起来,把结果给到浏览器
- 浏览器拿到结果缓存起来
CDN
构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
CDN的关键技术主要有内容存储和分发技术。
简单来说就是用户访问的时候根据用户的地理位置分配最近的节点,这样用户就不用直接请求源站,而是访问边缘节点,减少了网络延迟等问题
原理
利用CDN,DNS的返回结果就不再是一个ip地址,而是一个CName(别名记录),指向CDN的全局负载均衡。
负载均衡
- 根据用户的地理位置,找到距离最近的边缘节点
- 根据用户的运营商,找到运营网络的边缘节点
- 根据边缘节点的负载情况,分配负载轻的边缘节点
- 根据边缘节点的健康度,响应时间等指标,分配边缘节点
缓存
- 一级缓存
- 二级缓存
一级缓存直连源站,二级缓存直连用户。二级缓存只找一级缓存,一级缓存中没有才到源站中寻找,减少回源率
命中率
可以在缓存中找到并直接返回给用户的命中次数和所有访问次数之比
回源率
缓存中没有,必须以代理的方式回源站中寻找的次数和所有访问次数之比
HTTP2.0和1.x的区别
多路复用
http/2支持复用tcp连接,在一个连接里服务端和浏览器都可以发送多次请求或回应,而且不用按照顺序对应,避免了队头堵塞。http1.1虽然复用tcp,但是服务器必须按照请求的顺序来依次处理,所以前面的请求慢会造成队头堵塞
二进制分帧
采用二进制格式传输数据,而不是1.x中的文本格式。将请求和响应分割为更小的帧,并采用二进制编码。HTTP2中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。
每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装,这也是多路复用同时发送数据的实现条件
首部压缩
浏览器和服务端共同使用首部表来跟踪和存储之前发送过的键值对,对于相同的数据不再通过请求和响应携带。首部表在http2的连接期间一直存在,浏览器和服务器共同更新。
比如请求1带了所有的头部字段,请求2只需要发送差异数据,减少冗余数据,降低开销
服务器推送
http2引入服务器推送,允许服务端推送资源给客户端