• HTTP/3核心概念之QUIC


    图片

    ▲扫描图中二维码了解音视频技术大会更多信息▲

    翻译、编辑:Alex

    技术审校:刘连响

    本文来自_Smashing Magazine_,原文链接:

    https://www.smashingmagazine.com/2021/08/http3-core-concepts-part1/

    什么是QUIC?

    你也许很好奇:为什么QUIC如此重要?谁在乎这些特性是在HTTP/3还是QUIC中?在我看来,它很重要,因为QUIC是一个通用传输协议,它和TCP非常相似,除了HTTP和网页加载外,它可以并将用于许多应用场景,比如,DNS、SSH、SMB和RTP等都能运行在QUIC之上。因此,让我们一起来更深入地了解QUIC,因为我读到的关于HTTP/3的大部分误解都来自它。

    图片

    HTTP/2 vs. HTTP/3协议栈对比

    你也许听说过,QUIC运行在另一个被称为UDP(User Datagram Protocol)的协议之上。没错,确实是这样,但并不是许多人所宣称的(性能)原因。理想情况下,QUIC原本可以成为一个完全独立的新型传输协议,直接运行在协议栈中的IP之上(参见上图)。

    然而,这么做会出现我们尝试升级TCP时所产生的相同问题:为了识别和允许QUIC,互联网上的所有设备必须先进行升级。幸运的是,我们将QUIC构建在了另一个在互联网上被广泛支持的传输层协议——UDP之上。

    你知道吗?

    作为最基础的传输协议,除了所谓的端口号(比如,HTTP使用端口80,HTTPS使用端口443,DNS使用端口53),UDP不提供任何特性。它既不会通过握手建立连接,也不可靠:如果一个UDP包丢失,不会获得自动重传。UDP这种“尽力而为”的方法意味着你可以获得高性能:无需等待握手,也没有队头阻塞。实际上,UDP主要用于以高速率更新的实时流量,因此很少受到丢包的影响,因为丢失的数据很快就会过时(比如实时视频会议和游戏)。UDP也可用于低延迟预先请求的场景,比如,只需一次往返即可完成的DNS域名查找。

    许多人声称HTTP/3之所以构建在UDP之上是因为性能。他们说,HTTP/3更快是因为它和UDP一样,不用建立连接也无需等待数据包重传。这些说法都是错误的。正如我们之前所说,QUIC和HTTP/3使用UDP,主要是因为UDP可以使它们更容易部署,因为它已经被互联网上(几乎)所有设备所熟知和实现。

    接着,在UDP之上,QUIC基本上重新实现了使TCP协议变得如此强大和流行(但有些慢)的几乎所有特性。QUIC绝对可靠:它通过确认接收到的数据包[1]和重传[2]来确保丢包依然能够到达。QUIC也会建立连接,并具备非常复杂的握手[3]。

    最后,QUIC也使用所谓的流量控制(flow-control)[4]和拥塞控制(congestion-control)[5]机制来阻止发送方使网络或者接收方超载,但这也使得TCP比UDP更慢。关键是,QUIC以一种比TCP更加巧妙、更加高效的方式实现了这些特性。它将TCP多年的部署经验和最佳实践与一些新的核心特性结合起来。我们将在下文深入讨论这些特性。

    要点:

    上文的要点是:天下没有免费的午餐。HTTP/3并不会仅仅因为我们将TCP换成了UDP而神奇般地比HTTP/2快。相反,我们已经重新构想和实现了一个更加高级的TCP版本,并将其称为QUIC。因为我们想让QUIC更容易部署,所以我们将它运行在UDP之上。

    主要变化

    所以,QUIC在哪些方面优于TCP? 它们之间有何不同?在本系列的下一部分中,我们将具体讨论QUIC中新的特性和机会(0-RTT数据、连接迁移、应对网速慢和丢包的更强恢复能力)。所有这些新事物基本上可以总结为四个主要变化:

    1. QUIC与TLS深度集成。

    2. QUIC支持多个独立的字节流。

    3. QUIC使用连接ID。

    4. QUIC使用多个数据帧(frame)。

    接下来,让我们详细了解每个变化。

    | 没有TLS就没有QUIC

    如前所述,TLS[6]( Transport Layer Security protocol,传输层安全协议)负责保护和加密互联网上发送的数据。当你使用HTTPS时,你的纯文本HTTP数据先由TLS加密,再由TCP传输。

    你知道吗?

    好在这里并不需要介绍TLS的技术细节(https://hpbn.co/transport-layer-security-tls/)。你只需要知道,某些非常高级的数学和非常大的数字(质数)实现了这些加密。在单独的特定TLS加密握手中,客户端和服务器之间协商这些数学参数。像TCP握手一样,这次协商需要一些时间。在TLS的旧版本中(如1.2和更早的版本),通常需要两次网络往返。幸好,新版本的TLS(1.3是最新版本)减少到只需一次往返。这主要是因为TLS 1.3将所协商的不同数学算法严格限制为少数几个(最安全)。这意味着客户端可以立即猜到服务器会支持哪些算法,而无需等待显示列表,从而节省了一次往返。

    图片

    TLS、TCP和QUIC握手持续时间

    互联网发展早期,在处理方面,加密流量的成本非常高。除此之外,并不是所有应用场景都需要这种加密。因此,从历史的角度看,TLS一直都是一个完全独立、可以选择性地运行在TCP之上的协议。这就是HTTP(没有TLS)和HTTPS(有TLS)的区别所在。

    随着时间的推移,我们对待互联网安全的态度(当然)已经转换为“默认安全[7]”。因此,虽然HTTP/2在理论上无需TLS(甚至在RFC规范中被定义为明文

  • 相关阅读:
    小学生护眼灯怎么选?护眼学生用台灯品牌排行
    (Spring笔记)AspectJ后置通知——@AfterReturning切面开发
    浅谈系统架构中的状态
    什么是DOM和DOM操作
    安卓中adb命令工作的底层原理及使用举例
    1.centos7安装docker
    【Java成王之路】EE初阶第十五篇:(网络原理) 5
    利用hutool导出Excel
    45岁程序员精通各种技术体系,竟然连个面试机会都没有?
    乱打日志的男孩运气怎么样我不知道,加班肯定很多
  • 原文地址:https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/126744173