业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

13|哈夫曼树:HTTP2.0是如何更快传输协议头的?

优化压缩率
变长编码,频繁字符使用短编码
适应性编码
会话期间学习和存储头部字段
减少重复传输
预定义常见头部字段
学习协议权威参考
定义网络协议标准
讨论哈夫曼树的局限性和适用场景
h2load工具测试HTTP/2.0压缩效果
哈夫曼编码可进一步提升压缩效果
HPACK可达到50%以上压缩率
适用于多媒体文件
允许数据丢失
适用于HTTP头部压缩
保留原始数据完整性
时间复杂度 O(N*logN)
使用优先队列(堆)维护最小频率节点
重复直到形成一棵树
合并频率最低的两个节点
初始化所有字符为独立节点
高频字符近根节点,低频字符远根节点
贪心算法构建最优前缀编码
哈夫曼编码
动态表
静态表
RFC文档
哈夫曼树是否总是最优?
实际应用
压缩率
有损压缩
无损压缩
编码实现
构建过程
基本概念
方法
目的:减少HTTP头部大小,提高传输效率
支持多路复用、服务器推送等特性
解决HTTP/1.1的性能限制
提高传输效率
引入HPACK压缩协议头
参考资料
课后思考
性能提升
压缩技术
哈夫曼树
HPACK压缩
HTTP/2.0
HTTP/2.0 与 HPACK

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
HTTP 是当今最广为使用的互联网传输协议,我们都听说过 HTTP/1.0、HTTP/2.0、SPDY、HTTP/3.0 等概念,但是对这几者之间的区别能如数家珍的同学却不多,比如 HTTP/2.0 在编码方面做了什么样的改进,比 HTTP/1.1 的传输更快呢?
我们今天就来学习一下 HTTP/2.0 为了提高传输效率而引入的用于头部压缩的杀招:HPACK
HPACK 应用了静态表、动态表和哈夫曼编码三种技术,把冗余的 HTTP 头大大压缩,常常可以达到 50% 以上的压缩率。其中的哈夫曼编码,底层主要就依赖了我们今天会重点学习的哈夫曼树,这也是广泛运用在各大压缩场景里的算法。
在展开讲解 HTTP/2.0 中的 HPACK 到底是怎么工作的,我们首先要来思考一下为什么要压缩 HTTP 的头,或者说,压缩到底又是什么呢?

压缩技术

我们都知道压缩技术诞生已久,在各种文件尤其是多媒体文件里,应用非常广泛,能帮助节约信息的存储空间和网络传输时间。
之所以能压缩,主要原因就是我们存储的信息往往是有模式和冗余的。以文本为例,大量单词的重复或者大量的空格,都是我们可以压缩的空间。原文件大小与压缩后文件大小的比值,我们就叫做压缩比,是衡量压缩算法有效性非常直观的指标。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP/2.0的HPACK技术引入了HPACK压缩协议头,通过静态表、动态表和哈夫曼编码技术,大大压缩了HTTP头,提高了传输效率。哈夫曼编码通过贪心算法实现最优前缀码,让出现频率高的字符用更短的编码表示,从而实现文本压缩。HPACK技术带来了显著的HTTP头大小变化,通过哈夫曼编码,HPACK可以达到高达30%-80%的压缩率,为HTTP/2.0协议带来了重大的优势。文章还介绍了HPACK的工作原理和压缩效果,以及哈夫曼编码的原理和实现过程。此外,文章还提到了HPACK的应用场景和与微服务架构下消息传递的类似之处,以及对哈夫曼树在HTTP/2.0中获得更优编码方式的讨论。整体而言,HPACK技术在HTTP/2.0中的应用为读者带来了对HTTP头压缩和传输效率提升的深入了解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • Paul Shan
    如果所有字母出现的概率都相等,哈夫曼编码压缩就失败了,好像也没有什么编码能够处理这种情况。

    作者回复: 是的 已经是熵最大的情况了

    2022-01-08
    1
  • 大土豆
    老师说错啦,大多数语言的char类型,是两个字节,应该就C/C++是一个字节,原因是很简单的,asc2码没法表示中文,char a='中',这种必须得两个字节才能存,C/C++中char就不行了,得w_char,其他语言为了避免这种情况,char都设计成两个字节,当然,现在两个字节也已经装不下完整的unicode编码了,比如U+a3e8b这种码点,Java底层还得做特殊处理,这也是面试的一个考点。
    2022-01-30
    5
  • 加油加油
    静态哈夫曼编码能保证绝对的准确性吗,是否依赖于采样数据的数量?
    2022-10-14归属地:上海
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部