基于HTTPS协议html
使用二进制分帧进行数据传输,低延迟,高吞吐量算法
2.0协议是在1.x的基础上升级而不是重写,1.x协议的语义、HTTP 方法、状态码、URI 及首部字段在2.0里是同样的浏览器
帧是数据通讯的最小单位,以二进制压缩格式存放内容。
包含:类型Type, 长度Length, 标记Flags, 流标识和Frame payload有效载荷。
来自不一样数据流的帧能够交错发送,而后再根据每一个帧头的数据流标识符从新组装。
详细介绍:HTTP/2 中的帧定义缓存
消息:指 HTTP/2 中逻辑上的 HTTP 消息。
例如请求和响应等,消息由一个或多个帧组成。安全
流是链接中的一个虚拟信道,能够承载双向消息传输,包含1条或者多条Message。每一个流有惟一整数标识符。为了防止两端流ID冲突,客户端发起的流具备奇数ID,服务器端发起的流具备偶数ID。服务器
特色:cookie
二进制帧
。帧在流上的被发送与被接收都是按照顺序进行的。二进制帧
都是被并行传输的,无需按顺序等待。但却不会引发数据混乱,由于每一个帧都有顺序标号。它们最终会被按照顺序标号来合并。流标识是描述二进制Frame的格式,使得每一个Frame可以基于HTTP/2发送,与流标识联系的是一个流,每一个流是一个逻辑联系,一个独立的双向的Frame存在于客户端和服务器端之间的HTTP/2链接中。一个HTTP/2链接上可包含多个并发打开的流,这个并发流的数量可以由客户端设置。
总结并发
1个TCP 链接,包含1个或者多个Stream。全部通讯都在一个TCP链接上完成,此链接能够承载任意数量的双向数据流。性能
将传输信息分为两个帧,分别是Headers帧和Data帧。
在二进制分帧层上, HTTP/2.0 会将全部传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP/1.x的首部信息会被封装到Headers帧,而咱们的request body则封装到Data帧里面。优化
HTTP/2.0 通讯都在一个链接上完成,这个链接能够承载任意数量的双向数据流。相应地,每一个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧能够乱序发送,而后再根据每一个帧首部的流标识符从新组装。
在二进制分帧层上,HTTP/2会将全部传输信息分割为更小的消息和帧,并对它们采用二进制格式的编码将其封装,新增的二进制分帧层同时也可以保证HTTP的各类动词,方法,首部都不受影响,兼容上一代HTTP标准。其中,HTTP/1.X中的首部信息header封装到Headers帧中,而request body将被封装到Data帧中。
在 HTTP/1.x 中,一次连接成功后,只要该连接还没断开,那么 client 端能够在这么一个连接中有序地发起多个请求,并以此得到每一个请求对应的响应数据。可是浏览器客户端在同一时间,针对同一域名下的请求有必定数量的限制,超过限制数目的请求会被阻塞,一次请求与响应的交互必需要等待前面的请求交互完成,不然后面的只能等待,这个就是线头阻塞。要想实现多流并行,就要开启多个TCP链接。
HTTP/2.0新的分帧机制能够不依赖多个TCP链接去实现多流并行,并且多路复用容许同时经过单一的HTTP/2 链接发起多重的请求-响应消息,不会形成阻塞。
总结
在 HTTP/1 中,HTTP 请求和响应都是由「状态行、请求 / 响应头部、消息主体」三部分组成。HTTP每一次通讯都会携带一组头部,用于描述此次通讯的的资源、浏览器属性、cookie等,HTTP/1.x每次请求都会携带大量冗余头信息,请求的大小变得愈来愈大,有时甚至会大于TCP窗口的初始大小,由于它们须要等待带着ACK的响应回来之后才能继续被发送。通常而言,消息主体都会通过 gzip 压缩,或者自己传输的就是压缩事后的二进制文件(例如图片、音频),但状态行和头部却没有通过任何压缩,直接以纯文本传输。
HTTP/2关注的是首部压缩(HPACK算法),而咱们经常使用的gzip等是报文内容(body)的压缩
用Header字段表里的索引代替实际的Header。
HTTP/2的HPACK算法使用一份索引表来定义经常使用的HTTP Header,把经常使用的 HTTP Header 存放在表里,请求的时候便只须要发送在表里的索引位置便可。
例如 :method=GET 使用索引值 2 表示,:path=/index.html 使用索引值 5 表示,以下图:
详细介绍HTTP/2 头部压缩技术介绍
把HTTP消息分为不少独立帧以后,就能够经过优化这些帧的交错和传输顺序进一步优化性能。
每一个流均可以带有一个31比特的优先值
服务器能够根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好以后,优先将最高优先级的帧发送给客户端。高优先级的流都应该优先发送,但又不会绝对的,绝对地准守,可能又会引入首队阻塞的问题:高优先级的请求慢致使阻塞其余资源交付。
分配处理资源和客户端与服务器间的带宽,不一样优先级的混合也是必须的。客户端会指定哪一个流是最重要的,有一些依赖参数,这样一个流能够依赖另一个流。优先级别能够在运行时动态改变,当用户滚动页面时,能够告诉浏览器哪一个图像是最重要的,你也能够在一组流中进行优先筛选,可以忽然抓住重点流。
服务器能够对一个客户端请求发送多个响应,服务器向客户端推送资源无需客户端明确地请求,而且,服务端推送能把客户端所须要的资源伴随着index.html一块儿发送到客户端,省去了客户端重复请求的步骤。
正由于没有发起请求,创建链接等操做,因此静态资源经过服务端推送的方式能够极大地提高速度。Server Push 让 HTTP/1.x 时代使用内嵌资源的优化手段变得没有意义;若是一个请求是由你的主页发起的,服务器极可能会响应主页内容、logo 以及样式表,由于它知道客户端会用到这些东西,这至关于在一个 HTML 文档内集合了全部的资源。
不过与之相比,服务器推送还有一个很大的优点:能够缓存!也让在遵循同源的状况下,不一样页面之间能够共享缓存资源成为可能。
启用HTTP/2.0后会给性能带来很大的提高,但同时也会带来新的性能瓶颈。由于如今全部的压力集中在底层一个TCP链接之上,TCP极可能就是下一个性能瓶颈,好比TCP分组的队首阻塞问题,单个TCP packet丢失致使整个链接阻塞,没法逃避,此时全部消息都会受到影响。将来,服务器端针对HTTP/2.0下的TCP配置优化相当重要。