你每天离不开压缩。打开网页,HTTP 响应体多半被 Content-Encoding: gzip 压过;保存一张截图,PNG 内部跑的是 DEFLATE;git 把每个对象塞进 zlib;你下载的 .zip、.gz、.tar.gz,本质都是同一族算法。我们早就把"文件能变小"当成理所当然,却很少有人追问:它凭什么能让 100MB 变成 10MB?那 90MB 去哪了?
Computerphile 这支由 Nottingham 大学 David Brailsford 教授主讲的《Compression》正是来拆解这个日常魔法的。它不长,只有十分钟出头,却把压缩的第一性原理讲得异常干净——压缩不是"凭空省空间",它的全部秘密只有四个字:砍掉重复。一支视频、一个教授、一块黑板,告诉你为什么文本能压、为什么 JPEG 已经压过就不能再压、以及那个最反直觉的结论——随机数据,你一比特都压不动,越压反而越大。
这篇文章以该视频为锚,补全视频没展开的工程实现:LZ77 的滑动窗口到底怎么工作、Huffman 为什么用变长编码、DEFLATE 如何把两者缝成 gzip 的真身,以及 Shannon 熵这个"天花板"如何决定了所有压缩算法的物理极限。看完你会真正理解:压缩的本质不是技术,是信息论。
| 项目 | 内容 |
|---|---|
| 视频标题 | Compression - Computerphile |
| 频道 | Computerphile(University of Nottingham) |
| 主讲 | Professor David Brailsford |
| 时长 | 约 10 分钟 |
| 播放量 | 百万级(Computerphile 经典科普视频) |
| 频道订阅 | 约 270 万 |
| 核心主题 | 无损压缩与有损压缩的第一性原理 |
这是 Brailsford 教授在视频里反复强调的底层逻辑(视频原话核心):所谓压缩,本质上是找出数据里重复出现的模式,然后用更短的符号去指代它。数据本身的信息量(información)一个比特都没少——少的是冗余的编码方式。
举个视频里会点到、我在这里彻底展开的例子:一段英文里,字母 e 出现的频率远高于 z。如果你坚持用 8 个比特(一个 ASCII 字节)等长编码每个字母,那么对 e 和 z 你都付了 8 比特的"票价",这显然不划算。压缩要做的,就是承认这种频率不均,让高频符号买短票、低频符号买长票。延伸分析:这其实就是 Huffman 编码的思想内核,也是为什么同样一段文字,英文能压到原始大小的 30%,而你已经加密过、看起来毫无规律的密文几乎压不动——因为加密把频率信息"抹平"了,把数据推向了最大熵。
记住这一条,后面所有的算法都是在围着它转:没有重复、没有规律,就没有压缩。
视频把压缩分成两大类(视频原话核心):
为什么图像能"骗眼睛"?延伸分析:因为人眼对亮度的敏感度远高于对色彩的敏感度(这是 JPEG 把 RGB 转成 YCbCr 后对色度通道大幅降采样的生理依据),且对高频细节的失真容忍度很高。所以 JPEG 敢直接丢掉一部分高频系数——它丢的是"你本来就看不太清"的信息。而 gzip、PNG、ZIP 属于无损阵营,一个比特都不能错。
这个分类看似常识,却是理解所有压缩工具选型的起点:你能不能"丢",决定了你能用哪一类算法。
视频用一个非常直觉的例子引入了第一种无损算法(视频原话核心):如果数据里出现连续的相同字符,比如 AAAAAAAAAA(10 个 A),你完全没必要老老实实写十遍,写成 A10 就够了。这就是游程编码(Run-Length Encoding, RLE)——用"字符 + 重复次数"替代连续串。
RLE 简单到令人发指,但它的局限也立刻暴露:只对"成片重复"的数据有效。文本里几乎没有连续几十个相同字母,所以 RLE 压文本几乎没用;但它压传真图像(大面积黑白)、BMP 位图却立竿见影。延伸分析:早期 PCX、部分 BMP 就用 RLE。RLE 的价值在于它揭示了压缩的统一公式——找到某种可被规律描述的结构,再用更短的符号重写它。LZ77 不过是把"成片相同"推广成了"成段相同"。
这是视频真正点名的现代无损压缩基石(视频原话核心)。LZ77 的天才之处在于:它不再只盯着"连续相同字符",而是开一个滑动窗口(sliding window),在窗口里找"刚才是不是出现过一模一样的片段"。如果出现过,就用一个指针 (距离, 长度) 指回去,告诉解压器"往前数 N 个字节,抄 M 个字节过来"。
延伸分析(视频未展开的工程细节,但这是 gzip 的真身):DEFLATE 里的 LZ77 有几个硬参数——
举个例子,文本 "the quick brown fox, the quick brown fox",第一次出现 "the quick brown fox" 时照实写字面量;第二次出现时,LZ77 直接回指——"往前 20 字节抄 19 字节"。这就是为什么重复越多,压缩率越高。HTML、JSON、源代码这种结构性极强、标签和关键字反复出现的格式,正是 LZ77 的猎物。这也解释了一个工程直觉:gzip 对文本效果好(能压到 1/3 到 1/5),对二进制/媒体文件效果差——因为它们已经被压过或本就高熵。
LZ77 把"重复"换成了指针,但输出流里的每个符号还是等长存储的。视频点到了压缩的另一半——变长编码。延伸分析:Huffman 编码(DEFLATE 的第二阶段)干的就是这件事:统计每个符号的出现频率,构建一棵前缀树,让高频符号(如空格、字母 e)分到 3-4 比特的短码,低频符号(如 z、q)分到 10 多比特的长码。加权平均下来,每个符号的平均码长逼近 Shannon 熵。
Huffman 有个硬约束:必须是前缀码(prefix code)——任何一个符号的编码都不能是另一个符号编码的前缀,否则解码时无法判断边界。Huffman 树天然满足这点。延伸分析:DEFLATE 里 Huffman 有两种模式——固定 Huffman(用预设码表,省去传码表的开销)和动态 Huffman(根据实际数据统计出最优码表,连同码表一起写进压缩流)。聪明的是,连"码表本身"DEFLATE 都再用一次类 LZ 的游程压缩,把元数据也压一遍——这种"压缩的压缩"是 DEFLATE 效率的关键。
视频讲的是原理,但很多观众看完仍不知道 gzip 到底是什么。延伸分析(关键科普):这是开发者最常混淆的一组概念——
git、PNG 用的就是它。.gz 单文件和 HTTP 传输。所以"ZIP、GZIP、zlib 是不是一回事?"——算法内核(DEFLATE)是同一个,外层包装不同。这条冷知识能解决 90% 的开发者对压缩格式名混乱的困惑。
这是整支视频(也是整个压缩理论)最该被记住的一句话(视频原话核心 + 我的强调):压缩不能凭空创造空间,它有天花板,这个天花板叫 Shannon 熵。
延伸分析:Claude Shannon 在 1948 年证明,一段数据的信息熵 H = −Σ p·log₂(p) 给出了无损压缩的理论下界——你不可能把数据无损压到平均码长低于它的熵。已经接近最大熵的数据(加密密文、随机数、已压缩过的 JPEG/MP4)几乎没有冗余可砍,所以压不动。
更尖锐的是鸽巢原理(pigeonhole principle)的反证:所有长度为 N 比特的输入共有 2ⁿ 种,而长度 < N 比特的输出只有不到 2ⁿ 种——必然存在某些输入,压完反而变长(否则多对一的映射会让信息无法还原)。所以压缩算法都内置了"压缩失败就原样存储"的逃生通道:如果某个块压完比原来还大,DEFLATE 会标记为 stored 块,原封不动写进去。这也是为什么给 .zip 再 .zip 一遍,文件不但不会变小,还会因为多了文件头而变大。
一句话锁死:压缩是在低熵数据上赚钱的生意,对高熵数据它要亏本。
这是视频完全没涉及、但工程师必须知道的一层(纯延伸分析)。既然压缩会把"重复/相似"压得更短,那么响应体长度本身就泄露了内容信息。攻击者正是利用了这一点:
这条把"压缩"和"安全"焊在一起:压缩不是免费的——它在缩短数据的同时,也在制造一个隐蔽的信息侧信道。
flowchart TD
A["原始数据 Raw Data<br/>(低熵 = 可压 / 高熵 = 压不动)"] --> B{"第一性原理:<br/>有冗余/规律吗?"}
B -->|是| C["无损压缩 Lossless"]
B -->|否 / 已是高熵| Z["压不动,再压反而变大<br/>Shannon 熵 = 天花板"]
C --> D["第一步:LZ77<br/>滑动窗口 32KB 找重复<br/>输出 字面量 + 距离/长度指针"]
D --> E["第二步:Huffman<br/>高频短码 / 低频长码<br/>前缀码保证可解码"]
E --> F["DEFLATE 算法<br/>= LZ77 + Huffman"]
F --> G1["gzip 包装<br/>RFC1952 / .gz / HTTP"]
F --> G2["zlib 包装<br/>RFC1950 / git / PNG"]
F --> G3["ZIP 容器<br/>多文件归档 + DEFLATE"]
C --> H["有损压缩 Lossy<br/>JPEG/MP3/H.264<br/>丢人眼/人耳不敏感的频率"]
G1 --> I["⚠ 安全侧信道<br/>CRIME / BREACH<br/>长度泄露内容"]
对开发者而言,理解 DEFLATE 不是玄学,而是一组可操作的工程判断:
gzip_types 不包含图片的原因。gzip 4~6 平衡速度与压缩率;离线打包分发可以用 gzip 9 或 zstd --ultra。Facebook 推的 Zstandard(zstd) 是 DEFLATE 的现代替代,同压缩率下快一个数量级,新项目值得直接上。gzip 一个 .jpg 只会更大。判断一个文件"压不压得动",看熵:接近随性的文件,放手。git 用 zlib 压对象、很多数据库(如列存、ClickHouse、Parquet)默认带压缩——理解 LZ77+Huffman,你就能理解为什么"列存 + 压缩"是分析型查询的标配:列内数据同质度高、冗余多,正是 LZ77 最爱的猎物。一句话行动指南:先判断熵,再决定压不压;压文本,别压媒体;开 gzip,想安全。
压缩不是魔法,它的全部秘密是"砍掉重复"——LZ77 找重复、Huffman 给短码,缝成 DEFLATE;而 Shannon 熵决定了天花板,随机数据一比特都压不动,开 gzip 还得防着它把长度变成泄露内容的侧信道。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
