今天写的是 WEB 性能调优中与 HTTP 相关的几个技术点:
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 流
有这么几个点:
参考: https://en.wikipedia.org/wiki/Chunked_transfer_encoding
8. 自己实现一个 GZIPFilter
下面是一个自己实现的精简版GZIPFilter;
注:这一版 GZIPFilter 是以 tk-filters-1.0.1 为基础,经过简化、修正实现的,仅供学习讨论; https://sourceforge.net/projects/filterlib/