紧接上篇博客HTTP/2 并没有解决 TCP 的队首阻塞问题,它仅仅是通过多路复用解决了以前 HTTP1.1 管道化请求时的队首阻塞问题。
TCP发生队首阻塞的原因:
HTTP/2虽然可以解决http队首阻塞问题,但是 TCP 层面的队首阻塞是 HTTP/2 无法解决的(HTTP 只是应用层协议,TCP 是传输层协议),TCP 的阻塞问题是因为传输阶段可能会丢包
,TCP是一个按序传输的通道,一旦丢包就会等待重新发包,阻塞后续内容传输
TCP的队首阻塞问题,我们经常会在http2协议中去讨论,因为http2中TCP通道很少
,可能只有一个
在http2中丢包了会怎么办?
采用HTTP/2时
,浏览器一般会在单个TCP
连接中创建并行的几十个乃至上百个传输。如果HTTP/2连接双方的网络中有一个数据包丢失,或者任何一方的网络出现中断,整个TCP连接就会暂停,丢失的数据包需要被重新传输。因为TCP是一个按序传输的通道
,因此如果其中一个点丢失了,通道上之后的内容就都需要等待。
随着丢包率的增加,HTTP/2的表现越来越差。在2%的丢包率(一个很差的网络质量)中,测试结果表明HTTP/1用户的性能更好,因为HTTP/1一般有六个TCP连接
,哪怕其中一个连接阻塞了,其他没有丢包的连