当前位置: 首页 > news >正文

10、HTTP/3有了解过吗?【中高频】

image-20240105144308801

  • HTTP/2 虽然具有多个流并发传输的能力,但是传输层是 TCP 协议,依然存在缺陷:

    • 队头阻塞,HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整、连续的当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,这些数据才会作为一个整体发送给应用层,这就是 HTTP/2 队头阻塞问题。

    • TCP 和 TLS 握手时延,TCP 三次握手和 TLS 四次握手,共有 3-RTT 的时延;

      img

    • 连接迁移需要重新连接。我们是基于四元组(源 IP、源端口、目的 IP、目的端口)来确认一条 TCP 连接的,那么网络环境变化后,就会导致 IP 地址或端口变化,于是 TCP 只能断开连接,然后在新的网络环境中重新建立连接,造成了时间成本

  • 为了解决TCP的问题,HTTP/3 就在传输层 改用 UDP,并基于 UDP 在「应用层」实现了 QUIC 协议,来保证数据的可靠传输。

    QUIC 协议的特点:

    • 无队头阻塞:QUIC 连接上的多个 Stream 之间是分离的,互相独立的,QUIC 能够正确区分。某个流发生丢包了,只会影响该流,其他流不受影响;

      HTTP/1与HTTP/2和HTTP/3的多路复用

      • 对于HTTP/2,如果一个B丢失了,那么之后到来的A和C都不能正确接收了,只有等这个缺失的B到来后,才会将ABC统一发给HTTP层
      • 对于HTTP/3,如果一个B丢失了,QUIC会正常接收之后的A和C,并把它们交给HTTP/3层,无需等待这个缺失的B到来
    • 建立连接速度快,因为 QUIC 内部包含 TLS 1.3,建立连接和密钥协商只需要1个RTT。当HTTP/3 第二次连接时,有效负载数据与第一个数据包一起发送,可以做到 0-RTT

      TLS、TCP和QUIC握手持续时间比较

      HTTP/2与HTTP/3协议栈比较
    • 连接迁移:QUIC 协议 没有使用四元组,而是使用 连接 ID 来标记通信的两端,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以复用原连接,不再需要重新建立连接

  • 帧格式变化:

    HTTP/3 同 HTTP/2 一样采用二进制帧的结构,不同的地方在于 HTTP/2 的二进制帧里需要定义 Stream,而 HTTP/3 自身不需要再定义 Stream,直接使用 QUIC 里的 Stream ,所以HTTP/3 的帧格式就非常简单

    image-20240105144457456

  • 头部压缩算法:

    HTTP/3 在头部压缩算法这一方面也做了升级,升级成了 QPACK。 QPACK 也采用了静态表、动态表及 Huffman 编码。

    • 对于静态表的变化,HTTP/2 中的 HPACK 的静态表只有 61 项,而 HTTP/3 中的 QPACK 的静态表扩大到 91 项。
    • 对于动态表的变化,当编码方的更新动态表的请求出现丢包的时候,解码方动态表就不能及时更新,从而无法正确解码下一个报文。而QPACK专门设置了两个单向流,一条用于编码方 向 解码方 发送请求,另一条用于 解码方 发送更新完成的响应。在收到响应之后,编码方才会发送下一个报文。这样就保证在下一次请求发送之前,解码方的动态表已经完成了更新。
http://www.lryc.cn/news/546352.html

相关文章:

  • 基于https虚拟主机配置
  • 小白入坑向:Java 全栈系统性学习推荐路线之一
  • 云原生存储架构:构建数据永续的新一代存储基础设施
  • QTableWidget之表格列的隐藏与显示(折叠)
  • Leetcode3146. 两个字符串的排列差
  • 二百八十五、华为云PostgreSQL——建分区表并设置主键
  • 系统架构设计师-第3章 数据库设计
  • SAP MDG —— MDG on S/4HANA 2023 FPS03 创新汇总
  • 软考中级-数据库-3.2 数据结构-数组和矩阵
  • 有符号数和无符号数的加减运算
  • 动态链接器(十):重定位
  • EGO-Planner的无人机视觉选择(yolov5和yolov8)
  • IO标准函数和时间函数
  • 为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心
  • 【零基础到精通Java合集】第二十三集:G1收集器深度解析
  • 似然函数与极大似然估计
  • QSFP(Quad Small Form-factor Pluggable)详解
  • WDM_OTN_基础知识_波分系统基本构成-无源器件
  • 【音视频】ffmpeg音视频处理基本流程
  • 【网络编程】之TCP实现客户端远程控制服务器端及断线重连
  • 云原生容器编排:构建智能弹性应用的自动化引擎
  • centos虚拟机安装
  • 社会力模型:Social force model for pedestrian dynamics
  • 机器学习数学通关指南
  • 【Mac】2025-MacOS系统下常用的开发环境配置
  • # C# 中堆(Heap)与栈(Stack)的区别
  • ubuntu离线安装nvidia-container-runtime
  • 用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录
  • 学习笔记-DeepSeek在开源第四天发布DualPipe和EPLB两项技术
  • C++入门基础知识1