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

   公司因业务需要,要求实现 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 用户请求文档之前就已经应用到这些文档的编码和压缩方法。这也被称为预压缩 或静态压缩。由于存在复杂的文件维护负担,这个概念从来没有得到真正的重视,而且使用预压缩页面的站点也很少。 

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

时间: 2024-10-01 13:04:12

【整理】HTTP 协议中的压缩问题的相关文章

Http协议中关于Content-Length的解读

  在HTTP协议中,有Content-Length的详细解读.Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body.在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度. 在具体的HTTP交互中,客户端是如何获取消息长度的呢,主要基于以下几个规则: 响应为1xx,204,304相应或者head请求,则直接忽视掉

整理iOS9适配中出现的坑(图文)

整理iOS9适配中出现的坑(图文) 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级iOS9,也就逐渐的衍生出了一系列的问题,笔者也在赶忙为自己维护的App做适配,本文写的一些坑基本都是亲身体验了. 一.NSAppTransportSecurity iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输

HTTP网络协议中的HTTP Client Hints 技术

最近几年各种 Web 技术一直在爆炸式发展,每天都有大量新东西涌现出来.针对这个现象,业内两位大佬最近先后发文表达了自己的观点:Stop pushing the web forward.Is the web platform getting too big?.其实很早之前我就意识到以我目前的精力,吃透所有 Web 新技术几乎是不可能完成的任务,我关注新技术的侧重点放在了性能优化上. 今天我要向大家介绍的技术是:HTTP Client Hints,也与性能优化有关.利用这项技术,HTTP 客户端(

HTTP协议中你必须知道的三种数据格式

实习中的一个主要工作就是分析 HTTP 中的协议,自己也用 Python 写过正则表达式对 HTTP 请求和响应的内容进行匹配,然后把关键字段抽离出来放到一个字典中以备使用(可以稍微改造一下就是一个爬虫工具). HTTP 协议中的很多坑,自己都遇到过,我就针对自己遇到的几种 HTTP 常见的数据格式,来做一个总结. Zlib 压缩数据 对于 Zlib,一点也不陌生,我们平时用它来压缩文件,常见类型有 zip.rar 和 7z 等.Zlib 是一种流行的文件压缩算法,应用十分广泛,尤其是在 Lin

浅谈Http协议中的Get和Post

Http HTTP(Hypertext transfer protocol),先说下着几个单词,Hypertext是超文本(除了HTML外,也可以是带有超链接的XML或JSON),protocol是协议,transfer翻译应该是移交(也可以翻译成传输,运输,还有一个更具体的词是transport),最开始学校学习Http的所有市面能见到的书籍都翻译成超文本传输协议,Http设计的本身是为了移交和操作资源,并不是为了传输资源.最开始的的网站都是静态内容类似今天云盘,实现了资源共享,URL(Uni

在Word中整理笔记页中的手写内容的方法

在Word中整理笔记页中的手写内容的方法   图1 OneNote中的手写内容 在OneNote 2007中,打开需要导入到Word中的笔记页,然后,执行菜单栏中的[文件]|[发送至]|[Microsoft Office Word]命令(如图2所示),即可将手写内容转换为标准的文本并发送到Word中,这样就可以对其进行相关排版.打印等操作了,如图3所示. 图2 执行菜单栏中的[文件]|[发送至]|[Microsoft Office Word]命令

Word2010文档中怎么压缩图片

  在Word2010文档中插入图片后,如果图片的尺寸很大,则会使Word文档的文件体积变得很大.即使在Word文档中改变图片的尺寸或对图片进行裁剪,图片的大小也不会改变.不过用户可以对Word2010文档中的所有图片或选中的图片进行压缩,这样可以有效减小图片的体积大小,同时也会有效减小Word2010文件的大小.在Word2010文档中压缩图片的步骤如下所述: 操作步骤 1.打开Word2010文档窗口,选中需要压缩的图片.如果有多个图片需要压缩,则可以在按住Ctrl键的同时单击多个图片. 2

【原创】HTTP 协议中的 chunked 编码

在 HTTP/1.1 协议中增加了如下关于 chunk 的内容:  Faster response for dynamically-generated pages, by supporting chunked encoding, which allows a response to be sent before its total length is known. 对于支持 HTTP/1.1 协议的客户端,要求能够处理以 chunked 形式组织的 response ,具体如下:  [Chunk

ssl协议-sslv1协议中“秘钥导出”的计算过程

问题描述 sslv1协议中"秘钥导出"的计算过程 不同版本计算方式不同.我只知道大致用md5和sha加密生成主秘钥,再生成6个会话秘钥.可具体多少字节过程不知道,网上也没说清楚 解决方案 你想看密钥导出的过程?你可以去OPENSSL的官网下源代码,然后你在看看这个秘钥导出的过程到底是怎么导的.密钥导出涉及到握手,握手的时候会交换是哪个随机数组,这个三个随机数组是密钥导出的根本.在握手的时候,会协商加密套件,加密套件的协商之间决定了密钥导出的算法,有了加密套件,有了随机数组(即种子),最