WEB性能调优:gzip 与 chunked

Posted WebJ2EE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WEB性能调优:gzip 与 chunked相关的知识,希望对你有一定的参考价值。

WEBJ2EE

分享技术小干货,快来关注吧。  

WEB性能调优:gzip 与 chunked


今天写的是 WEB 性能调优中与 HTTP 相关的几个技术点:

  • gzip 压缩传输;

  • chunked 分块传输;


WEB性能调优:gzip 与 chunked


1. gzip 是什么 ?


gzip 是 GNU zip 的缩写,是一种流行的文件压缩算法;gzip 常用于压缩CSS、JS、html 等纯文本内容,可以节省大量网络带宽流量;


2. gzip 有多优秀 ?


... 用数据说话 ...

开启 gzip 压缩前:

WEB性能调优:gzip 与 chunked

开启 gzip 压缩后(Tomcat):

WEB性能调优:gzip 与 chunked

注:如何开启Tomcat、Weblogic的gzip压缩传输功能,猛戳


3. gzip 文件格式


gzip 文件由 1 到多个“块”组成,实际上通常只有1个块。每个块包含头、数据和尾三部分。


WEB性能调优:gzip 与 chunked


记住:0x1F8B08 就是 gzip 的标识


4. 如何用 Java 实现 gzip 压缩/解压


Java 的 I/O 体系提供了 GZIPOutputStream 和 GZIPInputStream,分别用于 gzip 的压缩和解压;


代码写的不是很严谨

仅供参考


WEB性能调优:gzip 与 chunked

WEB性能调优:gzip 与 chunked


5. HTTP 的 chunked 传输


一般 HTTP 会用 Content-Length 标识响应内容的长度,浏览器(比如:IEWEB性能调优:gzip 与 chunked)会等接受完 Content-Length 长度的字节后,才开始解析页面,否则就会白屏,一直等;


WEB性能调优:gzip 与 chunked


看!

IE这个坑货把请求挂起了!

白屏了!

(远离IE,珍爱生命)


HTTP 1.1 协议中的分块传输编码(Transfer-Encoding: chunked)是一种数据传输机制,它允许服务器将响应数据分成多个块(chunk),分批发送给浏览器。浏览器则不需要等到内容字节全部下载完成,只要接收到一个 chunked 块就可以开始解析页面。


WEB性能调优:gzip 与 chunked


6. chunked 协议细节


WEB性能调优:gzip 与 chunked

参考:https://tools.ietf.org/html/rfc2616#section-3.6.1


... 用报文举例说明 ...


WEB性能调优:gzip 与 chunked


7. chunked 遇到 gzip 什么套路? 


图1:开启 Tomcat 的 gzip

WEB性能调优:gzip 与 chunked

图2:用 Wireshark 观察 TCP 流

WEB性能调优:gzip 与 chunked


有这么几个点:

  • Tomcat 用 gzip 压缩响应数据的同时,也使用了分块传输(chunked)机制;

  • chunked + gzip 模式下,每个 chunk 并不是一个可独立解压的 gzip 包,而是将整个报文 gzip 压缩后再通过 chunk 分块(看下图);

  • 第一个 chunk 只有 10 个字节,包含了 gzip 的文件头(0x1f 8b 08);


WEB性能调优:gzip 与 chunked

参考:

https://en.wikipedia.org/wiki/Chunked_transfer_encoding


8. 自己实现一个 GZIPFilter


下面是一个自己实现的精简版GZIPFilter;

WEB性能调优:gzip 与 chunked

注:这一版 GZIPFilter 是以 tk-filters-1.0.1 为基础,经过简化、修正实现的,仅供学习讨论;

https://sourceforge.net/projects/filterlib/


WEB性能调优:gzip 与 chunked

注:扫码获取完整源码


精选文章推荐






  

以上是关于WEB性能调优:gzip 与 chunked的主要内容,如果未能解决你的问题,请参考以下文章

性能调优--gzip缓存content-download逐针渲染Queueing动态延迟加载最小化主线程工作

这都2021年了,还不会Feign性能调优?Feign性能调优之gzip压缩实现-自娱自乐篇

tomcat 性能调优

Nginx:17---反向代理之(反向代理服务器的性能调优:缓冲数据缓存数据存储数据压缩数据(gzip模块))

JVM性能调优

性能调优