▲扫描图中二维码了解音视频技术大会更多信息▲
翻译、编辑:Alex
技术审校:刘连响
本文来自_Smashing Magazine_,原文链接:
https://www.smashingmagazine.com/2021/08/http3-core-concepts-part1/
你也许很好奇:为什么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数据、连接迁移、应对网速慢和丢包的更强恢复能力)。所有这些新事物基本上可以总结为四个主要变化:
QUIC与TLS深度集成。
QUIC支持多个独立的字节流。
QUIC使用连接ID。
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规范中被定义为明文