HTTP/1.1
在1997年以前使用的是RFC 1945定义的HTTP/1.0协议,现在普遍使用的是升级版本HTTP/1.1,HTTP/1.1已是互联网建议标准[RFC 7231];
HTTP/1.0的主要缺点,就是每请求一个文档就要有两倍RTT的开销;若一个主页上有很多链接的对象(如图片等)需要依次进行链接,那么每一次链接下载都导致2×RTT的开销;
一般浏览器同一个域名下的并发链接数是6到8个,谷歌浏览器同一个域名下的并发链接数一般限制在6个左右;
另一种开销就是万维网客户和服务器每一次建立新的TCP连接都要分配缓存和变量;特别是万维网服务器往往要同时服务于大量客户的请求,所以这种非持续连接会使万维网服务器的负担很重;
好在浏览器都能够打开5~10个并行的TCP连接,而每一个TCP连接处理客户的一个请求;因此,使用并行TCP连接可以缩短响应时间;
HTTP keep-alive(HTTP连接重用)
HTTP/1.1协议较好地解决了这个问题,它使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销;即使用了持续连接(persistent connection);
所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文;现在主要应用的就是 http1.1 协议;
这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行;目前一些流行的浏览器(如IE 11.0)的默认设置就使用了HTTP/1.1;
如果用户不愿意使用持续连接的浏览器,可以选择IE浏览器上面的“工具”→“Internet选项”→“高级”等项目,把“HTTP 1.1设置”的选择取消即可;
管道(pipeline)网络传输
HTTP/1.1协议支持管道(pipeline)网络传输;只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间;
即HTTP/1.1协议的持续连接有两种工作方式,即:
非流水线方式(without pipelining)
非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求;
因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT;这比非持续连接要用去两倍RTT的开销,节省了建立TCP连接所需的一个 RTT时间;
但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源;
流水线方式(with pipelining)
流水线方式的特点,是客户在收到 HTTP的响应报文之前就能够接着发送新的请求报文;
于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文;
因此,使用流水线方式时,客户访问所有的对象只需花费一个RTT 时间;流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档效率;
但是缺点也明显,详细参见:管道网络传输和队头阻塞;
HTTP/1.1 还是有性能瓶颈:
- 解析效率低,停等协议-效率低
- 发送冗长的首部;每次互相发送相同的首部造成的浪费较多,首部信息越多延迟越大,但是只能压缩 Body 的部分;
- 没有请求优先级控制;
- 请求只能从客户端开始,服务器只能被动响应;