文章目录
- 一、HTTP3简述
- 二、为什么不升级改造TCP而使用UDP?
- 三、QUIC的实现
- 四、HTTP3改进详解
- 1. 快速连接建立(1-RTT初次建立,0-RTT恢复)
- 2. 无队头阻塞(Head-of-Line Blocking)
- 重传机制
- HTTP/2 中的流
- HTTP/3 中的流
- 3. 移动性和连接迁移 connection id
- 4. 更高的安全性 TLS1.3
- 5. 更好的性能
- 6. 避免协议僵化
- 7. 高效的错误恢复和流量控制
- 五、HTTP3阻力
其他HTTP版本知识内容见:http://t.csdnimg.cn/0b7i8
图片来源和知识参考:
【QUIC核心原理和握手过程】 https://www.bilibili.com/video/BV1Mg411s7mP/?share_source=copy_web
【HTTP/3是什么?为什么需要一个新版本?QUIC为什么基于UDP?】 https://www.bilibili.com/video/BV1Ru4y1f7Ph/?share_source=copy_web
一、HTTP3简述
---------摘自维基百科
HTTP/3是第三个主要版本的HTTP协议。与其前任HTTP/1.1和HTTP/2不同,在HTTP/3中,将弃用TCP协议,改为使用基于UDP协议的QUIC协议(快速的UDP网络连接)
实现。
此变化主要为了解决HTTP/2中存在的队头阻塞
问题。由于HTTP/2在单个TCP连接上使用了多路复用,受到TCP拥塞控制的影响,少量的丢包就可能导致整个TCP连接上的所有流被阻塞。
PS:http2利用二进制分帧实现多路复用,解决的是HTTP层(http1.1)的队头线性阻塞
- HTTP/1.1 的队头阻塞: 在 HTTP/1.1 中,引入了持久连接和管道化(Pipelining),允许在一个连接中发送多个请求。然而,由于串行处理方式,如果一个请求处理变慢或被阻塞,后续所有的请求都会受到影响。这也是对头阻塞的一种表现。
- 示例:一个浏览器发送了多个HTTP请求(A、B、C)给服务器。如果请求A处理得很慢或被阻塞,浏览器必须等待请求A完成后才能处理请求B和请求C,尽管请求B和C可以并行处理。这会导致对头阻塞。
原文链接:https://blog.csdn.net/qq_62311779/article/details/139873062
HTTP/2仍然会存在对头阻塞(TCP的对头阻塞)
的问题,那是因为HTTP/2其实还是依赖TCP协议
实现的。
- TCP传输过程中会把数据拆分为一个个按照顺序排列的数据包,这些数据包通过网络传输到了接收端,接收端再按照顺序将这些数据包组合成原始数据,这样就完成了数据传输。但是如果其中的某一个数据包没有按照顺序到达,接收端会一直保持连接等待数据包返回,这时候就会阻塞后续请求。这就发生了TCP队头阻塞。
- HTTP/2虽然实现了多路复用,即在一个TCP连接上同时处理多个请求,但由于它是基于TCP协议的,当发生丢包时,TCP协议需要等待前面的包被成功接收后才会发送后面的包,这就导致了队头阻塞问题。
二、为什么不升级改造TCP而使用UDP?
TCP协议僵化,难以升级
UDP作为传统传输层协议,广泛的的设备都支持,避免升级和改造。
UDP协议快,低延时
三、QUIC的实现
详细了解QUIC协议可阅读维基百科:https://zh.wikipedia.org/wiki/QUIC
quic实现于用户空间(应用空间)
内核空间 vs 用户空间
- 内核空间:这是操作系统内核执行的地方,具有最高的权限,直接控制硬件资源。内核空间中的代码具有高效率和低延迟,但修改和调试非常复杂,且需要系统级权限。
- 用户空间:这是应用程序运行的地方,权限受到限制,无法直接访问硬件资源。用户空间中的代码易于修改和调试,但其操作需要通过系统调用与内核通信,这会带来一定的性能开销。
TCP/IP 协议栈实现
-
传统的TCP/IP协议栈通常实现于内核空间。这意味着操作系统内核负责处理所有TCP/IP数据包的发送、接收、处理和路由。
优点:
- 高效的网络数据包处理。
- 可靠的内核级错误处理和拥塞控制。
缺点:
- 修改和优化协议栈需要操作系统内核级别的更改,这很复杂且不易部署。
- 开发和调试协议栈需要系统级权限,增加了开发难度。
QUIC的用户空间实现
-
QUIC协议栈在用户空间中实现。这意味着QUIC协议的所有逻辑处理都在应用程序级别完成,而不是在操作系统内核中。
优点:
-
灵活性和可扩展性:因为QUIC协议在用户空间中实现,开发者可以更容易地修改、优化和扩展协议功能,而无需更改操作系统内核。这大大简化了协议的开发和部署过程。
-
独立更新:由于在用户空间中实现,QUIC协议的更新和升级可以通过简单的软件更新来实现,而不需要操作系统的更新。这对于快速迭代和发布新版本尤为重要。
-
应用级控制:应用程序可以更直接地控制和优化网络行为。例如,Google的BoringSSL库中实现了QUIC的加密和传输功能,能够更好地与应用需求相适应。
用户空间实现的挑战
-
性能开销:由于需要在用户空间和内核空间之间进行系统调用,用户空间实现的网络协议可能面临性能开销。不过,QUIC通过UDP进行传输,避免了一些TCP的开销,并通过高效的用户空间实现技术(如零拷贝)来减小这些性能损失。
-
安全性:用户空间代码的安全性往往不如内核空间代码。因此,QUIC协议需要特别注意安全机制的设计和实现,确保数据传输的安全性。(
这也是为什么内置了TLS1.3的原因
)
-
四、HTTP3改进详解
1. 快速连接建立(1-RTT初次建立,0-RTT恢复)
-
RTT(Round-Trip Time),即往返时间,是在计算机网络中衡量数据包从发送端传输到接收端再返回发送端所花费的总时间。这个时间包括了数据包在网络中的传播时间、接收端处理并响应的时间,以及响应数据包再次传输回发送端的时间。
关于TLS中的RTT讲解
,请看:http://t.csdnimg.cn/pt57n -
低延迟连接建立
:HTTP/3 使用 QUIC 协议,它结合了 UDP 和内置的 TLS 1.3,能够在一个往返时间(RTT)内完成连接建立,甚至支持 0-RTT 数据传输。1-RTT 握手
:QUIC 协议设计允许在一次往返时间内完成连接建立。这通过集成的 TLS 1.3 实现,即在初始握手中完成加密密钥的协商。0-RTT 数据传输
:如果客户端之前与服务器建立过连接,可以通过 0-RTT 数据传输机制在初次请求时就发送应用数据,进一步减少延迟。
HTTP2中的RTT
HTTP3中的RTT
2. 无队头阻塞(Head-of-Line Blocking)
TCP ----> UDP
联系流--->独立流
-
改进的多路复用:HTTP/3 通过 QUIC 的多路复用能力,解决了 HTTP/2 中的队头阻塞问题,提高了传输效率和用户体验。
实现机制
:- 独立的流控制:QUIC 使用
独立的流控制
,每个流都有独立的拥塞控制和丢包恢复机制
。这意味着一个流的丢包不会影响其他流的数据传输。 - 帧级别的重传:QUIC 使用帧来传输数据,每个数据包可以包含多个帧。丢失的数据包只会影响该数据包中的帧,而不会影响其他数据包,只需重传相关的帧,而不会影响其他帧。这与 TCP 不同,TCP 会因为丢包而阻塞整个连接。
- 独立的流控制:QUIC 使用
重传机制
HTTP3重传机制
:请看 http://t.csdnimg.cn/fL11F
HTTP/2 中的流
基于 TCP 的流
:
- 多路复用:HTTP/2 使用一个 TCP 连接来承载多个并行的流,
每个流对应一个 HTTP 请求和响应对
。流通过流 ID
区分,流 ID 在每个帧的头部
指定。 - 队头阻塞:由于 HTTP/2 基于 TCP,而 TCP 提供的是可靠、有序的传输保证,一个数据包的丢失会阻塞整个连接中的所有流,直到丢失的数据包被重传。
- 流量控制:HTTP/2 实现了流量控制机制,允许发送方限制接收方的流量,以避免拥塞。流量控制在连接级别和流级别上同时实现。
具体实现
:
- 帧:数据被分割成多个帧,每个帧属于一个特定的流。帧类型包括数据帧、头部帧、优先级帧等。
- 重传机制:依赖
TCP 层的重传机制
。当一个 TCP 数据包丢失时,整个数据包(包括多个 HTTP/2 帧)需要重传。
HTTP/3 中的流
基于 QUIC 的流:
- 独立的多路复用:HTTP/3 使用
QUIC 作为传输协议
。QUIC 在UDP
之上实现,每个流
在 QUIC 中都是独立
的,多个流在同一 QUIC 连接中并行传输
,互不干扰。 - 无队头阻塞:
QUIC
提供独立的流控制和错误恢复机制
,一个流的丢包只影响该流,而不会阻塞其他流。这解决了 HTTP/2 中的队头阻塞问题。 - 流量控制:QUIC 提供独立的流量控制,每个流有单独的流量控制窗口,允许更精细的流量管理。
具体实现
:
- 帧:QUIC 也使用帧来传输数据。每个 QUIC 包可以包含多个帧,帧类型包括流帧、ACK 帧、握手帧等。
- 重传机制:
QUIC
具有内置的快速重传
机制。丢失的数据包会被快速检测到并重传,而不会影响其他包。每个流都有独立的包编号和确认机制
,确保高效的数据传输。
3. 移动性和连接迁移 connection id
优点
:
- 连接保持:当设备的网络环境变化(如从 Wi-Fi 切换到移动数据网络)时,HTTP/3 可以保持现有的连接不中断。
实现机制
:
- 连接ID:QUIC 使用连接ID来标识连接,而不是依赖于 IP 地址和端口。这允许连接在网络变化时保持不变,只需更新连接ID即可。
- 迁移支持:当客户端的网络环境变化时,可以通过发送新的连接ID来继续使用现有的连接,而无需重新建立连接。
HTTP2连接基于传输层TCP,根据四元组来建立一条连接的,也就是sip 、dip、sport、dport
HTTP3连接基于传输层QUIC,根据connection id标识和建立一条连接
4. 更高的安全性 TLS1.3
优点:
- 内置强加密:HTTP/3 通过 QUIC 内置的 TLS 1.3 提供强大的安全性,保护数据的机密性和完整性。
实现机制:
- TLS 1.3 集成:QUIC 协议在传输层直接集成了 TLS 1.3,简化了加密实现,并提供了更高的安全保障。每个数据包都是加密的,确保传输中的数据无法被窃听或篡改。
- 快速密钥协商:通过快速密钥协商机制,QUIC 能够在连接建立时迅速协商加密密钥,减少初始握手时间。
5. 更好的性能
优点:
- 低延迟和高吞吐量:HTTP/3 提供了更低的延迟(0-RTT)和更高的吞吐量,适用于实时应用和高流量网站。
实现机制:
- 拥塞控制和丢包恢复:QUIC 使用现代的拥塞控制算法(如 BBR),提供更好的带宽利用和丢包恢复机制。每个流有独立的拥塞控制,优化了整体传输性能。
- UDP 优化:通过使用 UDP 而不是 TCP,QUIC 避免了 TCP 的慢启动和其他性能瓶颈,同时利用 UDP 的灵活性进行高效的数据传输。
6. 避免协议僵化
优点
:
- 独立于操作系统的实现:HTTP/3 和 QUIC 在用户空间实现,不依赖于操作系统内核,易于部署和更新。
实现机制
:
- 用户空间实现:QUIC 协议栈在用户空间实现,允许开发者快速迭代和部署新特性和安全补丁,而无需等待操作系统的更新。
- 独立的版本控制:由于在用户空间实现,QUIC 可以独立于操作系统进行版本控制和更新
7. 高效的错误恢复和流量控制
优点:
- 快速错误恢复:在发生数据包丢失时,HTTP/3 可以快速恢复,不会影响整个连接的传输效率。
实现机制:
- 独立的错误恢复机制:每个流都有独立的错误恢复机制,确保丢失的数据包不会影响其他流的传输。QUIC 使用基于帧的重传机制,只重传丢失的数据包部分。
- 细粒度的流量控制:QUIC 提供更细粒度的流量控制,允许对每个流单独进行流量管理,优化带宽利用。