首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WEB性能调优:gzip 与 chunked

WEB性能调优:gzip 与 chunked

作者头像
WEBJ2EE
发布2019-07-19 11:53:19
3.1K0
发布2019-07-19 11:53:19
举报
文章被收录于专栏:WebJ2EEWebJ2EE

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

  • gzip 压缩传输;
  • chunked 分块传输;

1. gzip 是什么 ?

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

2. gzip 有多优秀 ?

... 用数据说话 ...

开启 gzip 压缩前:

开启 gzip 压缩后(Tomcat):

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

3. gzip 文件格式

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

记住:0x1F8B08 就是 gzip 的标识

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

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

代码写的不是很严谨

仅供参考

5. HTTP 的 chunked 传输

一般 HTTP 会用 Content-Length 标识响应内容的长度,浏览器(比如:IE

)会等接受完 Content-Length 长度的字节后,才开始解析页面,否则就会白屏,一直等;

看!

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

白屏了!

(远离IE,珍爱生命)

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

6. chunked 协议细节

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

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

7. chunked 遇到 gzip 什么套路?

图1:开启 Tomcat 的 gzip

图2:用 Wireshark 观察 TCP 流

有这么几个点:

  • Tomcat 用 gzip 压缩响应数据的同时,也使用了分块传输(chunked)机制;
  • chunked + gzip 模式下,每个 chunk 并不是一个可独立解压的 gzip 包,而是将整个报文 gzip 压缩后再通过 chunk 分块(看下图);
  • 第一个 chunk 只有 10 个字节,包含了 gzip 的文件头(0x1f 8b 08);

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

8. 自己实现一个 GZIPFilter

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebJ2EE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档