SPDY线头阻挡

Joa*_*him 11 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保证按顺序传递.但是在这里,用户igrigorik说SPDY允许数据包以不同的顺序出现.但SPDY不仅仅是HTTP的替代品吗?这意味着它仍然在TCP上运行(从这里开始).

sbo*_*det 22

HOLB有几个原因,其中包重传是一个,但它不是与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).