30 | 时代之风(上):HTTP/2特性概览
为什么不是 HTTP/2.0
HTTP/2的前身是GOOGLE研发的SPDY协议,经过IETF的规范,目前的标准是RFC7540。
HTTP/2的命名不是HTTP/2.0,它摒弃了小版本号,以后只有HTTP/2,HTTP/3。这是因为HTTP是互联网基础技术,版本的进化需要相对的稳定性,频繁的版本变容易造成混乱。
兼容 HTTP/1
因为有大量现有资源基于HTTP/1,所以必须要兼容HTTP/1。HTTP/2在URI层面,没有引入新的scheme,还是http和https。另外,把HTTP分为语义和语法2部分,语义方面如请求/应答模式,URI,状态码,头字段等概念仍沿用HTTP/1,消除了学习成本,上层应用无需修改,即可无缝移植。但具体的底层实现则不同,甚至差别很大,比如采用了二进制编码,取消了版本号,引入了流,帧等概念。
头部压缩
HTTP/2中引入HPACK算法对头部进行压缩。
压缩的必要性:HTTP头部通常很大,而实体很小,尤其是GET方法。例如,实例:30-1,头部有530个字符,而实体只有94个字符。
具体实现:HPACK,两端建立字典,用索引替代头字段,并对数字,字符采用哈夫曼编码,大幅减少了需要传输的头字段字节数,并随着时间的推移,字典复用率越高,压缩效果越好。
如何同步字典是个问题。
二进制格式
HTTP/2中消息格式采用二进制方式,易于计算机实现,消除ASCII码明文消息带来的歧义和处理复杂性。另外采用二进制编码需要的字节数也更少,比如数字10000,采用ASCII编码,需要5个字节,而二进制编码只需2个字节。
虚拟的“流”
多路复用:多路指的是虚拟的流,复用是指复用同一个TCP连接。
HTTP/2中引入了流,帧等概念,实现多路复用,消除了HTTP层面的头部阻塞。
HTTP/2中的消息,流和帧的关系:
HTTP/2中主要的工作逻辑还是收发模式,一条HTTP/2消息,从用户角度看,对应一次HTTP请求或回应。从实现角度看,一条消息对应一个流,流由若干个帧组成,用ID标识帧所属的流,每个帧是消息的一部分,是流的具体实现,所以说HTTP/2中的流是虚拟的。
强化安全
采用TLS1.2+,强化了安全性
协议栈
基于TCP/TLS1.2+,实现了HPACK和Stream
问题:如何保证帧的接收的有序性?TCP序号保证?是的
课后作业
你觉得明文形式的 HTTP/2(h2c)有什么好处,应该如何使用呢?
HTTP/2 h2c明文形式方便内部学习,培训,或内部对于安全性要求不高的情况。
注:HTTP/2 h2c建立连接时协商升级过程和HTTP/2是不同的。
HTTP/2 h2使用的是TLS的ALPN,而HTTP/2 h2c使用的是connection和upgrade头字段。
你觉得应该怎样理解 HTTP/2 里的“流”,为什么它是“虚拟”的?
HTTP/2的流对应于HTTP中的消息,但TCP上传递的不是流而是帧,帧是消息的片段,用流ID标记帧属于哪个流,从逻辑上看,仿佛由帧构成的若干的流在服务端客户端之间流动,所以流是虚拟的。
你能对比一下 HTTP/2 与 HTTP/1、HTTPS 的相同点和不同点吗?
相同点,它们都是web服务的重要支撑技术,负责数据的点到点传输。
区别:
HTTP/1明文,无安全性,性能不足,有队头阻塞问题。
HTTPS 相对HTTP/1增加了安全性,其它一样。
HTTP/2相对HTTP/S,提高了性能,解决了HTTP层面的队头阻塞问题,服务器可以主动推送数据。
提升性能是通过压缩头字段
解决HTTP队头阻塞是通过引入流和帧,虚拟的流通过TCP收发,某个流的阻塞不会影响其它流的收发,故而解决了HTTP队头阻塞问题。