SPDY头部阻塞问题

12
我对SPDY如何解决HOL阻塞的理解有困难。
引用来自:http://chimera.labs.oreilly.com/books/1230000000545/ch02.html#TCP_HOL 为了理解这是为什么,回想一下每个TCP包在被放到电线上时都带有唯一的序列号,并且数据必须按顺序传递给接收方 (Figure 2-8)。如果其中一个包在传送到接收方时丢失了,那么所有后续的包都必须在接收方的TCP缓冲区中等待,直到丢失的包被重新传输并到达接收方。由于这项工作是在TCP层内完成的,我们的应用程序无法看到TCP重传或排队的数据包缓冲区,必须等待全部序列才能访问数据。相反,当它尝试从套接字读取数据时,它只会看到传递延迟。这种效果被称为TCP HOL阻塞。
因此,HOL阻塞存在是因为TCP保证按顺序交付。但是这里用户igrigorik说SPDY允许数据包以不同的顺序到达。但是SPDY不仅仅是HTTP的替代品吗?这意味着它仍然在TCP上运行(来自这里)。
1个回答

26
HOLB有几个原因,其中packet重传是其中之一,但它与HTTP和SPDY无关。 与HTTP和SPDY相关的原因是在HTTP 1.x中必须按顺序响应多个请求。
想象一个HTTP客户端通过同一TCP连接发送了2个请求到服务器,并且第一个响应具有较大的内容长度,而第二个响应具有较小的内容长度。
由于HTTP 1.x协议的性质,第二个响应必须等待第一个响应完成。第二个响应被第一个响应阻塞。
相反,在SPDY和HTTP 2等多路复用协议中,这种HOLB不存在,因为第二个“小”响应可以在第一个“大”响应之前很好地到达客户端(甚至可以交错)。 你引用的问题的图解形象地解释了它。
Ilya在他的回答中所指的不是TCP数据包,而是HTTP“数据包”,他说它们可能是无序的。想象一下由HTTP标头组成的“数据包”和要上传到服务器的POST数据组成的“数据包”(或者在响应中,要下载到客户端的数据)。在HTTP 1.x中,这些HTTP“数据包”必须按顺序排列(首先是请求1的所有HTTP“数据包”,然后是请求2的所有HTTP“数据包”;或者首先是响应1的所有HTTP“数据包”,然后是响应2的所有HTTP“数据包”),而在SPDY和HTTP 2中,它们可能是无序的甚至交替出现。
SPDY和HTTP 2中没有这种类型的HOLB,使这些协议比HTTP 1.x更高效。
由TCP重传引起的HOLB会影响任何基于TCP的协议,包括多路复用协议如SPDY和HTTP 2以及双工协议如HTTP 1.x。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接