http & http2 & http3 队首阻塞问题


2019/8/13

现在有三个请求

req1 req2 req3

比较三种协议

# HTTP1

  • 一个接一个传输响应,串行传输: req1 -> req2 -> req3
  • 存在问题:若当 req2 请求丢失,则需等待 req2 处理完成,才能处理后面的请求

# HTTP2

  • 将三个请求拆成小块:
    • req1_1 req1_2 req1_3 ...
    • req2_1 req2_2 req2_3 ...
    • req3_1 req3_2 req3_3 ...
  • 再以流的方式,包装成一个个 数据包 传输
    • (req1_1 req2_1 req2_2) -> (req1_2 req2_3 req3_1) -> (req1_3 req3_2 req3_3)
  • 存在问题:在 tcp 层面以流的方式传输,说到底依然是串行的,需要一个数据包一个数据包的发送,因此当数据包中的某一个数据帧(比如 req2_3)丢失了,则整个数据包(req1_2 req2_3 req3_1)需要重新发送,并且后面的数据包需要等待处理结果

# HTTP3

  • 基于 udp 的传输层协议,意味着在发送 数据包 中的 数据帧 时是无序的,传输过来的数据包会存在内存中,当一个数据包中的所有数据帧都传输完成之后在合并组装起来
  • 因此当某一个 数据帧 丢失的时候,只需重新发送该数据帧即可,并不会影响后续的传输
  • 基本完全解决了队首阻塞问题
Last Updated: 12/2/2019, 9:23:57 AM