http缓存机制
http缓存有强制缓存和协商缓存
1.第一次请求
浏览器直接向服务器发送请求拿到返回结果,并将缓存标识存入浏览器缓存,最后页面加载成功
存储位置:memory cache、disk cache、service worker、push cache,调试工具network请求中可以看到size的值,不为0就没有使用缓存
-memory cache:快速读取=》进程内存中的缓存,读取快。时效性短=》浏览器进程关闭缓存释放,再次打开页面不会有memroy cache
-disk cache: 表示磁盘中的缓存,浏览器关闭不释放,手动清除,再次打开会有from disk cache
-Push Cache(推送缓存)是 HTTP/2 中的内容,当以上三种缓存都没有命中时,它才会被使用。它只在会话(Session)中存在,一旦会话结束就被释放,并且缓存时间也很短暂,在Chrome浏览器中只有5分钟左右,同时它也并非严格执行HTTP头中的缓存
2.再次请求
1.看是否命中强缓存,如果命中,就直接使用强缓存
2.如果没有命中强缓存,就发送请求到服务器检查是否命中协商缓存
3.如果命中,服务器会返回304告诉浏览器使用本地缓存
4.否则,返回新的资源,并将获取的请求结果再存入浏览器缓存中
3.强制缓存
浏览器不向服务器发送任何请求,直接从本地缓存读取文件并返回status code:200
控制强制缓存的字段 Expires和Cache-Control:
expires:Http1.0控制网页缓存的字段,表示缓存的到期时间
cache-control:Http1.1中控制网页缓存重要的规则
cache-control设置:
-no-cache:使用协商缓存
-no-store:不使用缓存
-max-age:max-age=300 300秒内使用缓存
-public:公有缓存,可以被代理服务器缓存,可被多用户共享
-private:私有缓存,不能被代理服务器缓存,不可被共享
-must-revalidate:当缓存过期时,需要去服务端校验缓存的有效性。
4.为什么expires会被cache-control代替
Expires的控制原理是将使用客户端的时间与服务端返回的时间做对比,
但是如果客户端与服务端的时间因为某些原因产生误差,如时区不同,
那么强制缓存就会直接失效,这样强制缓存存在就没有意义
expires时间是一个绝对值,cache-control时间是一个相对值
cache-control优先级高于expires
5.协商缓存
向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源
控制字段:Last-Modified / If-Modified-Since,Etag / If-None-Match
-Etag/if-None-Match优先级更高
-Last-Modified:是服务器响应请求时,返回该资源文件在服务器最后被修改的时间
-If-Modified-Since: 上次请求返回的Last-Modified,如果请求有这个字段,则服务器会比较if-Modified-since与资源文件在服务器最后修改的时间对比,if-Modified-since小的话,说明上次更新后有新的更新,则重新返回资源,否则的话表示无更新,返回304可以使用更新
-Etag:服务器相应请求是返回的当前资源文件的一个唯一标识
-if-None-Match:上次请求返回的Etag,如果有这个字段,服务会比较这个值和服务器上的资源的Etag,如果一致资源无更新,返回304使用缓存。不一致则返回200新的资源,
缓存是保存资源副本,再次请求时使用资源副本
为什么使用缓存?
减少冗余数据传输:多客户端同时向服务器请求同一份资源时,服务器会将同一份资源多次传输给不同客户端,相同资源被多次传输造成数据冗余,消耗网络宽带。使用缓存可以保留第一次相应的资源副本,后续使用资源副本传输给客户端。节省流量
缓解宽带瓶颈:很多网络为本地客户端提供的宽带比远程服务器宽,客户端会以路径上最慢的网速访问服务器,如果有副本性能将提高很多
避免瞬间阻塞:短时间内大量获取同一份web资源时,比如有什么爆炸性新闻时候,缓存可以减少服务器压力
降低延时距离:请求链路上每台网络路由器都会增加请求的时延,使用缓存可以降低延时性
3.设置缓存过期
image.png
4.TCP 和UDP区别
image.png
面向报文:面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率
5.http和https区别,http1、1.1、2.0区别
http:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,明文方式发送信息
1.原理:
①:客户端通过TCP与服务器建立连接,然后请求服务器
②:服务器接到请求后相应信息
https:
以安全为目标的 HTTP 通道,是 HTTP 的安全版,基础为SSL安全协议,在TCP与应用层协议之间
http1:
每次请求都需要与服务器建立一个 TCP 连接,服务器处理完成后连接断开(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态),通信开销大
http1.1:
1.默认使用长连接,只要一端没有提出断开TCP连接将被保存,避免大量重复TCP链接的建立和断开,可以同时并行发送多个请求。
2.缺点:无状态导致HTTP头部信息大,明文传输不安全,服务器无法推送消息
http2.0:
1.以SPDY为基础,其主要特性(兼容老版本HTTP协议,同时可以使用SSL功能),专注于性能,在用户和网站直接只用一个连接
2.特性:
二进制传输:请求和响应数据分割为更小的帧,采用二进制编码,多个帧之间可以乱序发送,根据帧首部的流可以重新组装
头部压缩
多路复用:只通过一个TCP链接就可以传输所有的请求数据
服务端推送
3.缺点:
TCP以及TCP+TLS建立连接的延迟
多个请求是跑在一个TCP管道中的,一旦丢包,TCP就要等待重传,阻塞连接中的所有请求
6.DNS解析过程
1.检查浏览器缓存中是否有域名对应的IP
2.检查操作系统host文件
3.向LDNS(LocalDNS)本地DNS服务器请求查询:如运营商DNS域名服务器
4.若LDNS不能直接命中
LDNS会向根域名服务器请求解析,根域名服务器会给LDNS一个根据域名所查询的顶级域名服务器(gTLD)地址,如.com、.cn
LDNS再向返回的顶级域名服务器(gTLD)发请求,顶级域名服务器(.com)会返回域名的权威域名服务器地址
LDNS再向权威域名服务器请求,权威服务器给LDNS返回具体域名的IP和TTL(Time To Live)保存时间
LDNS返回给用户IP和TTL,用户根据TTL进行缓存
7.URL到页面渲染过程
1.DNS解析域名得到IP
2.TCP通过三次握手建立链接
3.浏览器根据ip与端口发起请求
4.服务器收到请求搜索html,并响应
5.状态码200响应成功,浏览器接收到资源,开始渲染
6浏览器根据深度遍历的方式把html节点遍历成dom 树
7.将css解析成CSS DOM树
8.将dom树和CSS DOM树构造成render树
9.JS根据得到的render树 计算所有节点在屏幕中的位置,进行布局(回流)
10.遍历render树并调用硬件API绘制所有节点(重绘)
11.页面渲染完成,断开连接,TCP四次挥手
8.三次握手,四次挥手
三次握手
1.第一次:客户端向服务端发送请求一个数据包,报文内容: SYN=1,seq=x(此处seq为客户端随机生成的序列号),修改自身状态为SYN_SENT(请求连接)
2.第二次:服务端接收后返回一个数据包,报文内容:SYN=1,ack=x+1(接收站发给发送站的一种传输类控制字符,表示发来的数据已确认接收),seq=y(服务端随机生成的序列号),修改自身状态SYN_RCVD(等待请求确认)
3.第三次握手:客户端收到数据包后,再次向服务端发送一个数据包,报文内容:SYN=1,ack=y+1,seq=x+1,表示客户端已经收到服务端的确认信息并修改自身状态为ESTABLISHED(连接成功),服务端收到信息后也修改状态为ESTABLISHED
四次挥手
1.第一次挥手:客户端发送一个FIN报文段,FIN=1,seq=u,状态为FIN_WAIT_1待客户端确认
2.第二次挥手:服务端收到之后返回一个ACK报文段,ACK=u+1,seq=v,状态变为CLOSE_WAIT状态
3.第三次挥手:服务端发送FIN报文段:FIN=1,seq=w(新生成的序列号),ACK=u+1,确认断开连接
4.第四次挥手:客户端收到FIN报文段之后,发一个ACK报文段给服务端,ACK=w+1,seq=u+1,此时客户端处于TIME_WAIT(等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认),服务端接收到ACK之后关闭连接(CLOSED),客户端等待一段时间之后变为CLOSED