这里有两种队头阻塞,是不一样的。
tcp 队头阻塞
TCP数据包是有序传输,中间一个数据包丢失,会等待该数据包重传,造成后面的数据包的阻塞。
http队头阻塞
http1.x采用长连接(Connection:keep-alive),可以在一个TCP请求上,发送多个http请求。 有非管道化和管道化,两种方式。 非管道化,完全串行执行,请求->响应->请求->响应…,后一个请求必须在前一个响应之后发送。 管道化,请求可以并行发出,但是响应必须串行返回。后一个响应必须在前一个响应之后。原因是,没有序号标明顺序,只能串行接收。 所以,由于这个原因,目前大部分浏览器和Web服务器,都关闭了管道化,采用非管道化模式。 无论是非管道化还是管道化,都会造成队头阻塞(请求阻塞)。因为虽然管道化能够多次同时发送多个请求,但是相应却是必须要等前面的返回才能继续返回其余的响应。 另外一个原因就是http1.x不能够使用多路复用。可能的想法是将一个请求的响应分段的返回,这中间能够穿插其他的响应。但是由于http1.x的headers只会在相应内容之前出现一次,如果将一个响应进行切分了,那么被切分的后半段必然是不能够正确读取的,并且前一段会和一个陌生的请求被一起读取。总的来说就是不能够分割请求,后一个请求只能在前一个请求之后到达。 那么,让我们回顾一下。HTTP/1.1 有一个队头阻塞问题,一个大的或慢的响应会延迟后面的其他响应。这主要是因为协议本质上是纯文本的,在资源块(resource chunks)之间不使用分隔符。作为一种解决办法,浏览器打开许多并行TCP连接,这既不高效,也不可扩展。 HTTP2方式 http2使用一个域名单一TCP连接发送请求,请求包被二进制分帧,不同请求可以互相穿插,避免了http层面的请求队头阻塞。 但是不能避免TCP层面的队头阻塞。
|