文档章节

【整理】HTTP 协议中的压缩问题

摩云飞
 摩云飞
发布于 2013/07/05 00:07
字数 1312
阅读 775
收藏 23
点赞 0
评论 4
      公司因业务需要,要求实现 REST API 的 HTTP 客户端支持 gzip 压缩。那么首先需要回答下面几个问题:
  1. gzip 压缩和其他压缩方式有什么不同?或者说优劣在哪里? 
  2. HTTP 协议中对压缩方式的常规支持有哪些? 
=========== 我是分割线 ============

查阅相关资料如下:


      LZ77 是一种基于字典的无损数据压缩算法(还有 LZ78, LZW 等)。
      deflate 是一种数据压缩算法,实际上就是先用 LZ77 压缩,然后用霍夫曼编码压缩。
      gzip 的基础是 defalte 。其通过 defalte 算法压缩数据,然后加上 gzip 文件头和 CRC 校验。压缩后生成 .tar.gz 或者 .tgz 文件。既是一种文件结构,也可以算一种压缩格式。
      ZIP 也使用 defalte 算法,但可移植性更好,并且不需要一个外部的归档工具就可以包容多个文件。但是由于 ZIP 对每个文件进行单独压缩而没有利用文件间的冗余信息(固实压缩),所以 ZIP 的压缩率要稍逊于 tar 压缩包。
      zlib 是一个提供了 deflate, zlib, gzip 压缩方法的函数库;同时也是一种压缩格式,可以通过 deflate 压缩数据,之后加上 zlib 头和 CRC 校验来生成 zlib 文件格式。
      bzip2一个基于数据块排序算法的文件压缩工具,并作为 gzip 的替代者逐渐得到流行,它可以生成相当小的压缩文件,尤其是对于源代码以及其它的结构化文本来说更是这样,但是这样做的代价是最高达 4倍内存与处理器时间消耗。bzip2 压缩的 tar 包传统上叫作 .tar.bz2 。

      zlib 数据流格式、defalte 以及 gzip 文件格式均已被标准化成了,分别是 RFC 1950、RFC 1951 以及 RFC 1952。

=========== 我是分割线 ============ 
HTTP/1.1 协议允许客户端可以选择要求从服务器下载压缩内容,这个标准本身定义了三种压缩方法:

  1. “gzip”(内容用 gzip 数据流进行封装)
  2. “compress”(内容用 compress 数据流进行封装)
  3. “deflate”(内容是原始格式、没有数据头的 DEFLATE 数据流)
许多 HTTP 客户端库以及绝大多数现代的浏览器都支持前后两种格式。

=========== 我是分割线 ============  
Web 压缩相关技术如下:
  • HTTP 压缩:压缩来自 Web 服务器的内容
  • Gzip 压缩: 一种无损失的数据压缩格式
  • 静态压缩:预压缩,用于发送静态页面
  • 内容及传输编码:IETF 用于压缩 HTTP 内容的两级标准

HTTP 压缩

      HTTP 压缩是一种用于压缩来自 Web 服务器(HTTP 服务器)的内容的技术。Web 服务器内容的格式可以是诸多 MIME 类型中的一种:HTML、纯文本、图像格式、PDF 文件等。其中 HTML 和图像格式是在 Web 应用程序中最常用的 MIME 格式。

      Web 应用程序中使用的大多数图像(例如 GIF 和 JPG)已经是压缩过的格式,无需进一步压缩;即使再压缩,性能也不会有大的改善。然而,静态或动态创建的 HTML 内容只包含纯文本,适合进行压缩。

HTTP 压缩的目的是使 Web 站点发送更少的数据。要有效实地现这个目的,需要以下条件:
  • Web 服务器应该能够压缩数据
  • 浏览器应能解压缩数据并以正常的方式显示页面
这是很明显的。当然,压缩和解压缩的处理不应消耗大量的时间或资源。


Gzip 压缩

       Gzip 是一种无损失的数据压缩格式。所使用的算法是开源、无专利的 LZ77(Lempel-Ziv 1977)算法的变体。 该算法寻找输入数据内的重复字符串。二次出现的字符串由一个指向前一字符串的指针代替。

静态压缩

      如果 Web 内容是预生成的并且不需要与其他系统进行服务器端动态交互,那么内容就可以被预压缩并放置在 Web 服务器内。而这些压缩了的页面则在用户请求时被发送。流行的压缩工具(gzip、Unix compress)均可压缩这些静态文件。
      但是,当内容必须动态生成,比如对于电子商务站点或由应用程序和数据库驱动的站点,静态压缩没有什么用处。


内容和传输编码

      IETF 用来压缩 HTTP 内容的标准包括两级编码:内容编码 和 传输编码 。
      内容编码 是指在 Web 用户请求文档之前就已经应用到这些文档的编码和压缩方法。这也被称为预压缩 或静态压缩。由于存在复杂的文件维护负担,这个概念从来没有得到真正的重视,而且使用预压缩页面的站点也很少。

      传输编码 是指实际数据传输过程中的编码方法。


© 著作权归作者所有

共有 人打赏支持
摩云飞
粉丝 365
博文 352
码字总数 952690
作品 0
徐汇
程序员
加载中

评论(4)

sbwffgqqq
sbwffgqqq
测试而已!
摩云飞
摩云飞

引用来自“地皮鼠”的评论

今天发了好多测试的评论

意思你这个评论是在测试?呵呵
野薯
野薯
今天发了好多测试的评论
野薯
野薯
今天发了好多测试的评论
snort代码修改记录

由于工作关系,需要修改snort中代码验证漏洞分析逻辑.把snort代码分析如下: 代码的核心使用pattern匹配packet中的内容.把snort规则提供的关键字分类后发现.最关键的是payload detection关键字...

blackrong ⋅ 2012/10/30 ⋅ 0

HTTPS, SPDY和 HTTP/2性能的简单对比

中文原文:HTTPS, SPDY和 HTTP/2性能的简单对比 整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 请尊重版权,转载请注明来源,谢谢! Firefox 35这周发布了,成为第一个...

天马行空的鱼 ⋅ 2016/03/21 ⋅ 0

HTTPS、SPDY、HTTP/2 对比

整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 Firefox 35,成为第一个默认开启支持HTTP/2协议的浏览器。Chrome也支持了,只是以SPDY 4的名义,并且要自己在里面手动开...

Candy_Desire ⋅ 2015/12/30 ⋅ 0

关于https的那些事儿

关于https的那些事儿 某学姐2017-03-1612 阅读 前一阵子在研究抓包原理,发现https抓包和普通的http抓包原理完全不同。而在了解https抓包之前,有必要先掌握https协议的通信过程。 于是在写这...

某学姐 ⋅ 2017/03/16 ⋅ 0

UEditor-With-Spring 1.0 发布,适用 SSH 架构

UEditor介绍 UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码。 官网:http://ueditor.baid...

高山流水情 ⋅ 2016/08/16 ⋅ 3

01_Http、Https、Http2.0 的基础知识总结(持续更新篇)

前言 不得不说现在无论在前端和后端领域的技术迭代十分迅速,比如前段时间SpringBoot2.0的更新采用了Http2.0技术;这些基础协议的更新往往带来了实质的更新。一些名词:"HTTP 管线化"、"会话跟...

weir_will ⋅ 05/01 ⋅ 0

FTP 协议和 HTTP 协议的12点比较(文件上传/下载)

许多站点,比如facebook或一些博客等都允许用户上传或下载文件,比如论坛或博客系统的图片。在这种情况下,通常有两种选择上传文件到服务器,那就是FTP协议和HTTP协议。 以下列出了一些两者的...

王振威 ⋅ 2012/04/22 ⋅ 10

Nginx学习指南之模块的应用解析(二)

一概述 关于Nginx Web Server的篇章,发现挺长时间没有更新了,只能利用空闲的时间细心整理一下,希望在提升自己能力的同时,也能帮助到大家,在之前的写的一篇Nginx文档中,介绍了Nginx核心...

晨风微凉 ⋅ 2014/06/20 ⋅ 0

Android网络编程(三):HTTP的缺陷与改进

虽然HTTP已经得到广泛的应用,但随着计算机的快速发展,对网络的需求也越来越高,HTTP协议已经逐渐成为一种瓶颈,目前出现了基于HTTP的一些改进协议,包括Google的SPDY,以及WebSocket通信,...

C6C ⋅ 2017/06/28 ⋅ 0

DICOM:DICOM标准学习路线图(初稿)

题记: DICOM医学图像处理专栏撰写已有两个年头,积累了近百篇文章。起初只是用于记录自己科研、工作中遇到的疑难问题,专注于图像处理(主要是医学图像,这也正是专栏名称最初的由来);后来...

zssureqh ⋅ 2015/10/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

在java中读取文件(也支持读取jar中的文件)

getClass().getResourceAsStream("文件名.格式"); 这个方法是用于获取当前类所在目录下的文件;需要将文件放到和当前类同一个包下面 比如我有个类在 com.test这个包下, 要读取一个test.jpg的图...

太黑_thj ⋅ 30分钟前 ⋅ 0

CentOS 7 源码编译安装 MySQL 5.7记录

没事瞎折腾,本来可以yum安装,却偏偏去要编译源码。 1. 安装依赖包 1). 安装cmake等依赖 # yum install cmake ncurses ncurses-devel bison bison-devel 2). 安装boost 1.59.0 # wget htt...

admin_qing ⋅ 32分钟前 ⋅ 0

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 今天 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 今天 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部