1. 数据包编号(Packet Number)
每个 QUIC 数据包都有一个唯一的包编号
,这个编号是全局递增
的,而不是像 TCP 那样基于字节的序列号。包编号的独立性使得 QUIC 能够快速检测到哪些数据包丢失,并决定需要重传哪些包。
2. ACK 帧和确认机制
QUIC 使用 ACK 帧
来确认接收到的数据包,并提供详细的丢包信息。ACK 帧包含以下信息:
已接收数据包的最高包编号
。确认的接收包编号范围
。丢失的包编号
。
3. 快速重传和恢复机制
当发送方接收到 ACK 帧后,会根据确认的信息判断哪些数据包需要重传。QUIC 实现了多种重传策略以确保高效的数据传输:
基于时间的重传
- 超时重传:如果发送方在预期的时间内没有收到某个数据包的确认,会触发超时重传。QUIC 通过计算RTT(往返时间)和网络抖动来动态调整重传超时时间。
基于确认的重传
- 快速重传:如果接收到的 ACK 帧中表明一个数据包被确认丢失,发送方会立即重传该数据包,而无需等待超时。这种机制类似于 TCP 中的快速重传,但由于 QUIC 的包编号机制,执行更高效。
4. 独立的流和帧
-
QUIC 中的数据传输基于流和帧,每个流都是独立的,包含多个帧。帧的类型包括数据帧、ACK 帧、握手帧等。丢包重传只涉及具体丢失的帧,而不会影响其他流中的帧。这种设计避免了传统 TCP 中的队头阻塞问题。
在 QUIC 和 HTTP/3 中,数据传输的单位是“包”(packet)和“帧”(frame)- QUIC 包(Packet):QUIC 在 UDP 之上实现,每个 QUIC 包可以包含多个不同类型的帧。包是传输的最小单位,通过网络进行传输。
- HTTP/3 帧(Frame):HTTP/3 数据被分割成帧进行传输。帧是 HTTP/3 协议中的数据单元,一个 QUIC 包可以包含多个 HTTP/3 帧
5. 拥塞控制
- QUIC 实现了现代的拥塞控制算法(如 BBR),确保在网络状况变化时能够动态调整发送速率,优化带宽利用和数据传输效率。QUIC 的拥塞控制机制与重传机制相结合,提高了整体传输性能。
6. 流量控制
- QUIC 为每个流和整个连接分别实现了流量控制。发送方在发送数据前会检查流量控制窗口,确保不会发送超过接收方处理能力的数据量。这有助于在重传时避免网络拥塞和接收方过载。
QUIC 和 HTTP/3 数据传输示例
流程图示
Client Server
| |
|--- QUIC Packet 1 (Frame 1,2) -->|
|--- QUIC Packet 2 (Frame 3,4) -->|
|--- QUIC Packet 3 (Frame 5,6) -->| (Lost)
|--- QUIC Packet 4 (Frame 7,8) -->|
|--- QUIC Packet 5 (Frame 9,10) ->|
| |
|<--- ACK (ack=1,2,4,5; lost=3) - |
| |
|--- Retransmit QUIC Packet 3 --->|
| |
|<--- ACK (ack=3) --------------- |
| |
①数据包发送过程
-
客户端发送 QUIC 包:
- 客户端发送多个 QUIC 包(包 1、2、3、4、5),每个包包含一个或多个 HTTP/3 帧
- 包 1、2、4、5 被成功接收,但包 3 丢失(包 3 可能包含 HTTP/3 的数据帧和控制帧)
-
服务器接收 QUIC 包:
- 服务器接收到包 1、2、4、5,并发送 ACK 帧,确认接收的包编号,同时指出包 3 丢失
②丢包检测和重传
-
客户端接收 ACK 帧:
- 客户端接收到服务器的 ACK 帧,包含确认接收到的包编号(1、2、4、5)和丢失的包编号(3)
-
客户端触发重传:
- 客户端检测到包 3 丢失,立即准备重传包 3。由于 QUIC 的快速重传机制,客户端无需等待超时即可重传丢失的包
-
客户端重传 QUIC 包 3:
- 客户端重传包 3,确保丢失的数据能够重新传输到服务器。包 3 仍然包含原始的 HTTP/3 帧,以便服务器进行处理
③数据包确认和传输完成
-
服务器接收重传的 QUIC 包 3:
- 服务器成功接收到重传的包 3,更新接收状态,并发送新的 ACK 帧,确认包编号 3
-
客户端接收最终 ACK:
- 客户端接收到服务器的 ACK 帧,确认所有包已成功传输,传输过程完成