HTTP/2

2016/4/16 posted in  网络

HTTP/1连接

在HTTP1中,每个请求和响应都占用一个TCP链接,尽管有Keep-Alive机制可以复用,但是在每个连接上同时只能有一个请求/响应,这意味着完成响应之前,这个连接不能用于其他请求。如果浏览器需要向同一个域名发送多个请求,需要在本地维护一个FIFO队列,完成一个再发送下一个。这样,从服务端完成请求开始回传,到收到下一个请求之间的这段时间,服务器处于空闲状态

后来,人们提出了HTTP管道的概念,试图把本地的FIFO队列挪到服务端。它的原理是这样的:浏览器一股脑把请求都发送给服务端,然后等着就可以了。这样服务端就可以在处理完一个请求后,马上处理下一个,不会有空闲了。甚至服务端还可以多线程并行处理多个请求。

HTTP/1优化

开源

既然一个TCP连接同时只能处理一个HTTP消息,那多开几条TCP连接不就解决这个问题了。

浏览器确实是这样做的。现代浏览器一般允许同域名并发6~8个连接。这个数字为什么不能更大呢?实际上这是出于公平性的考虑,每个连接对于服务器来说都会带来一定开销,如果浏览器不加以限制,一个性能好、带宽足的终端就可能耗尽服务器所有资源,造成其他人无法使用。

我们还会使用Cookie-Free Domain来减少静态文件带cookies的问题

节流

合并图片、js、css等

HTTP/2

开启Server Push。HTTP/2的多路复用特征,使得可以在一个连接上同时打开多个流,双向传输数据。Server Push,意味着服务端可以在发送页面HTML时主动推送其他资源,而不用等到浏览器解析到相应位置,发起请求再响应。另外,服务端主动推送的资源不是被内联在页面里,它们有自己独立的URL,可以被浏览器缓存。

Reference

https://imququ.com/post/http2-and-wpo-1.html

https://imququ.com/post/http2-and-wpo-2.html

HTTP2-high-perf-browser-networking.pdf