自学内容网 自学内容网

HTTP1.1优化

HTTP/1.1如何优化?

可以从以下三个角度回答这三个问题:

  • 尽量避免发送HTTP请求

  • 在必须要发送请求时尽可能减少请求次数

  • 减小服务器的HTTP响应数据大小

如何避免发送HTTP请求?

通过缓存,对于一些重复的HTTP请求,客户端会把第一次请求以及相应数据保存在本地磁盘上,将请求中的URL作为key,响应数据作为value通过键值对缓存信息,这样当后续再访问这个url时,通过缓存中就能找到对应的数据从本地读取,会比从网络上获取快很多。

缓存访问

当然,还要考虑资源过期时间问题,

首先会通过 Cache-Control(相对时间)和Expries(绝对时间)两个字段来判断请求数据是否过期,如果没有过期则使用本地缓存,过期了则向服务器发起请求,服务器会在响应中更新Cache-Control字段

如果HTTP响应头部同时有Cache-Control和Expires字段的话,Cache-Control的优先级高于Expires

当然,就算过期时间到了,服务端数据也可能处于一个长时间没有变更的状态,所以本地缓存的数据实际上还是最新的,怎么处理这种情况?

这就涉及到协商缓存问题:

协商缓存通过请求头部中的If-Modfied字段与响应头部中的Last-Modfied字段实现,这两个字段的意思是:

  • 请求头部中的If-Modfied 当资源过期了,发现响应头中有Last-Modified声明,则再次发起请求的时候带上Last-Modfied的时间,服务器收到请求后发现有If-Modfied-Sinc则与被请求资源的最后修改时间(Last-Modified)进行对比,如果最后修改时间较新,则说明资源被修改过,则返回最新资源,HTTP 200 OK;如果最后修改时间较旧,则说明资源无新修改,响应HTTP 304 走缓存读取数据。

  • 响应头部中的Last-Modified 标识这个响应资源的最后修改时间。

第二种:请求头部中的If-None-Match字段与响应头部中的Etag字段,这两个字段的意思是:

  • 响应头部中的Etag:唯一标识响应资源。

  • 请求头部中的If-None-Match:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值。服务器收到请求后进行比对,如果资源没有变化返回304,如果资源变化了返回200。

第一种实现方式是基于时间实现的第二种实现方式是基于一个唯一标识实现的。相对来说后者可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题

如何减少HTTP请求次数

减少HTTP请求可以从如下三个方面展开

1.减少重定向请求次数

服务器上的一个资源可能从URL1转移到URL2之后客户端并不知情,客户端仍访问URL1,这时候服务端要通过300响应码和Location头部告诉客户端资源已转移到URL2楽,客户端要再发起一次对于URL2的请求

重定向请求发起的越多,客户端在访问资源时就要多次发起HTTP请求,这无疑会降低网络性能

另外,服务端往往不止一台服务器,比如在源服务器和客户端之间会有代理服务器,这样重定向请求就会导致有更多次的请求发出,如下图所示:

img

可以看到,整个流程会多发送很多HTTP请求

但是这同时也给我们提供了一个减少HTTP请求次数的思路,让源服务器处理重定向问题,这样就能得到下图这样一个重定向流程:

代理服务器重定向

当然不止于此!让代理服务器来处理重定向问题不就能继续减少HTTP请求的次数吗?实现效果如下图所示:

代理服务器重定向2

2.和并请求

如果把多个小请求文件合成一个大的请求文件,那么虽然总传输的资源量相同,但是请求减少,也就意味着减少了重复的HTTP头部发送量

同时,由于HTTP/1.1采用的是请求-响应模型,存在队头阻塞问题,为了防止单个TCP连接堵塞,往往会同时发起5-6个存在于不同TCP连接中的请求,如果能将这些请求合并,也就能减少TCP连接次数,减少在TCP握手和启动中耗费的时间。

列举一些具体和并请求的方式

网页中往往会含有很多小图标,有多少个小图标,客户端就要发起多少次请求,那么对于这些小图标,可以通过CSS Image Sprites技术将他们合成一个大图片,这样就可以减少HTTP请求的次数,一次获取多个小图标组合而成的图片,然后再在本地根据CSS数据将这些图片分割成一个个小图标

除了图片的合成,还有服务端利用webpack等打包工具将js、css等资源文件合并打包成大文件,也能达到减少HTTP请求次数的效果

另外,还可以将图片用base64编码后,以URL的形式嵌入到HTML文件中去,随HTML文件一并发送,这样当客户端接收到HTML文件之后就可以直接解码出数据,显示出图片,不用再发起图片相关的请求,这样就减少了请求的次数。

可以看书,和并请求的方式就是合并资源,用一个大资源的请求来替换多个小资源的请求

但是这样做和并请求也会存在它自身的问题,当大资源的某一个小资源需要重新获取时就需要整体获取整个大资源,显然带来了额外的负担

3.延迟发送请求

一般HTML中会有很多HTTP的URL,如果想要一次性获取这些URL中的数据显然会在请求时一起发出很多HTTP请求,会造成卡顿,那么其实可以在第一时间只发出目前页面上显示部分的URL请求,这样能减缓一瞬间的网络压力,在用户滑倒未加载的内容之前在加载即将显示的部分,分批显示内容,按需获取,就达到了延迟发送请求的效果

如何减少HTTP响应数据的大小

对于HTTP请求和响应,通常在相应中会包含大量数据,所以可以考虑对响应数据进行压缩,以此提高网络的传输效率

压缩方式一般分为两种:有损压缩和无损压缩,下面展开来看这两种压缩方式

无损压缩

无损压缩是指资源经过压缩后,信息不被破坏,还能完全恢复到压缩前的原样,适用在文本文件、程序可执行文件、程序源代码中。

首先,我们针对代码的语法规则进行压缩,删去空格与换行符等

接下来队员是资源建立统计模型,对于频繁使用的数据用较短的二进制比特序列标识,而对于不常用的数据就用较长的二进制比特序列标识,常用的序列一般是霍夫曼编码

gzip就是一种常见的无损压缩,客户端的知识会在请求头中告知服务器:

Accept-Encoding: gzip, deflate, br

服务器收到后,会选择合适的压缩算法,在响应头中告诉客户端使用哪种压缩算法

Content-Encoding: gzip

有损压缩

与无所压缩相对的,有损压缩就是牺牲一些质量来减少数据量,提高压缩比,这种方法同茶馆用来压缩音视频与图片

可以通过请求头中的Accept字段中的q变量来告知期望的资源质量

Accept: audio/*; q=0.2, audio/basic

原文地址:https://blog.csdn.net/Cary_cacb/article/details/142640522

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!