HTTP/2协议
Http是超文本传输协议(Hypertext Transfer Protocol Bis)的下一代版本, Http2.0只用于https://网址, 目的是在开放互联网上增加使用加密技术, 已提供强有力的保护.
Http/2 主要提供了三个新特性 :
- 异步连接多路复用.
- 头部压缩.
- 新的二进制格式(binary Format).
- 服务端推送(server push).
在讲Http/2之前, 先讲讲HTTP是什么?
超文本传输协议HTTP
1. 什么是HTTP协议?
在我们作为用户访问互联网的时候, 随时随地都用到了HTTP协议.在我们使用浏览器上网的时候, 浏览器和服务器之间的请求和响应的交互, 必须按照规定的格式和遵循一定的规则. 我们把这些格式和规则称为超文本传输协议HTTP.
HTTP协议主要的几个特别:
- 它底层使用的是面向连接的TCP作为运输层协议, 保证数据的可靠传输.
- HTTP本身是一个无状态的协议, 即它不要求服务器保留客户的任何状态.
2. 持久连接和非持久连接
HTTP协议有众多的版本, 在最早的HTTP0.9版本中, HTTP协议只支持一些简单的GET操作, 服务器返回一些HTML的文档.
在HTTP1.0中引入了POST和HEAD命令, 是的浏览器和服务器之间有了更多交互的动作. 但是这个版本的HTTP是一个非持久连接的方式, 即每一次请求/响应都会对应一个TCP连接, 每一次请求都会建立TCP连接, 收到响应后就会断开TCP连接. 浏览器会把请求报文放在TCP三次握手的第三次中, 作为TCP确认报文发送给服务器, 服务器收到请求后把响应报文发给浏览器. 也就是说发送一次HTTP请求, 至少需要两个RTT(传输往返时间).
在1997年, HTTP1.1版本发布, 引入了持久连接, 这个版本的HTTP协议也是我们直到今天大量使用的. 1.1版本主要引入的两个特性:
- 持久连接
- 流水线机制(pipelining)
持久连接就是为了解决上述HTTP1.0的非持久连接带来的问题, 让同一个TCP连接能够被多个请求所复用. 一般的规范做法是在客户端最后一个请求, 发送Connection:close , 明确要求服务器关闭TCP连接. 目前浏览器默认会打开6个连接.
流水线工作的方式, 即浏览器在收到HTTP的响应报文之前就能够连续发送多个请求报文. 这样一个接一个请求报文到达服务器, 服务器就可以一个接一个发回响应报文, 能够节省很多个RTT时间.
问题点:
- HTTP1.1 解决了HTTP1.0的非持久连接问题, 同时引入了流水线工作的方式, 但是流水线工作带来了一个新的问题就是线头阻塞, 所谓的线头阻塞是由于请求端和服务端采用了FIFO队列. 也就是说请求和响应的顺序必须完全一致. 比如浏览器再用一个TCP连接中, 连续发了两个请求, 但是第一个请求处理的慢, 第二个请求处理的快, 这个时候只能等第一个请求处理完之后,才能算完成.
- 大部分浏览器的pipelining模式是关闭的. 线头阻塞的消耗/避免线头阻塞需要开启两个TCP连接, 代价过大.
SPDY
在了解HTTP2之前, 先了解一个SPDY, 因为HTTP2其实就是在SPDY的基础上完成的. SPDY协议是Google开发的一个会话层协议. 这个协议是工作在HTTP和TCP之间的会话层, 通过这个协议对HTTP做了增强. 该协议的功能主要有: 数据流的多路复用, 请求优先级及HTTP报头压缩. Google说能够将页面加载时间减少50%.
SPDY的强制使用SSL协议. 也就是原本的TCP上面是HTTP协议的架构变成了如下图 :
HTTP |
---|
SPDY |
SSL |
TCP |
在SSL上层增加了SPDY会话层, 可以再同一个TCP连接中实现并发流.
HTTP/2
在文章的开头已经提到了HTTP/2 带来的几个全新的特性, 下面我们就一一探讨这几个特性 :
1. 异步连接多路复用
由于HTTP/2 采用了二进制的数据格式, 以前文本的数据必须要按照顺序才能完成拼接, 现在使用二进制数据帧, 只需要给每个数据块一个标识的index, 就可以标识这个数据库属于第几个, 然后在同一个TCP连接中, 请求/响应都可以直接发送. 所谓的多路复用就是在用一个TCP连接中, 可以发送不同的数据流的不同数据帧, 服务端或者客户端可以用过数据流+数据帧的标识将数据进行组装, 能够最大程度的避免HTTP1.1中的线头阻塞.
2. 头部压缩
Web功能越来越的复杂, 每个页面可能会对应上百个请求, 因此头部消耗的流量越来越多, 同时HTTP头部的内容也是非常冗余和大量的重复, 会导致不必要的流量浪费, 并导致初始的TCP拥塞窗口快速填满, 当一个新的TCP连接上发出多个请求的时候, 可能会导致延迟过长.
3. 新的二进制格式
HTTP/2 采用了二级制的协议方式, 而HTTP/1.1之前头部都是文本协议, 而内容部分可以是文本也可以是二进制. 二进制协议和文本协议的区别在于 :
- 二级制协议的解析效率很高. 但是文本协议的可读性更好.
- 二级制协议的内容都是01因此不存在冗余重复字段. 而文本协议存在这种问题. 因此二进制协议占用的带宽更少.
4. 服务端推送
英文叫server push, 运行的过程就比如, 请求一个网址, 第一次http去请求服务端的HTML文件, 然后服务端自主将与之相关的css和js文件一并推送过来,就是一种服务端推送的场景.
服务端推送的定义是 : HTTP/2允许服务器未经请求, 主动向客户端发送一些资源, 这个叫做服务端推送.
具体推送实践可以参考腾讯的一个实践, 参考链接第5条.
扩展知识 :
-
gRpc是什么? gRPC 官方文档中文版_V1.0 (oschina.net)
gRPC是基于HTTP/2高性能高可靠的RPC框架
-
QUIC : QUIC_百度百科 (baidu.com)
QUIC是google开发的, 基于UDP的可以完成可靠传输的传输层协议
参考链接 :