HTTP1.1 中如何解决 HTTP 的队头阻塞问题?
参考答案:
什么是 HTTP 队头阻塞?
HTTP 传输是基于请求-应答的模式进行的,报文必须是一发一收,但值得注意的是,里面的任务被放在一个任务队列中串行执行,一旦队首的请求处理太慢,就会阻塞后面请求的处理。这就是著名的 HTTP队头阻塞 问题。
并发连接
对于一个域名允许分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其它所有任务。在RFC2616规定过客户端最多并发 2 个连接,不过事实上在现在的浏览器标准中,这个上限要多很多,Chrome 中是 6 个。
但其实,即使是提高了并发连接,还是不能满足人们对性能的需求。
域名分片
一个域名不是可以并发 6 个长连接吗?那我就多分几个域名。
比如 static1.test.com 、static2.test.com。
这样一个 test.com 域名下可以分出非常多的二级域名,而它们都指向同样的一台服务器,能够并发的长连接数更多了,事实上也更好地解决了队头阻塞的问题。
题目要点:
HTTP队头阻塞是指在基于请求-应答模型的HTTP传输中,由于报文必须一发一收,请求被串行执行,如果队首的请求处理速度较慢,就会阻塞后面请求的处理,从而影响整体的性能。
为了解决队头阻塞问题,可以采取以下措施:
- 并发连接:一个域名可以允许分配多个长连接,从而增加任务队列,避免单个请求阻塞其他请求。现代浏览器对并发连接的限制比RFC2616规定的2个连接要高得多,例如Chrome允许6个并发连接。
- 域名分片:将一个域名分割成多个二级域名,如static1.test.com和static2.test.com,这些二级域名都指向同一台服务器。这样就可以创建更多的并发连接,从而更好地解决队头阻塞问题。