QUIC中文文档 RFC9000中文文档人工翻译 第一章:Overview

1.概述

​ QUIC 是一种安全的通用传输协议。文档定义了 QUIC 协议的第一个版本。它符合[QUIC不变特性]QUIC协议中与版本无关属性。QUIC 是一种面向连接的协议,它在客户端和服务器之间创建有状态的交互。QUIC 是一种面向连接的协议,它在客户端和服务器之间创建有状态的交互。

​ QUIC 握手结合了加密和传输参数的协商。 QUIC 集成了 TLS 握手,尽管使用定制的帧来保护数据包。 TLS 和 QUIC 的集成在 . 握手的结构允许尽快交换应用程序数据。 这包括客户端立即发送数据的选项 (0-RTT:Round-Trip Time 往返时延),这需要事先以某种形式的通信或配置才能启用。

​ 端点通过QUIC通信是通过交换QUIC 数据包。 大多数数据包都包含帧,这些帧在端点之间携带控制信息和应用程序数据。 QUIC 对每个数据包的整体进行身份验证,并尽可能多地加密每个数据包。 QUIC 数据包使用 UDP 数据报传输,以更好地促进其在现有系统和网络中的部署。

​ 应用协议使用QUIC协议交换信息是通过流实现的(streams),流是有序的字节序列。 可以创建两种类型的流:双向流,允许两个端点发送数据; 和单向流,只允许单个端点发送数据。 基于信用的方案用于限制流创建并限制可以发送的数据量

​ QUIC 提供必要的反馈来实现可靠的交付和拥塞控制。在第六节(QUIC-Recovery)中描述了一种用于检测和恢复数据丢失的算法。 QUIC依靠拥塞控制来避免网络拥塞。 示例性拥塞控制算法在第七节。

​ QUIC 连接并不严格绑定到单个网络路径。 连接迁移使用连接标识符来允许连接转移到新的网络路径。 只有客户端才能在此版本的 QUIC 中迁移。 此设计还允许在网络拓扑或地址映射发生变化(例如可能由 NAT 重新绑定引起)后继续连接。

​ 一旦连接建立,就会为连接终止提供多个选项。 应用程序可以管理正常关闭,端点可以协商超时期限,错误可以导致立即连接断开,并且无状态机制支持在一个端点丢失状态后终止连接。

1.1 文档结构

本文档描述了核心 QUIC 协议,结构如下

  • 流是 QUIC 提供的基本服务抽象。
  • 第 2 节 描述了与流相关的核心概念
  • 第 3 节 提供了流状态的参考模型
  • 第 4 节 概述了流控制的操作。
  • 连接是 QUIC 端点通信的上下文。
    • 第 5 节 描述了与连接相关的核心概念
    • 第 6 节描述了版本协商
    • 第 7 节详细介绍了建立连接的过程
    • 第 8 节描述了地址验证和关键的拒绝服务缓解措施
    • 第 9 节描述了端点如何将连接迁移到新的网络路径
    • 第 10 节列出了终止的选项一个开放的连接
    • 第 11 节提供了流和连接错误处理的指南
  • 数据包和帧是QUIC用来通信的基本单位
    • 第 12 节描述了与数据包和帧相关的概念
    • 第 13 节定义了数据传输、重传和确认的模型
    • 第 14 节指定了管理携带 QUIC 数据包的数据报大小的规则
  • 最后,QUIC 协议元素的编码细节在
    • 第 15 节(版本)
    • 第 16 节(整数编码)
    • 第 17 节(包头)
    • 第 18 节(传输参数)
    • 第 19 节(帧)
    • 第 20 节(错误)

​ 随附的文档描述了 QUIC 的丢失检测和拥塞控制,以及 TLS 和其他加密机制的使用。

本文档定义了 QUIC 版本 1,并且符合[QUIC-INVARIANTS]中的协议不变特性

​ 要参考 QUIC 版本 1,请引用此文档。 对 QUIC 的有限版本独立属性集的引用可以引用[QUIC-INVARIANTS]

1.2 术语和定义

当这些关键词出现在文档中,当且仅当他们出现为大写,如展示的这种”MUST“,"MUST NOT", "REQUIRED", "SHALL" ,"SHALL NOT", "SHOULD" ,"SHOULD NOT", "RECOMMENDED" ,"NOT RECOMMENDED" ,"MAY", "OPTIONAL"。需要按照 BCP14 [RFC2119],[RFC8174] 中的说明进行解释。

本文档中的常用术语描述如下:

QUIC: 本文档描述的传输协议。 QUIC 是一个名称,而不是首字母缩略词

EndPoint: 可以通过生成、接收和处理 QUIC 数据包来参与 QUIC 连接的实体。 QUIC 中只有两种类型的端点:客户端和服务器。

Client: 发起 QUIC 连接的终端

Server: 接受 QUIC 连接的终端

QUIC package: 一个完整的 QUIC 可处理单元,可以封装在 UDP 数据报中。 一个或多个 QUIC 数据包可以封装在单个 UDP 数据报中

Ack-eliciting packet:一个 QUIC 数据包,包含除 ACK、PADDING 和 CONNECTION_CLOSE 之外的帧。 这些会导致收件人发送确认信号

Frame: 一种结构化协议信息的单位。 有多种帧类型,每一种都携带不同的信息。 帧包含在 QUIC 数据包中。

Address :当没有获取授权资格的时候,表示网络路径一端的 IP 版本、IP 地址和 UDP 端口号的元组。

Connection ID:用于标识端点处的 QUIC 连接的标识符。 每个端点为其对等端选择一个或多个连接 ID,以包含在发送给端点的数据包中。 此值对对等方不透明。

Stream:QUIC 连接中有序字节的单向或双向通道。 一个 QUIC 连接可以同时传输多个流。

Application: 使用 QUIC 发送和接收数据的实体。

本文档使用术语“QUIC 数据包”、“UDP 数据报”和“IP 数据包”来指代各个协议的单元。 即一个或多个QUIC数据包可以封装在一个UDP数据报中,UDP数据报又封装在一个IP数据包中

1.3 符号约定

本文档中的数据包和帧图使用自定义格式。 这种格式的目的是总结而不是定义协议元素, 而是定义了结构的完整语义和细节。

复杂字段被命名的--由一对匹配的大括号包围的字段列表。 此列表中的每个字段都用逗号分隔

各个字段包括长度信息,以及有关固定值、可选性或重复性的指示。 各个字段使用以下符号约定,所有长度均以bits为单位

x(A):表明x是A bits长度,例如x(4) x是4bit长度

x(i):表示 x 使用第 16 节中描述的可变长度编码保存一个整数值

x(A..B):表示x可以是从A到B的任意长度; A可以省略,表示最少0位,B可以省略,表示没有设置上限; 这种格式的值总是以字节边界结束。

x(L)=C: 表示x有一个固定值C; x 的长度由 L 描述,它可以使用上面的任何长度形式

x (L) = C..D:表示 x 的取值范围为 C 到 D(含),长度由 L 描述,和上面一样

[x (L)] :表示 x 是可选的,长度为 L

x (L) ...: 表示 x 重复零次或多次,并且每个实例的长度为 L

本文档使用网络字节顺序(即大字节序)值。 字段从每个字节的高位bit开始放置。

按照惯例,单个字段通过使用复杂字段的名称来引用复杂字段

Figure1 提供了一个例子

Example Structure {
 One-bit Field (1),
 7-bit Field with Fixed Value (7) = 61,
 Field with Variable-Length Integer (i),
 Arbitrary-Length Field (..),
 Variable-Length Field (8..24),
 Field With Minimum Length (16..),
 Field With Maximum Length (..128),
 [Optional Field (64)],
 Repeated Field (8) ...,
}

Figure 1: Example Format

当在文中引用一个One-bit字段时,该字段的位置可以通过使用带有字段值集的字段的byte的值来阐明,例如,值 0x80 可用于引用字节最高有效位中的One-bit字段,比如Figure 1中的One-bit 字段。

上一篇:Django之Form和ModelForm组件


下一篇:分页框架(Pager-taglib)的使用