SPDY是HTTP2的催化剂,但SPDY不是HTTP2。

本文主要针对SPDY与HTTP2之间的区别,而不太多的涉及它俩之间与HTTP1.X的区别。

SPDY的出现

SPDY是谷歌在09年年中时发布的,它的主要目标时通过解决HTTP1.1中一些显著的性能限制,来减少网页额的加载时间。目前为止,Chrome,Firefox和Opera都支持了这一协议。

SPDY引入了新的二进制分帧层,以实现多路复用、优先次序、最小化的消除网络延迟,同时对HTTP首部进行压缩,减少HTTP报文的冗余数据。

目前为止,我们只在实验室条件下测试过 SPDY。最初的成果很激动人心:通过模拟的家庭上网线路下载了 25 个最流行的网站之后,我们发现性能的改进特别明显,页面加载速度最多快了 55%。
——A 2x Faster Web Chromium Blog

一方面由于随着web应用的发展,HTTP1.1协议的局限性突显的越来越严重,另一方面由于SPDY的优秀表现,12年初,W3C向全社会征集HTTP2的建议,最终决定将SPDY规范作为制定标准的基础。

随后的时间内,SPDY与HTTP2共同进化,HTTP2提出新规范或新功能,SPDY为它进行测试和验证。当HTTP2一切就绪之日,就是SPDY退出舞台之时。事实上,在今年2月谷歌公司已经宣布将在16年年初放弃对SPDY的支持。

目前各浏览器对SPDY和HTTP2的支持情况分别如下:

SPDY与HTTP2的区别

  • 头部压缩算法,SPDY,通用的deflate算法[注1];HTTP2,专门为压缩头部设计的HPACK算法
  • SPDY必须在TLS上运行,HTTP2可在TCP上直接使用,因为增加了HTTP1.1的Upgrade机制
  • 更加完善的协议商讨和确认流程
  • 更加完善的Server Push流程
  • 增加控制帧的种类,并对帧的格式考虑的更细致

  1. deflate算法
    这个算法是由2个算法组合而成,哈夫曼编码和LZ77编码。

哈夫曼编码
一种无前缀编码,简单来说就是长字符串用短编码表示,以最终达到减少总大小的目的。具体编码过程可参考Huffman 编码压缩算法

例如,在一篇英语文章中,字母“E”出现的频率最高,“Z”最低,如果我们采用字符编码,那么每一个字母都是8bit表示;但是如果,我们使用不定长的bit编码,频率高的字母用比较短的编码表示,频率低的字母用长的编码表示,就会大大缩小文件的空间。

1
2
3
4
5
6
7
8
9
10
字符编码
A00101001
B00101010
C00101011……
哈夫曼编码
A 0
B 10
C 110
D 1110
E 11110

大致思路:每次总是选取频率最小两个节点,将其频率相加,最终构成一个最优二叉树。
例如:有A,B,C,D,E五个字符,出现的频率(即权值)分别为5,4,3,2,1,那么我们第一步先取两个最小权值作为左右子树构造一个新树,即取1,2构成新树,其结点为1+2=3

虚线为新生成的结点,第二步再把新生成的权值为3的结点放到剩下的集合中,所以集合变成{5,4,3,3},再根据第二步,取最小的两个权值构成新树,如图:

再依次建立哈夫曼树:

其中各个权值替换对应的字符即为下图:

所以各字符对应的编码为:A->11,B->10,C->00,D->011,E->010

LZ77编码
字典压缩算法,用到的场景比如gzip。具体算法可参考,须翻墙

这个算法的主要思想是:文件中有两块内容相同的话,那么只要知道前一块的位置和大小,我们就可以确定后一块的内容。所以我们可以用(两者之间的距离,相同内容的长度)这样一对信息,来替换后一块内容。由于(两者之间的距离,相同内容的长度)这一对信息的大小,小于被替换内容的大小,所以文件得到了压缩。

大致流程如下:
可构想出2个窗口,一个作为搜索缓存区(已完成搜索的字符),一个作为待搜索窗口。如下图

编码过程:

  • 如果待搜索字符c没在搜索缓存区中找到,则输出(0,0,c),同时,整个窗口向前移动1位
  • 如果待搜索字符c在搜索缓存区中找到,起始位置在搜索缓存区中x,连续长度是offset,待搜索窗口中offset之后的一个字符是d,则输出(x, offset, d)。之后,整个窗口向前移动offset位。
  • 最终输出的三元组就是压缩码

解码过程:

参考

  1. 哈夫曼树与哈夫曼编码