计算机网络学习 - 2| 青训营笔记

70 阅读3分钟
  1. 无法多路复用 (HTTP1.1及以前)

    // main.js
    console.log('hello world');
    
    /* style.css */
    body {
     color: red;
    }
    

    假设在同一个连接中,客户端请求 main.js 和 style.css 这两个文件,服务器返回响应时是交错发送 (这里是假设按行交错发送),那客户端可能会收到如下的内容

    body {
    console.log('hello world');
     color: red;
    }
    

    这种结果对客户端来说根本没办法从流中区分这两个文件,因此也就无法实现多路复用。

    (多路复用的定义:多路复用(Multiplexing)指的是在一个物理通信通道上,同时传输多个不同来源的数据流的技术。它允许多个数据流共享同一个通道,从而提高通信的效率和利用率。)

    多路复用的问题在HTTP2中得到了解决 即将多个HTTP请求拆分到多个帧Frame里面,每个帧可以携带来自不同HTTP请求的数据,(注:这里的帧和链路层中的帧并不一样),这种方式由多个帧组成的流传输方式,可以让每个数据包都有自己的身份,也就是可以标记每个数据包是属于哪个请求,进而实现了HTTP2的多路复用。(补充:HTTP/2 支持在单个连接上同时传输多个请求和响应,从而减少了连接数,提高了性能和效率。多路复用是通过在同一个连接上使用多个流(Stream)来实现的。每个流都可以承载一个请求和一个响应,通过标识符来区分。这样,客户端和服务器就可以在同一个连接上进行多个请求和响应的交互,而不需要建立多个连接。)

  2. 既然都有HTTP2了,为什么我们还需要HTTP3捏?

    1. 简单来说就是HTTP2还不够快,虽然解决了HTTP层面上的队头堵塞,但在TCP层面上,仍然可能出现队头堵塞的问题,以下是详细解释⬇️

      (HTTP/2 解决了应用层的队头堵塞问题,但传输层的 TCP 协议仍然存在队头堵塞的问题。这是因为 HTTP/2 的多路复用是在应用层实现的,而 TCP 协议是在传输层实现的。

      在 TCP 协议中,发送端发送的数据会被分割成多个 TCP 分组(Segment),每个 TCP 分组都有一个序号(Sequence Number)。当接收端接收到一个 TCP 分组时,如果该分组的序号与其它分组的序号不连续,则接收端需要等待前面的数据分组到达,才能继续接收后续的数据分组,从而导致队头堵塞的问题。

      虽然 HTTP/2 在应用层上解决了队头堵塞的问题,但如果底层的传输层仍然存在队头堵塞的问题,仍然会对性能产生影响。为了解决这个问题,HTTP/3 引入了 QUIC 协议,该协议基于 UDP 协议实现,可以避免 TCP 的队头堵塞问题,从而提高了传输效率和性能。

      总之,HTTP/2 在应用层实现了多路复用,从而解决了应用层的队头堵塞问题,但在传输层的 TCP 协议上仍然存在队头堵塞的问题。为了进一步提高性能,HTTP/3 引入了 QUIC 协议来解决这个问题。而且这个问题很难在当前已有的协议上继续打补丁得到解决,而且当前市面上的设备都对TCP协议有着较好的支持,对TCP协议进行修改也是不现实,所以也就有了基于QUIC的HTTP3协议)