HTTP协议在网络知识中占有重要地位。HTTP协议最基本的是请求和响应消息,消息由消息头(Header)和实体组成。Http协议的大部分用法是通过设置不同的HTTP请求/响应头来实现的。本系列《实用 HTTP》抛开常规的Header解释表达式,从实际问题出发,分析这些HTTP协议的用法。他们试图解决什么问题?同时解释它是如何设计的以及它是如何工作的。HTTP协议是一种无状态的“松散协议”,它不记录不同请求的状态,并且由于它本身包含两端(客户端和服务器),根据请求和响应来区分,它的大部分内容只是一个这个建议,其实双方都不能遵守这个建议。“这里建议零售价2元……”“哦,我不接受这个建议!”上一篇文章讲了HTTP缓存机制。其实缓存的主要原因是为了减少网络请求的数量,达到快速响应的目的。目的。除了减少网络请求外,其实我们还可以通过对实体内容进行编码压缩来减少传输内容的大小,从而加快响??应速度。本篇继续讲HTTP实体内容压缩编码机制。2、HTTP的内容编码2.1为什么要对内容进行编码?编码的目的是压缩消息实体内容的大小,通过压缩服务器响应消息传输的内容实体,可以在一定程度上加快响应速度。毕竟,传输10kb的内容比传输100kb的内容要快得多。这就是您需要使用内容编码进行压缩的原因。2.2压缩编码说到压缩编码,先简单说一下压缩算法。就压缩算法而言,分为两大类:无损压缩算法Lossycompressionalgorithms看名字就可以理解,无损压缩就是可以恢复的意思,通常应用于文本,有损压缩会修改原来的内容数据以提高压缩率,并对文件进行有损压缩。这是一个不可逆的操作,通常一些质量要求不高。对于图片和视频,虽然压缩后文件可能会模糊,但仍然可以勉强观看。在HTTP协议中,通常我们只对文本内容进行压缩和编码。主要原因之一是压缩本身会消耗服务器资源,而文件比多媒体文件要轻得多。而且,在大多数情况下,多媒体文件已经是高度压缩的二进制格式,再压缩也没有意义。2.3设计一个“压缩协议”前面提到,HTTP协议是一个松散的“协商协议”,需要客户端和服务器的配合才能生效。压缩算法有很多种,选择哪一种也需要双方协商。如果我们尝试去设计这个HTTP“压缩协议”,我们主要需要注意这两点。1、通知服务器客户端支持的压缩算法是HTTP事务。客户端总是发起请求,服务器返回响应。那么客户端在发起请求时首先要告知服务器客户端当前支持的压缩算法。通常客户端支持多种压缩算法。为了让服务器选择,应该允许通过多个支持的压缩算法。既然有多项选择的余地,就必须有优先级的概念。和我们在市场上的交易类似,我接受人民币、美元、比特币的交易,但是因为我用人民币比较方便,所以需要指定交易方,方便的话***交易人民币。2、服务器选择服务器支持的压缩算法对内容进行压缩。服务器端收到客户端的请求后,识别出客户端支持的压缩算法。现在目前环境下最好的压缩算法是对响应内容体进行压缩,然后在内容返回后进行压缩。为了客户端在收到响应后能够清楚的知道服务端使用的压缩算法,还需要在响应中明确标明当前响应实体的数据使用的压缩算法(当然也可以是未压缩)。2.4HTTP“压缩协议”我们之前设计的两个条件都是基于HTTP报文中的headers。接下来我们看看HTTP协议中“压缩协议”是如何设计的。1、请求头中的Accept-Encoding为了告知服务端当前支持的压缩编码,客户端可以在请求头中添加Accept-Encoding头域来指定客户端当前支持的压缩编码。如果有多个可以用逗号隔开。为了满足优先级,其实可以通过,除法的顺序来指定。在HTTP协议中,也可以用Q值来描述编码的优先级。Q值的取值范围为0.0~1.0。0.0表示客户端不想接受这种编码,1.0表示它想使用这种编码,但通常我们不需要明确指定,大家也能看懂。2.响应头中的Content-encoding为了在响应报文中反映出当前用于内容压缩的编码格式,服务器会在响应头中使用Content-Encoding标签。它是一个显式值,因此只能有一个。编码的目的是为了压缩,所以当服务器选择对内容实体进行压缩时,也会修改Content-Length,明确表示当前实体的编码压缩长度。发两张压缩前后的流程图,一目了然。压缩前:压缩后:3.HTTP编码类型3.2HTTP编码类型HTTP定义了一些标准的内容编码类型,并且可以扩展更多的编码类型。各种编码由Internet编号分配机构(IANA)标准化,IANA为每个内容编码算法分配一个唯一的代码名称。Content-Encoding使用这些标准化代码来描述用于编码的算法。常用的算法有:gzip:表示实体采用GNUzip编码。compress:表示该实体使用Unix的文件压缩程序。deflate:表示使用zlib格式压缩。br:表示实体使用Brotli算法的压缩格式。identity:表示不对任何实体进行编码,这是默认值。这些算法中,除了identity之外,都是无损压缩,都需要恢复到原来的文本内容。gzip通常是最有效和使用最广泛的。但是gzip对媒体文件的压缩效果比较差。JPG/PNG等文件已经是高度压缩的二进制文件。开启gzip收效甚微,浪费大量CPU资源。在浏览器的默认实现中,这些压缩代码通常只应用于文本内容,即Content-Type为text/Xxx的请求,但对于一些媒体文件,它们不会被这样压缩。3.2GZIP由于gzip是HTTP内容编码中常用的一种编码方式,这里简单介绍一些gzip等编码方式。有兴趣的可以自行查阅相关资料。Gzip编码是使用的GNUZip编码,它是一种无损压缩算法,用于减小传输消息实体的大小。它是一种不会造成信息丢失的可逆压缩算法。gzip的压缩效率比较高,也是应用最广泛的。如果我们在工作中没有指定,那么当我们谈到HTTP压缩时,我们通常指的是gzip。gzip的原理,简单来说就是扫描整个文本字符串,找到相同的字符串,只保留一个并分配一个标识符,然后用这个标识符替换其他相同的字符串,使整个文件变小。恢复时,只需替换恢复每个标识所代表的字符串,即可恢复到原来的内容实体。这种压缩算法非常适合现在的互联网产品。HTML、CSS、JavaScript、Json都包含大量重复的字符串,所以这里使用gzip是非常合适的。gzip能压缩多少完全取决于压缩后的实体内容。内容文本中包含的相同字符串越多,压缩率越高,反之亦然。在理想情况下,gzip的压缩率可以高达70%。4、内容编码的完整过程至此,我们就可以理解HTTP内容编码的完整过程了。大致流程如下图所示。总结几个关键点:1.在请求头中,通过Accept-Encoding指定客户端支持的内容编码格式。2、服务器选择支持的内容编码对原始响应内容实体进行压缩。3、修改响应头,增加Content-Encoding指定使用的编码方式,修改Content-Length表示压缩后的内容大小。4、内容压缩的算法有很多,但最常用的是gzip。5、内容压缩算法都是基于无损压缩,最终需要在客户端还原内容。五、总结一条消息通常包括消息头和消息实体,本文介绍的HTTP压缩编码主要是针对消息实体内容中的文本内容进行压缩编码,针对消息头的内容。压缩。主要原因是在HTTP/1中,消息的头部总是以ASCII文本传输,没有任何压缩,而解决方案是在HTTP/2中实现的,所以HTTP的编码和压缩只是针对消息实体,这句话并不完全正确,这个以后有机会再说。HTTP除了内容编码,还有传输编码,这也是借机说说。本文对消息实体内容的HTTP压缩策略和方法进行了讲解,希望对您有所帮助。【本文为专栏作家“张扬”原创稿件,转载请微信公众号联系作者获取授权】点此查看该作者更多好文
