关于http1.1协议

1. http1.1与http1.0的更新

  • 长连接:新增Connection字段,可以设置keep-alive值保持连接不断开
  • 管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回
  • 缓存处理:新增字段cache-control

2. 长连接

如今使用的http协议大部分都还是http1.1, http协议并没有什么长连接,短连接,而是底层使用的运输层协议的tcp协议会进行连接(因为是可靠协议,会进行三次握手和四次挥手),这里不多说,可以去看看计算机网络的知识。
那为什么会出现这个长连接呢?因为在http1.0的时候,每次发起请求都需要与服务器建立连接,然后完成一次请求就要断开连接,都要进行一次三次握手和四次挥手的过程,这些操作损耗了大量时间。
在这里插入图片描述
如上图所示:上图是一个http请求,左边是请求的瀑布图,可以看出initial connection(包含了ssl连接,使用的https)花费了90多毫秒,占整个请求时间的一大半,如果每个请求都这样那这样花费的时间效率就很低了,所以为了提高效率,先建立连接后不会立刻断开连接,四次挥手,注意这个请求中有请求字段Connection:keep-alive,http1.1默认携带。下个http请求继续使用这个连接,继续请求,不需要三次握手等等。比如我上面的请求一些静态资源,css, js,图片,这些资源可能会很小,但是请求多,这样一来是不是节省了大量的时间。因为浏览器限制同一个域名下tcp连接的数量一般是6个左右,所以大量的请求下,即使并发请求,效率也会很低,所以这种长连接是不是更加高效。

但是这个长连接是不是指我在这个页面就一直与服务器保持着连接呢?比如我进入那种展示性的网站,他一直连接是不是没有必要,静态资源拿到了就不需要请求了,就不要连接了对吧?答案肯定不是一直与服务器保持连接,这个长只是相对概念,可能在你把所有资源拿到后,就会断开连接。因为服务器可以控制你长时间没有消息就会断开与你的连接。这个长时间可能很短,可能没有请求就会请求断开连接。因为服务器的tcp服务连接的数量是有限的,他必须断开才能与其他的建立连接,所以一般断开可能就是你资源拿到后没有后续请求,就会自动断开。

所以这个提高了不少效率。所以图中的时间轴中黄色部分(连接时间)不是每个请求都有,这个可以自己去查看。

3.管道化

基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回。这就是所谓的http队头阻塞,因为返回的数据没有识别顺序标志,无法识别是哪个http请求的数据,所以只能按顺序到达,如果第一个请求的数据很大服务器处理时间比较慢,后面请求的数据都不能发送,必须等第一个的数据返回,这实现起来就非常麻烦,还造成了阻塞,这是对网络资源的一种浪费,所以这种管道化一般都未使用,处于关闭状态,在http2中就使用其他方式解决了这个问题。

4.浏览器缓存

浏览器缓存,主要是对一些静态资源的缓存,存储在计算机内存和磁盘上,因为这些资源的变动的可能性都很小,所以在第一次请求后可以选择保存到计算机本地,而不需要再走网络请求,这极大大减少了网络请求,减少了占用网络资源,而且存在本地读取的速度是很快的,刷新明显比第一次资源加载快很多。
在这里插入图片描述

可以看到size这一栏 memory cache 和disk cache 分别代表从内存和磁盘上获取到的资源。这就是使用浏览器缓存。还有其他cache是做浏览器请求优化做的一些优化,也是缓存。没有大小的都是使用的浏览器缓存。
浏览器是如何控制缓存的?浏览器缓存分为两类,一类是强制缓存,第二类协商缓存。先了解一下这两种机制再进行总结。

强制缓存
就是直接使用浏览器的缓存(直接判定资源还是有效的,没有改变),主要通过expires(http1.0就存在)和cache-control(http1.1)字段进行控制(都可以使用),Expires是HTTP/1.0控制网页缓存的字段,其值为服务器返回该请求结果缓存的到期时间,即再次发起该请求时,如果客户端的时间小于Expires的值时,直接使用缓存结果。Expires控制缓存的原理是使用客户端的时间与服务端返回的时间做对比,就是对比当前时间和这个字段的值是否过期,但是时间控制会有误差,比如时区不同,客户端和服务端有一方的时间不准确,会失效。
在HTTP/1.1中,Cache-Control是最重要的规则,主要用于控制网页缓存,主要取值为:
public:所有内容都将被缓存(客户端和代理服务器都可缓存)
private:所有内容只有客户端可以缓存,Cache-Control的默认取值
no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存 max-age=xxx (xxx is
numeric):缓存内容将在xxx秒后失效

由于Cache-Control的优先级比expires高,那么直接根据Cache-Control的值进行缓存,意思就是说在600秒内再次发起该请求,则会直接使用缓存结果,强制缓存生效。注:在无法确定客户端的时间是否与服务端的时间同步的情况下,Cache-Control相比于expires是更好的选择,所以同时存在时,只有Cache-Control生效。

协商缓存
协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,因为强制缓存失效,但是资源可能还是没有过期, 改变或者未改变,需要去访问一下服务器,还能不能使用缓存, 这是一个协商的过程,主要有以下两种情况:状态码返回304或200。
Last-Modified / If-Modified-Since
Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间,If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过此字段值告诉服务器该资源上次请求返回的最后被修改时间。服务器收到该请求,发现请求头含有If-Modified-Since字段,则会根据If-Modified-Since的字段值与该资源在服务器的最后被修改时间做对比,若服务器的资源最后被修改时间大于If-Modified-Since的字段值,则重新返回资源,状态码为200;否则则返回304,代表资源无更新,可继续使用缓存文件。
Etag / If-None-Match
Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,发现该请求头中含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200。

强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值