HTTP/1.x中的问题
过多的可选项
过多的可选项导致http/1.1协议过于庞大,HTPP管线化(http pipelining)就是一个可选项。 :::info HTTP管线化: 把多个http请求放在一个tcp连接中一一发送,而不需要等待服务器对前一个请求的响应。只不过,客户端仍然按照发送请求的顺序来接收响应。 ::: 由于服务器都是按照顺序来处理请求的,如果前一个任务时间太久,那么后续的请求都会受到影响,这就是线头阻塞(head-of-line-blocking)。所以说http/1.1中的管线化没有解决线头阻塞的问题
http/2优势
http/2.0的优势主要体现在
- 二进制分帧
- 头部压缩
- 多路复用
-
二进制分帧
http/2.0采用二进制格式传输数据,而非http/1.x的文本格式传输
头部压缩
在http/1.1时代,http的每个请求都携带大量相同的字段,例如agent,cookie,http/2.0通过头部压缩以及字典解决了这个问题,需要客户端和服务端同时支持
浏览器和服务端同时维护一个静态字典,在静态字典中有值的头部,直接传递索引即可搞定。
- 还会维护一个动态字典,可以动态的添加内容
- 通过静态Huffman编码对传输的首部字段进行编码

所以当我们需要传输的头部字段有值,直接根据静态字典传输索引。头部字段没有值,则传输索引和对应的值(会采用静态Huffman编码),之后,浏览器和客户端会把索引,头部,值添加到动态字典中,后续传输也是一个字节。
多路复用
http/2.0多个请求共用一个tcp连接,同域名下所有请求都在一个连接中完成,http/1.x中想要并发请求,必须建立多个tcp连接,而且,浏览器为了控制资源,限制了单个域名只能有6-8个tcp连接
服务器推送
服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML时再发送这些请求。
服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端。
