HTTP1.1中存在问题
- 队头阻塞:TCP连接只能发送一个请求,该请求未完成时,后续请求将会被阻塞
- 头部冗余:headers采用文本格式,每次请求会带上cookie、user-agent这些和之前请求完全相同的头部
- TCP连接数限制:对于同一个域名 ,浏览器最多能建立6~8个,但每个TCP只能请求一次,受限较大
- HTTP1.1 中解决连接数受限导致的队头阻塞:
- 域名切片 ,将资源放到细分的域名下,但TCP连接本身会有DNS查询 三次握手 慢启动等,会占用额外内存和CPU;同时对于服务器来说过多的连接也会造成网络拥挤与阻塞
- webpack,将零碎小的JS文件合成大的JS文件,减少请求次数 ,但会因为客户端需要加载更大的JS文件,打破原有缓存小文件的优势
- 雪碧图方案
- HTTP1.1 中解决连接数受限导致的队头阻塞:
- 明文传输不安
HTTP2新特性与优势
1 二进制分帧层
是HTTP2性能的核心所在,HTTP2是二进制协议,采用二进制格式传输数据,基于TLS实现HTTP2
- 新增二进制分帧层,headers和data都是二进制,统称为帧:HEADER Frame 和 DATA Frame
2 多路复用
解决HTTP/1.1的线头阻塞和多个TCP连接的问题,HTTP将会让所有的通信再一个TCP连接上完成,不用频繁建立多个TCP请求,真正实现了请求的并发;
首先会建立一个TCP连接,连接上面可以有任意多个流(stream),头部和数据消息分割成了一个或多个帧在流里面传输(依靠二进制分帧层),帧传输过去后,再对帧进行重组,重新形成一个完整的请求或响应
3 头部压缩
HTTP1.X中,首部用文本格式传输,通常每个传输都会增加500-800字节的开销;而网页中有着大量HEADERS字段重复的请求,如cookie、user-agent等;HTTP2采用HPACK压缩格式来压缩头部;
头部压缩需要再浏览器和服务器之间:
- 维护一份相同的静态字典,包含常见的头部名称,以及常见头部名称和值的组合
- 维护一份相同的动态字典,支持动态的添加内容
- 通过静态赫夫曼(Huffman)编码对传输的首部字段进行编码
如果需要传输的字段在字典树中有字段和其内容,则只需传输其索引值就ok了
如果字典树没有的话,第一次传输需要其对应的索引和其值,之后浏览器和服务器会通过Huffman编码后存入动态的字典树
4 服务端推送
服务端可以主动向客户端推送资源
如客户端请求的.html页面中,含有后续仍需请求的.css .png之类的文件,服务器配置好服务器推送后,会在客户端请求.html资源时,将.css .png此类关联的资源主动推送到客户端缓存中
即服务端和浏览器进行一次通信即可得到所有资源