HTTP 传输内容的压缩

一、HTTP压缩和内容编码的区别

HTTP压缩,在HTTP协议中,其实是内容编码的一种。

在http协议中,可以对内容(也就是body部分)进行编码, 可以采用gzip这样的编码。 从而达到压缩的目的。 也可以使用其他的编码把内容搅乱或加密,以此来防止未授权的第三方看到文档的内容。

所以我们说HTTP压缩,其实就是HTTP内容编码的一种。 所以大家不要把HTTP压缩和HTTP内容编码两个概念混淆了。

二、HTTP压缩

HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法,比如gzip来压缩html,javascript, CSS文件。 能大大减少网络传输的数据量,提高了用户显示网页的速度。当然,同时会增加一点点服务器的开销。 本文从HTTP协议的角度,来理解HTTP压缩这个概念。

首先,浏览器发送一个请求(request)给web服务器,支持一个压缩格式如(gzip),服务端会将原来的源码压缩之后,通过http响应(response)信息返回给web浏览器,浏览器接收之后,显示出来。

三、HTTP压缩的过程

1. 浏览器发送Http request 给Web服务器,  request 中有Accept-Encoding: gzip, deflate。 (告诉服务器, 浏览器支持gzip压缩)

2. Web服务器接到request后, 生成原始的Response, 其中有原始的Content-Type和Content-Length。

3. Web服务器通过Gzip,来对Response进行编码, 编码后header中有Content-Type和Content-Length(压缩后的大小), 并且增加了Content-Encoding:gzip.  然后把Response发送给浏览器。

4. 浏览器接到Response后,根据Content-Encoding:gzip来对Response 进行解码。 获取到原始response后, 然后显示出网页。
如下图:

四、内容编码类型

HTTP定义了一些标准的内容编码类型,并允许用扩展的形式添加更多的编码。

Content-Encoding header 就用这些标准化的代号来说明编码时使用的算法

Content-Encoding值

  • gzip  表明实体采用GNU zip编码
  • compress 表明实体采用Unix的文件压缩程序
  • deflate  表明实体是用zlib的格式压缩的
  • identity  表明没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况

gzip, compress, 以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。 其中gzip通常效率最高, 使用最为广泛。

压缩的好处

http压缩对纯文本可以压缩至原内容的40%, 从而节省了60%的数据传输。

Gzip的缺点

JPEG这类文件用gzip压缩的不够好。

Gzip是如何压缩的

简单来说, Gzip压缩是在一个文本文件中找出类似的字符串, 并临时替换他们,使整个文件变小。这种形式的压缩对Web来说非常适合, 因为HTML和CSS文件通常包含大量的重复的字符串,例如空格,标签。

HTTP Response能压缩,HTTP Request也是可以压缩的

浏览器是不会对Request压缩的。 但是 一些HTTP程序在发送Request时,会对其进行编码。

五、HTTP压缩示例(Java)

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data = "abcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabc"
                + "dabcdabcdabcdabcdabcdabcdabcdabc" + "dabcdabcdabcdabcdabcdabcdabcdabcdab"
                + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab"
                + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdabcd";

        System.out.println("原始数据的大小为:" + data.getBytes().length);

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        GZIPOutputStream gout = new GZIPOutputStream(bout); // buffer
        gout.write(data.getBytes());
        gout.close();
        // 得到压缩后的数据
        byte g[] = bout.toByteArray();

        // 浏览器一般支持gzip、deflate等压缩方式,其中gzip最广泛使用;
        // 没有设置此句的话浏览器访问时会直接弹出保存.gz文件的对话框,设置后浏览器会解压缩并显示
        response.setHeader("Content-Encoding", "gzip");

        // 此可以不设,不管有没有启用压缩,浏览器始终会根据内容大小自动设置Content-Length header
        response.setHeader("Content-Length", g.length + "");

        response.getOutputStream().write(g);
        System.out.println("压缩后数据的大小为:" + g.length);
    }

  • 运行后,浏览器访问时会显示原始数据;查看响应信息如下,会有Content-Encoding:gzip

  • 服务端会打印如下信息:

时间: 2024-10-01 06:47:21

HTTP 传输内容的压缩的相关文章

关于webservice大数据量传输时的压缩和解压缩

当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据传输.执行的过程就是先把Dataset转化为xml进行传输,Dataset转化为xml的格式如下: [html] view plaincopy <DataSetName> <DataTableName> <Column1Name>.......</Column1Nam

HttpClient与APS.NET Web API:请求内容的压缩与解压

首先说明一下,这里的压缩与解压不是通常所说的http compression——那是响应内容在服务端压缩.在客户端解压,而这里是请求内容在客户端压缩.在服务端解压. 对于响应内容的压缩,一般Web服务器(比如IIS)都提供了内置支持,只需在请求头中包含 Accept-Encoding: gzip, deflate ,客户端浏览器与HttpClient都提供了内置的解压支持.HttpClient中启用这个压缩的代码如下: var httpClient = new HttpClient(new Ht

.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容

## MessagePack基础介绍 Signalr默认使用的是json形式传递数据,但是signalr提供了灵活的扩展,支持MessagePack形式序列化数据,以增加性能降低网络传输的效果,极大的提高响应速度. 先看一个MessagePack自定义序列化的例子,以一个自定义的实体对象为例,可以使用MessagepackObject标记为序列化的对象,同时定义使用属性名作为key(区分大小写),同时可以定义忽略某个属性等.以及自定义key等 ``` C# [MessagePackObject(

基于文本内容的压缩

数据压缩 减少不必要的资源加载之后,我们将剩下的资源进行压缩. 为了解释数据压缩的原则,我们创建一个txt文本,内容如下: # Below is a secret message, which consists of a set of headers in # key-value format followed by a newline and the encrypted message. format: secret-cipher date: 04/04/14 AAAZZBBBBEEEMMM

前端性能优化-HTTP压缩

什么是HTTP压缩 HTTP压缩是指: Web服务器和浏览器之间压缩传输的"文本内容"的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少网络传输的数据量,提高了用户显示网页的速度.当然,同时会增加一点点服务器的开销. 本文从HTTP协议的角度,来理解HTTP压缩这个概念. HTTP内容编码和HTTP压缩的区别 HTTP压缩,在HTTP协议中,其实是内容编码的一种. 在http协议中,可以对内容(也就是body部分)进行编码

前端性能优化成神之路-HTTP压缩开启gzip

什么是HTTP压缩 HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少网络传输的数据量,提高了用户显示网页的速度.当然,同时会增加一点点服务器的开销. 本文从HTTP协议的角度,来理解HTTP压缩这个概念. HTTP内容编码和HTTP压缩的区别 HTTP压缩,在HTTP协议中,其实是内容编码的一种. 在http协议中,可以对内容(也就是body部分)进行编码, 可以采

HttpClient 4.3.6教程 第1章 基础 【翻译】

第1章基础 1.1请求执行 HttpClient大部分的基础函数都是在执行HTTP的方法.一个HTTP方法执行包括一个或多个HTTP请求/HTTP应答交换,通常这已经在HttpClient内部操作了. 用户提供一个请求对象,HttpClient将这个请求传输给目标服务器,服务器返回一个相应的应答结构,如果不成功则抛出一个异常. 很自然地,了解HttpClientAPI的切入点是上面阐述里规定的HttpClient接口. 这是一个最简单请求执行例子: CloseableHttpClienthttp

Apache Client使用说明第一章(第二部分)

1.2  HttpClient接口 HttpClient接口代表了HTTP请求执行最重要的约定.它规定了请求执行过程无任何和限制或者特定的细节以及审阅连接管理,状态管理,认证和重定向处理的实现等细节.这使得装饰接口附加功能更容易比如响应内容的缓存. 通常HttpClient的实现只是作为样子,大量特殊目的的处理器或策略接口的实现来处理HTTP协议具体的各个方面比如重定向或者认证的处理或者决定连接持续的时间.这使得用户可以替换某些默认的实现. ConnectionKeepAliveStrategy

Python爬虫预备知识

1.http编程知识 http中client 和server的工作模式 client和server建立可靠的tcp链接(在HTTP1.1中这个链接是长时间的,超时断开策略) client通过socket与server通信,发送request并接受response http协议是无状态的,是指每一条的请求是相互独立的,client和server都不会记录客户的行为. client通过在HTTP请求中添加headers告诉server 他请求的内容,可以接受的格式 常用的请求方式有get和post