接下来打算把HTTP2协议的头部压缩算法给翻译下,敬请等候。

HPACK - Header Compression for HTTP/2

HPACK:HTTP/2头部压缩

概要说明

这个规范定义了HPACK,它是应用在HTTP/2中的了为了更加有效的表示HTTP头部属性的压缩格式规范。

内容列表

1.介绍

在HTTP/1.1中,头部域是没有压缩的。如果web页面请求从十几个增加大几百个,那么这些请求中的头部域就会消耗很多的带宽从而造成延迟。

SPY通过使用DEFLATE格式来压缩头部域的方式来解决这个问题,这个方法在表示大量的头部域中也是被证明是非常有效的。但是,这个方式在CRIME(Compression Ratio Info-leak Made Easy)攻击中就会暴露出安全隐患。

这个规范定义了一个可以头部域冗余的压缩器HPACK,它隐藏了安全攻击的弱点而且在有限制的环境中使用有界的内存。更多的关于HPACK的安全问题在Section 7部分。

HPACK格式被设计的简单和灵活。这两个特点减少了由于事先错误产生的互用性的隐患或者安全问题。它没有定义扩展机制,所以改变这种格式的唯一途径就是通过定义一个完整的替代者。

1.1概述

在这个规范中,会把头部域当成一个有序的名-值对的集合,而且有可能含有重复的名值对。名字和值会被当成八进制的,而且在解压缩后头部域的顺序会被反转。

头部域列表会被编码为映射头部域到索引值中。而且这些头部域列表在当新的头部域被解码或者编码后会更新。

在编码后,一个头部域要么是头部域列表中的一个值要么是指向一个头部域列表中的引用。因此,通过使用引用或者具体的值就可以对头部域进行编码。

字面值可以被直接编码也可以使用一个静态的哈夫曼编码。

一个编码器需要决定头部域列表中的哪一个头部域作为一个新的输入来插入。而解码器在重新构建头部域列表的过程中需要执行编码器对头部域进行的修改。这个样就解码器能够比较简单而且和种类繁多的编码器保持协作。

1.2约定

这个文档中的关键字 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL"在RFC2119中能够得到合适的解释。

所有的数字都是以网络中的字节排序。除非由说明否则值都是无符号的。字面值按需要可能是小数的也可能是十六进制的。

1.3术语

这个规范中使用了下面的术语:

Header Field(头部域):一个名-值对。名字和值都是以八进制存在的。

Dynamic Table(动态表):动态表是用于存放含有索引值的头部域的。这个表示动态变化的而且针对于编码或者解码的内容的。

Static Table(静态表):静态表只要用于存放含有索引值的频繁出现的头部域的。这个表是有序的、只读、可访问的而且在几乎所有的编码或者解码的内容中可以共享的。

Header List(头部列表):头部列表是头部域的有序集合一起被编码的而且可能含有重复头部域。一个完整的含有Http/2头部快的头部域就是一个头部列表。

Header Field Respresentation(头部域表示):一个头部域在编码后可以以一个字面值也可以是一个索引值。

Header Block(头部块):一个有序的头部域表示在被解码的时候就是一个完成头部列表。

2.压缩过程概述

这个规范中没有表述针对一个编码器的具体算法。取而代之的是,它详细的定义了解码器需要做的事情,而且允许一个编码器产生这个规范允许的任何编码形式。

2.1头部列表序列

HPACK保证在头部列表中的头部域是有序的。一个编码器必须根据头部域在原始头部列表中的顺序来排序在头部块中的头部域。一个解码器必须根据在头部块的排列序列来在解码的头部列表排列头部域。

2.2内容的编码和解码

为了解压头部块,一个解码器只需要把动态表当做一个解码的内容来进行操作。不再需要其他的动态状态了。

比如在HTTP中,当用于双线的通信时,被某一端操作的编码和解码都是完全独立的,动态表的请求和相应都是独立的。

2.3索引化表

HPACK使用两个表格来将头部域和索引联系在一起。静态表被提前定义好并且含有公共的头部域(大部分的值都是空的)。动态表是动态的而且能够被编码器指向在编码的头部列表中重复的头部域的索引的时候。

这两个表为了定义索引值会结合成一个单一的地址空间。

2.3.1静态表

静态表是由提前定义好的静态头部列表组成。它的输入时在Appendix A中定义的。

2.3.2动态表

动态表是由头部域的列表组成,而且是按照先进先出的序列来操作的。第一个和最新加入动态表的索引值是最低的,而最先进入动态表的索引值是最高的。

动态表是初始化的时候是空表。当每个头部块被解压的时候就会添加新值。

动态表能够含有重复的值。因此,重复的值不能够被解码器当做是一个错误。

编码器决定如何去更新动态表而且能够控制被动态表使用的内存大小。为了限制解码器需要的内存,动态表的大小是被严格限制的。

解码器在处理头部域表的列表的时候会更新动态表。

2.3.3地址空间索引

静态表和董彪会被组合成单一的地址索引空间。

在1和静态表长度之间的mul指向了静态表中的元素。

比静态表长度的索引目录会指向动态表的元素。静态表的长度被减掉就是动态表的索引值的开始。

而比两个表的长度之和都大的索引一定是解码错误。

对于一个静态表的大小s和动态表的大小k,下面的图表示了完整的合法的索引地址空间。

    <----------  Index Address Space ---------->
<-- Static Table --> <-- Dynamic Table -->
+---+-----------+---+ +---+-----------+---+
| 1 | ... | s | |s+1| ... |s+k|
+---+-----------+---+ +---+-----------+---+
^ |
| V
Insertion Point Dropping Point

2.4头部域表示

一个编码的头部域既可以是一个索引也可以是一个字面值。

一个索引化的表示定义了头部域的指向了静态表或者动态表的引用。

一个字面表示就是通过指明它的名字或者值来定义头部域。头部域名字能够用字面值来表示或者指向静态表或者动态表的值。头部域的值就是以字面量来表示的。

有三种不同的字面表示定义如下:

  • 在动态表的开始处作为一个新的输入来添加头部域的字面表示。
  • 不需要添加到动态表的头部域的字面表示。
  • 含有额外的规定的头部域一般使用字面值表示,特别是通过中间媒介重新编码的。这种表示是为了避免压缩的时候头部域的值没有保存。

为了保护敏感的头部的值的时候,这些字面值的选择能够在做安全考虑的时候起到指导意义。

一个头部域的名字或者头部域的值的字面表示既能够直接使用八进制也可以使用一个静态的哈夫曼码。

3.头部块解码

3.1头部块处理

一个解码器在处理一个头部块的时候通常会重建原始的头部列表。

一个头部块就是头部域表示的串联。不同的头部域表示描述可见Section 6

一旦头部域被家吗并且被添加到重建的头部列表中,头部域就不能够被移除了。一个被添加到头部列表的头部域可以被安全的传给应用程序。

通过传递头部域给应用程序,一个解码器在除了动态表需啊哟的内存外能够使用最小的瞬息内存来进行提交处理。

3.2头部域表示处理过程

HTTP2协议之HPACK--之头部压缩规范介绍的更多相关文章

  1. http2.0之头部压缩

    什么是头部压缩?为什么要头部压缩? 我们知道,http请求和响应都是由[状态行.请求/响应头部.消息主题]三部分组成的. 一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件 ...

  2. HTTP2协议主要改进点

    1.改成二进制协议,每次传输二进制帧,帧有以下几个字段 类型type,长度length,flag,StringID流标志,Payload负载,最基础的两种类型HEAD类型和DATA类型 2.多路复用, ...

  3. Http2协议简介

    1.概述 和http1兼容.HTTP/2 没有改动 HTTP 的应用语义. HTTP 方法.状态代码.URI 和标头字段等核心概念一如往常. 不过,HTTP/2 修改了数据格式化(分帧)以及在客户端与 ...

  4. 基于奇林软件kylinTOP工具的HTTP2协议的压力测试

    1.HTTP协议概述 说到http,那就应该先了解一下http协议的发展历史.关于http协议的历史,可以参考阮一峰老师的这篇博客文章HTTP 协议入门,里面介绍的比较详细了.简单来说http先后存在 ...

  5. 轻松让你的nginx服务器支持HTTP2协议

    目录 简介 HTTP1.1和HTTP2 安装最新的nginx 开启HTTP2支持 添加SSL支持 修改加密算法 Diffie–Hellman对消息进行加密 重定向所有的HTTP请求到HTTPS 启动n ...

  6. nginx支持http2协议

    1.http2协议 HTTP 2.0 的主要目标是改进传输性能,实现低延迟和高吞吐量.从另一方面看,HTTP 的高层协议语义并不会因为这次版本升级而受影响.所有HTTP 首部.值,以及它们的使用场景都 ...

  7. 老猿学5G扫盲贴:推荐三篇介绍HTTP2协议相关的文章

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 5G中的服务化接口调用都是基于HTTP2协议的,老 ...

  8. 基于SIP和RTP协议的开源VOIP之QuteCom简单介绍

    **************************************************************************************************** ...

  9. JavaSript模块规范 - AMD规范与CMD规范介绍(转)

    JavaSript模块规范 - AMD规范与CMD规范介绍 JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者 ...

随机推荐

  1. 【Spark亚太研究院系列】Spark道路的真正的主人-第一章 构建Spark星团(第五步)(6)

    结束historyserver例如,下面的命令可以看到: 第四步:验证Hadoop分布式集群 首先在hdfs文件系统上创建两个文件夹.创建步骤例如以下所看到的: watermark/2/text/aH ...

  2. linux如果不进入window磁盘

    最近,在windows8.1下安装ubuntu14.04,在windows沉睡.开放时间和进入选择进入系统选项,当时没有引起重视.他选择进入linux系统.但进入后,发现无法进入windows磁盘,百 ...

  3. ubuntu下安装myeclipse

    一.下载myeclipse 官网下载:http://www.myeclipseide.com/ 我使用的是myeclipse pro 2014.run,重命名为myeclipse.run 示例路径:/ ...

  4. Android变化如何破解几场金

    我们在玩游戏的总会遇到一些东西需要购买,但是,我们可能要花钱,那么我们应该怎么办呢?这与游戏的插.我们在这里谈论的Android游戏,搜索互联网上的移动端游戏插件,您可能会发现一个叫段:八门神器.ap ...

  5. UVALive 5099 Nubulsa Expo 全球最小割 非网络流量 n^3

    主题链接:点击打开链接 意甲冠军: 给定n个点m条无向边 源点S 以下m行给出无向边以及边的容量. 问: 找一个汇点,使得图的最大流最小. 输出最小的流量. 思路: 最大流=最小割. 所以题意就是找全 ...

  6. 博客测试:博客系统i94web beta1.0 申请测试

    如何做了最近的博客更新,因为已经在线路和代码,我写了一个小博客系统:i94web,草草宣布beta1.0,请求您测试各种漏洞. 先看几张截图. 首页: watermark/2/text/aHR0cDo ...

  7. 异步编程和线程的使用(.NET 4.5 )

    C#:异步编程和线程的使用(.NET 4.5 )   异步编程和线程处理是并发或并行编程非常重要的功能特征.为了实现异步编程,可使用线程也可以不用.将异步与线程同时讲,将有助于我们更好的理解它们的特征 ...

  8. ftp设置(2015-04-04)[转]

    anonymous_enable=YES /允许匿名访问 12行local_enable=YES /允许本地用户访问(/etc/passwd中的用户) 15行write_enable=YES /允许写 ...

  9. ABP模块系统

    ABP模块系统 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP ...

  10. CSS定位:几种类型的position定位的元素

    当人们刚接触布局的时候都比较倾向于使用定位的方式.因为定位的概念看起来好像比较容易掌握.表面上你确切地指定了一个块元素所处的位置那么它就会坐落于那里.可是定位比你刚看到的时候要稍微复杂一点.对于定位来 ...