管道网络传输和队头阻塞
HTTP/1.1 采用了长连接的方式,这使得管道(pipeline)网络传输成为了可能;即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间;
举例来说,客户端需要请求两个资源;以前的做法是,在同一个TCP连接里面,先发送 A 请求,然后等待服务器做出回应,收到后再发出 B 请求;
管道机制则是允许浏览器同时发出 A 请求和 B 请求;
但是服务器还是按请求的顺序响应的,先回应 A 请求,完成后再回应 B 请求;要是前面的回应特别慢,后面就会有许多请求排队等着,这称为「队头堵塞」,这样会招致客户端一直请求不到数据;
即如果其中一个请求非常耗时或者因为某些原因没有及时的响应,后面的其他的请求就会被阻塞;
优化方案
减少请求数量
常见的做法是合并资源文件和将css、base64图片等资源内联;
增加连接个数
一般浏览器同一个域名下的并发链接数是6到8个,谷歌浏览器同一个域名下的并发链接数一般限制在6个左右;
如果资源太多的话,可以将同一页面的资源分散到不同域名下;
此外,管道机制稳定性差,而且存在兼容性问题;现代浏览器默认都关闭了管道化,并且大部分服务器也是默认不支持管道化的;