先说结论
- Http/1.0到Http/2,都是利用TCP作为底层协议进行通信的。
- Http/1.1,引入了长连接(keep-alive),减少了建立和关闭连接的消耗和延迟。
- Http/2,引入了多路复用:连接共享,提高了连接的利用率,降低延迟。
HTTP2.0和HTTP1.X相比的新特性
- 新的二进制格式(Binary Format),Http1.x的解析是基于文本,基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合,基于这种考虑Http2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用(MultiPlexing),即连接共享,即每个request都是用作连接共享机制的,一个request对应一个id,这样一个链接上可以有多个request,每个链接的request可以随机的混杂在一起,接收方可以根据request的id将request的id将request再归属到各自不同的服务端请求里面。
- header压缩,如上文中所言,对前面提到过的header带有大量信息,而且每次都要重复发送,Http20使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复的header的传输,又减少了需要传输的大小。
- 服务端推送(server push),同SPDY一样,Http2.0也具有server push功能。
- HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?
- HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
- HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
- HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;具体如图:
- 为什么需要头部压缩?
假定一个页面有100个资源需要加载(这个数量对于今天的Web而言还是挺保守的), 而每一次请求都有1kb的消息头(这同样也并不少见,因为Cookie和引用等东西的存在), 则至少需要多消耗100kb来获取这些消息头。HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。
- HTTP2.0多路复用有多好?
HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。