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