SPDY线头阻挡

时间:2014-08-09 18:55:58

标签: networking tcp spdy

我很难理解SPDY如何解决HOL阻塞问题。

引自:http://chimera.labs.oreilly.com/books/1230000000545/ch02.html#TCP_HOL

  

要理解为什么会这样,请回想一下,每个TCP数据包在传输到线路时都带有唯一的序列号,并且数据必须按顺序传递给接收器(图2-8)。如果其中一个数据包在路由到接收器时丢失,则所有后续数据包必须保存在接收器的TCP缓冲区中,直到重新丢失数据包并到达接收器。由于此工作是在TCP层内完成的,因此我们的应用程序无法查看TCP重新传输或排队的数据包缓冲区,并且必须等待完整序列才能访问数据。相反,它只是在尝试从套接字读取数据时看到传递延迟。这种效应称为TCP线头(HOL)阻塞。

因此,HOL阻塞存在,因为TCP保证按顺序传递。但here用户igrigorik说SPDY允许数据包以不同的顺序出现。但是,SPDY只是一个HTTP替代品吗?这意味着它仍然在TCP上运行(来自here)。

1 个答案:

答案 0 :(得分:22)

HOLB有几个原因,其中包重传是一个,但它不是与HTTP和SPDY相关的原因。 与HTTP和SPDY相关的一个事实是,在HTTP 1.x中,必须按顺序响应多个请求。

想象一下,HTTP客户端通过相同的TCP连接向服务器2发送请求,并且第一个响应是"大"内容长度,而第二个响应是"小"内容长度。

由于HTTP 1.x协议的性质,第二个响应必须等待第一个响应完成。第二个响应是第一个响应阻止了行头。

对于像SPDY和HTTP 2这样的多路复用协议,相反,这种类型的HOLB不存在,因为第二个"小"响应可以在第一个"大"之前到达客户端。响应(它们甚至可以交错)。

question you referenced above的图解以图形方式解释。

Ilya,在他的回答中,并不是指TCP数据包,而是指HTTP"数据包"当他说他们可能会失灵。想象一下"数据包"由HTTP头和一个"数据包"组成。由POST数据组成,以便上传到服务器(或者,在响应中,"数据包"由要下载到客户端的数据组成)。 在HTTP 1.x中,这些HTTP"数据包" 必须按顺序排列(首先是所有HTTP"数据包"请求1,然后是所有HTTP"数据包"请求2;或者首先是所有HTTP& #34;响应1的数据包"然后响应2的所有HTTP"数据包#);而在SPDY和HTTP 2中,它们可能无序甚至交错。

SPDY和HTTP 2中缺少这种HOLB使得这些协议比HTTP 1.x更有效。

由TCP重新传输引起的HOLB会影响任何基于TCP的协议,包括SPDY和HTTP 2等多路复用协议,以及HTTP 1.x等双工协议。