HTTP2 连通性测试 Introduction to HTTP/2HTTP: HTTP/1.X - High Performance Browser Networking (OReilly)HTTP/2超文本传输协议第2版最初命名为HTTP 2.0简称为h2基于TLS/1.2或以上版本的加密连接或h2c非加密连接 HTTP/2 是 HTTP 协议的第二个主要版本用于在 Web 服务器和客户端之间传输数据。HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 的改进版 RFC 发布后的首个更新主要基于 SPDY 协议。多数主流浏览器已经在 2015 年底支持了该协议。HTTP/2是一种网络协议是HTTP/1.1的升级版由IETF在2015年发布。HTTP/2旨在提高Web性能减少延迟增加安全性使Web应用更加快速、高效和可靠。HTTP/2 vs HTTP/1.1高健壮性HTTP/1.1使用基于文本格式文本表现形式多样、场景多健壮性不足。HTTP/2使用二进制格式只有0和1的组合选择二进制传输协议解析实现方便且健壮。高性能HTTP连接会随着时间进行自我调节起初会限制连接的最大速度如果数据成功传输会随着时间的推移提高传输的速度。这种调节被称为TCP慢启动。这种调节让具有突发性和短时性的HTTP连接变的十分低效。HTTP/2通过多路复用让所有数据流使用同一个连接有效使用TCP连接让高带宽也能真正的服务于HTTP的性能提升。HTTP/2在应用层和传输层之间增加了二进制分帧突破了HTTP/1.1性能限制改进传输性能实现低延迟和高吞吐量。网络开销低HTTP/2使用HPACK算法来压缩每次请求连接的头字段降低了网络开销。HPACK算法可以减少需要传输的头字段大小通讯双方通过建立和维护头字段表字段表中使用长度较小的索引号表示重复的字符串在用Huffman编码压缩数据既避免了重复头字段的传输又减小了需要传输的大小。HTTP/2 特点下面是 HTTP/2 的一些特点和改进之处多路复用HTTP/2 允许同时发送多个请求和响应而不是像 HTTP/1.1 一样只能一个一个地处理。这样可以减少延迟提高效率提高网络吞吐量。二进制传输HTTP/2 使用二进制协议与 HTTP/1.1 使用的文本协议不同。二进制协议可以更快地解析更有效地传输数据减少了传输过程中的开销和延迟。头部压缩HTTP/2 使用 HPACK 算法对 HTTP 头部进行压缩减少了头部传输的数据量从而减少了网络延迟。服务器推送HTTP/2 支持服务器推送允许服务器在客户端请求之前推送资源以提高性能。改进的安全性HTTP/2 默认使用 TLSTransport Layer Security加密传输数据提高了安全性。兼容 HTTP/1.1HTTP/2 可以与 HTTP/1.1 共存服务器可以同时支持 HTTP/1.1 和 HTTP/2。如果客户端不支持 HTTP/2服务器可以回退到 HTTP/1.1。多路复用1、http2.0将传统的http1.1请求的报文(headerbody)拆分成二进制流的数据帧。2、二进制数据帧成为了http2.0请求和响应的最小传输单位。3、http1.1的一次请求作为一个流一个流拆分为多个二进制数据帧。4、每一个二进制数据帧上携带流id标识是哪个请求。5、 server端在接收数据的时候将多个具有相同流id的二进制数据帧整合成一个请求。6、在一个tcp连接上能够实现多个请求混发解决了线头阻塞的问题。二进制分帧HTTP/2所有性能增强的核心在于新的二进制分帧层如下图所示它是所有其他功能和性能优化的基础它定义了如何封装HTTP消息并在客户端与服务器之间传输。二进制分帧HTTP/2没有改动HTTP的应用语义仍然使用HTTP的请求方法、状态码和头字段等规则它主要修改了HTTP的报文传输格式。HTTP/1.1协议以换行符作为纯文本的分隔符而HTTP/2将所有传输的信息分割为更小的消息和帧并采用二进制格式对它们编码这些帧对应着特定数据流中的消息他们都在一个TCP连接内复用。首部压缩HTTP每次请求或响应都会携带首部信息用于描述资源属性。HTTP/1.1使用文本的形式传输消息头消息头中携带cookie每次都需要重复传输几百到几千的字节这十分占用资源。压缩原理HTTP/2使用了HPACK算法来压缩头字段这种压缩格式对传输的头字段进行编码减少了头字段的大小。同时在两端维护了索引表用于记录出现过的头字段后面在传输过程中就可以传输已经记录过的头字段的索引号对端收到数据后就可以通过索引号找到对应的值。用header字段表里的索引代替实际的header。把常用的 http Header存放在表里请求的时候便只需要发送在表里的索引位置即可。例如 :methodGET 使用索引值 2 表示:path/index.html 使用索引值 5 表示如下图服务端收到请求后会将这个 User-Agent 添加到 Dynamic Table 缓存起来分配一个新的索引值。客户端下一次请求时假设上次请求User-Agent的在表中的索引位置是 62 此时只需要发送 0xBE同样的高位置 1便可以代表User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36。其过程如下图所示服务器推送HTTP2.0的一个强大的新功能就是服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确的请求。服务端根据客户端的请求提前返回多个响应推送额外的资源给客户端。如下图所示客户端请求stream 1服务端在返回stream 1的消息的同时推送了stream 2和stream 4。不过与之相比服务器推送还有一个很大的优势可以缓存也让在遵循同源的情况下不同页面之间可以共享缓存资源成为可能。注意两点1、推送遵循同源策略2、这种服务端的推送是基于客户端的请求响应来确定的。Nginx支持HTTP2.0然后执行如下命令进行编译安装。./configure --prefix/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module make make install更改nginx配置安装结束后将nginx.config文件中443端口添加http2