一、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 headerresponse.setHeader("Content-Length", g.length + "");response.getOutputStream().write(g);System.out.println("压缩后数据的大小为:" + g.length);}

View Code

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

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

HTTP 传输内容的压缩相关推荐

  1. 探索HTTP传输中gzip压缩的秘密

    探索HTTP传输中gzip压缩的秘密 为什么要开启gZip 我们给某人发送邮件时,我们在传输之前把自己的文件压缩一下,接收方收到文件后再去解压获取文件.这中操作对于我们来说都已经司空见惯.我们压缩文件 ...

  2. 即时通讯安全篇(十一):IM聊天系统安全手段之传输内容端到端加密技术

    本文由融云技术团队分享,原题"互联网通信安全之端到端加密技术",内容有较多修订和改动. 1.引言 在上篇<IM聊天系统安全手段之通信连接层加密技术>中,分享了关于通信连 ...

  3. IM聊天传输内容端到端加密技术

    本文由融云技术团队分享,原题"互联网通信安全之端到端加密技术",内容有较多修订和改动.本文来自转载,如有侵权,请联系删除. 转载自http://www.blogjava.net/j ...

  4. linux——不同系统间的文件传输和打包压缩

    一.文件归档 1.文件归档,就是把多个文件变成一个归档文件 2.tar 参数 c ##创建 f ##指定归档文件名称 t ##显示归档文件中的内容 r ##向归档文件中添加文件 --get ##取出单 ...

  5. 文件复制传输及其打包压缩

    1.文件的复制 [root@localhost ~]# cp    file      /mnt/ [root@localhost ~]# ls /mnt file 2复制一个文件的同时并改名为fil ...

  6. 7-17 文件传输(路径压缩解法)

    我们有一个计算机网络和一个双向连接列表.这些连接中的每一个都允许将文件从一台计算机传输到另一台计算机.是否可以将文件从网络上的任何计算机发送到任何其他计算机? 输入规格: 每个输入文件包含一个测试用例 ...

  7. bandizip修改压缩文件内容_Bandizip: 压缩和解压缩

    Bandizip: 压缩和解压缩 ⌘当前价格: 118 ⌘支持系统: OS X 10.12 ⌘开发者: ⌘服务支持: 官方页面 安全下载 累计下载次数: 1023 适用于macOS平台的一体化归档 # ...

  8. Android学习笔记---28_网络通信之通过HTTP协议实现文件上传,组拼http 的post方法,传输内容

    28_网络通信之通过HTTP协议实现文件上传 ---------------------------------------------- 1.注意,做表单提交的时候:程序代码;   <form ...

  9. html文件压缩成gzip,前端性能优化成神之路-HTTP压缩开启gzip

    什么是HTTP压缩css HTTP压缩是指: Web服务器和浏览器之间压缩传输的"文本内容"的方法. HTTP采用通用的压缩算法,好比gzip来压缩HTML,Javascript, ...

最新文章

  1. 知乎用户和龙鹏-言有三:计算机视觉应该怎样入门?
  2. 如何熟悉一个系统?(内含知识大图)
  3. 【Greenplum代码】记录一次不了解GP数据库编号函数使用方法导致的问题(1次疏忽 + 1次不必要 = 2次弯路)
  4. MFC应用程序框架入门
  5. 【HDU - 1702 】ACboy needs your help again! (栈和队列,水题模拟)
  6. yaml 文件内部使用变量赋值的方式_spring boot 学习笔记5(application.yaml 配置文件)...
  7. Ajax请求成功后页面跳转
  8. [转]送给和我一样曾经浮躁过的PHP程序猿
  9. centos7全盘备份到本地_centos7磁盘备份和还原
  10. html倒计时代码执行操作,JS倒计时两种实现方式代码实例
  11. excel vba两个单元格内容合并
  12. linux更改ntfs格式权限,Gentoo Linux下读写NTFS格式分区(ntfs-3g解决NTFS只读不可写的问题)...
  13. CSAPP ArchLab
  14. 揭开均线系统的神秘面纱_揭开动态规划的神秘面纱
  15. 为什么大数据工程师比Java程序员工资高50%?
  16. 不懂量子力学?那你可以试试在家里做这五个实验!
  17. 从0到1 开启商业与未来的秘密读书笔记
  18. html图片水平镜像翻转
  19. Linux 基础实战(二)
  20. Win10系统中很多磁盘碎片怎么进行整理?

热门文章

  1. python 二分查找函数_Python基础14_递归函数,二分查找
  2. 台式机装mac系统_苹果电脑装双系统mac+win7图文教程
  3. vivado 一次性设置多线程编译
  4. python自带intertool模块找不到_Python itertools模块详解
  5. vue一个页面用两个以上页面 时时刷新
  6. python 嵌入式数据库_Pysqlite下载 Pysqlite for Windows v2.6.3(嵌入式数据库python api 接口) 下载-脚本之家...
  7. 后端根据百度地图真实路径距离_做地图功能的设计,有哪些容易被我们忽略的思考?...
  8. c++编程求解二元二次方程组_一道俄罗斯高难度解方程组题,错误率达99%+,中国学霸:确实很难...
  9. python中kmeans怎么导入数据集_通过Python实践K-means算法
  10. jsp中提供的四种属性范围