http2.0的相关特性? 其中的多路复用为了解决什么问题? (解决对头阻塞问题)

HTTP/2.0 是 HTTP 协议的一个重要版本升级,它引入了一系列旨在提升网络性能和效率的新特性。其中,多路复用(Multiplexing)是一项关键改进,解决了HTTP/1.x中存在的“队头阻塞”(Head-of-line Blocking)问题。

HTTP/2.0的主要特性包括但不限于:

  1. 多路复用(Multiplexing)

    • 在HTTP/1.x中,同一域名下的多个请求需要按照顺序排队进行处理,即使某个请求因为网络延迟或其他原因阻塞,后面的请求也会被阻塞,无法并发执行。
    • HTTP/2.0通过多路复用技术在一个TCP连接上可以同时处理多个请求和响应,每个请求都有自己的流(Stream),这些流可以在连接上交错、并发地传输,彼此不会相互阻塞。这样就能够有效减少页面加载所需的时间,特别是当网络条件不佳时,能显著改善用户体验。
  2. 二进制分帧(Binary Framing)

    • HTTP/2.0将请求报文和响应报文分解成了更小的二进制帧,包括Headers帧、Data帧、Priority帧等,这样不仅可以更好地支持多路复用,还能够优化协议解析过程。
  3. 头部压缩(Header Compression)

    • 使用HPACK算法对HTTP头部进行压缩,减少了不必要的重复数据传输,节省带宽。
  4. 服务器推送(Server Push)

    • 服务器可以根据客户端的请求主动推送相关资源,而不需要客户端显式请求。

多路复用主要解决的问题是:

  • 队头阻塞(Head-of-line Blocking)
    这种情况发生在HTTP/1.x中,当浏览器发起多个HTTP请求时,如果前面的请求未完成,后面的所有请求即使已经准备好也无法发送。这会导致后续资源的加载延迟,尤其是那些并不依赖于前面资源的请求也跟着受阻。

通过HTTP/2.0的多路复用技术,浏览器和服务端可以同时交换多个请求和响应,极大地提高了并行性和整体性能,尤其是在高延迟的网络环境下效果明显。

grpc中的deadLine和timeout, 应该怎么用? grpc的流控是如何处理的? 滑动窗口控制发送和接收速速率?

在gRPC中,Deadline和Timeout是用于控制远程调用超时的重要概念:

  1. Deadline:
    Deadline是指一个绝对时间点,gRPC客户端在发出请求时可以指定一个截止时间(deadline)。如果在这个截止时间之前服务端还未完成响应,则客户端会取消此次调用,并抛出一个异常。这是对调用的全局限制,即从请求发出到得到响应的全过程。

    在gRPC中设置Deadline通常是通过Context来做,例如在golang中:

    ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*10)) // 设置10秒超时
    defer cancel()
    response, err := client.SomeRPC(ctx, request)
  2. Timeout:
    Timeout则是指一段持续时间,但实际上在gRPC中并没有明确的Timeout字段,不过你可以通过设置Deadline来达到类似的效果,即相对于当前时间的一段时间间隔内必须完成响应。

    注意,这两个概念在实践中常常互换使用,但在语义上略有区别,一般推荐使用Deadline来表达一次调用的超时限制。


gRPC的流控
gRPC的流控主要体现在两个方面:流量控制拥塞控制

  • 流量控制:gRPC使用HTTP/2协议,该协议支持基于窗口更新的流量控制。在gRPC的流式RPC(如Server/Client streaming)中,发送端和接收端都有独立的滑动窗口,用来控制发送速率。发送端会根据接收端通告的窗口大小来决定可以发送多少数据,防止接收端缓冲区溢出。

    • 发送端通过接收端返回的WINDOW_UPDATE帧得知接收端当前可用的缓冲区大小,从而调整自身的发送速率。
  • 拥塞控制:在TCP层面上,也有拥塞窗口(Congestion Window)的概念,它是TCP协议内在的拥塞控制机制,用来应对网络状况的变化,防止过多的数据包在网络中积压造成拥塞。

    • gRPC并未专门实现额外的拥塞控制算法,而是依赖于底层的TCP/IP协议栈提供的拥塞控制机制。

滑动窗口控制发送和接收速率
在gRPC中,滑动窗口机制是用来执行流量控制的关键。每个gRPC流的两端都有一个动态调整的窗口大小,窗口大小表示了接收端愿意接受的最大字节数。当接收端消费了数据并释放了缓冲区空间后,它会通过发送WINDOW_UPDATE帧通知发送端增大窗口大小,从而允许发送端发送更多的数据。发送端则需要遵守这个窗口大小限制,不会发送超过接收端窗口大小的数据,这样既实现了流量控制,又确保了数据传输的可靠性和稳定性。

最后编辑: kuteng  文档更新时间: 2024-04-02 09:53   作者:kuteng