• 32 | 未来之路:HTTP/3展望


    在前面的两讲里,我们一起学习了 HTTP/2,你也应该看到了 HTTP/2 做出的许多努力,比如头部压缩、二进制分帧、虚拟的“流”与多路复用,性能方面比 HTTP/1 有了很大的提升,“基本上”解决了“队头阻塞”这个“老大难”问题。

    HTTP/2 的“队头阻塞”

    等等,你可能要发出疑问了:为什么说是“基本上”,而不是“完全”解决了呢?

    这是因为 HTTP/2 虽然使用“帧”“流”“多路复用”,没有了“队头阻塞”,但这些手段都是在应用层里,而在下层,也就是 TCP 协议里,还是会发生“队头阻塞”。

    这是怎么回事呢?

    让我们从协议栈的角度来仔细看一下。在 HTTP/2 把多个“请求 - 响应”分解成流,交给 TCP 后,TCP 会再拆成更小的包依次发送(其实在 TCP 里应该叫 segment,也就是“段”)。

    在网络良好的情况下,包可以很快送达目的地。但如果网络质量比较差,像手机上网的时候,就有可能会丢包。而 TCP 为了保证可靠传输,有个特别的“丢包重传”机制,丢失的包必须要等待重新传输确认,其他的包即使已经收到了,也只能放在缓冲区里,上层的应用拿不出来,只能“干着急”。

    我举个简单的例子:

    客户端用 TCP 发送了三个包,但服务器所在的操作系统只收到了后两个包,第一个包丢了。那么内核里的 TCP 协议栈就只能把已经收到的包暂存起来,“停下”等着客户端重传那个丢失的包,这样就又出现了“队头阻塞”。

    由于这种“队头阻塞”是 TCP 协议固有的,所以 HTTP/2 即使设计出再多的“花样”也无法解决。

    Google 在推

  • 相关阅读:
    tomcat-8.5.78连接oracle的步骤方式
    解决VSCode中Debug和运行路径不一致的
    Vision Transformer学习
    案例分享-https证书链不完整导致请求失败
    【MYSQL】-【子查询】
    前端学习笔记——第四到七天
    面试题 17.04. 消失的数字
    k8s master节点去除污点和增加
    【C++】位图及其应用
    优思学院|怎样制定有效的质量管控措施?要善用六西格玛思维!
  • 原文地址:https://blog.csdn.net/weixin_36691991/article/details/125545717