展开描述
QUIC 传输协议实现
QUIC 是一种现代传输协议,针对 TCP 的不足之处进行了改进,例如队头阻塞、安全性弱、握手慢以及拥塞控制效率低下等。本 crate 提供了一套可移植的用户态实现。它构建于 quinn-proto 之上,后者实现了与具体运行时无关的协议逻辑。
本 crate 的入口点是 Endpoint。
§About QUIC
QUIC 连接是两个端点之间的关联。发起连接的端点称为客户端,接受连接的端点称为服务器。单个端点可以针对不同连接同时充当客户端和服务器,例如在对等应用中。为了传输应用数据,每个端点都可以打开流,但流的数量受对端限制。通常该限制会随着旧流的结束而增加。
流可以是单向或双向的,创建开销很低且用完即可丢弃。例如,传统面向数据报的应用可以为每条要发送的消息使用一个新流,而无需再考虑 MTU 问题。双向流的行为与传统 TCP 连接非常相似,适合发送需要立即响应的消息,例如 HTTP 请求。流数据是可靠交付的,不同流之间的数据不保证顺序。
通过避免队头阻塞并在同一连接的所有流之间提供统一的拥塞控制,QUIC 能够在相同两个主机之间的一条或多条 TCP 连接之上提供更高的吞吐量和更低的延迟,同时相比原始 UDP 套接字提供更有用的语义。
Quinn 还提供不可靠的数据报接口,这是一种底层原语,适合在不需要对某些数据进行自动分片和重传时使用。
QUIC 直接基于 TLS 1.3 构建加密与身份验证机制。正如 TLS 服务器一样,QUIC 服务器最好使用由可信机构签发的证书来标识身份。如果这一点难以做到——例如服务器是短生命周期的或不绑定域名——那么与 TLS 一样,可以使用自签名证书来单纯提供加密。
重新导出§
模块§
- congestion
- 控制数据发送速率的逻辑
- crypto
- QUIC 加密协议的 trait 与实现
结构体§
- Accept
- 由
Endpoint::accept产生的 Future - Accept
Bi - 由
Connection::accept_bi产生的 Future - Accept
Uni - 由
Connection::accept_uni产生的 Future - AckFrequency
Config - 用于控制对端确认(ACK)频率的参数
- Application
Close - 应用层给出的关闭连接的原因
- Bloom
Token Log - 基于布隆过滤器的
TokenLog - Chunk
- 来自接收流的一块数据
- Client
Config - 出站连接的配置
- Closed
Stream - 表示流尚未打开或已经结束 / 重置的错误
- Connecting
- 正在进行的连接尝试的 Future
- Connection
- 一个 QUIC 连接。
- Connection
Close - 传输层给出的关闭连接的原因
- Connection
Id - 连接的协议级标识符。
- Connection
Stats - 连接统计信息
- Endpoint
- 一个 QUIC 端点。
- Endpoint
Config - 端点的全局配置,会影响所有连接
- Endpoint
Stats - 关于 Endpoint 活动的统计信息
- Frame
Stats - 每种帧类型已发送或已接收的数量
- Frame
Type - QUIC 帧类型
- Idle
Timeout - 在使连接超时之前所允许的最大空闲时长
- Incoming
- 一个尚未由服务器开始其握手部分的入站连接
- Incoming
Future - 一个基础适配器,让
Incoming能够像Connecting一样被await - MtuDiscovery
Config - 控制 MTU 探测的参数。
- None
Token Log TokenLog的空实现,从不接受任何 token- None
Token Store TokenStore的空实现,不存储任何 token- OpenBi
- 由
Connection::open_bi产生的 Future - OpenUni
- 由
Connection::open_uni产生的 Future - Path
Stats - 与某条传输路径相关的统计信息
- Read
Datagram - 由
Connection::read_datagram产生的 Future - Recv
Stream - 只能用于接收数据的流
- Retry
Error - 尝试重试一个
Incoming时产生的错误,因为它已带有一个先前重试留下的 token - Send
Datagram - 由
Connection::send_datagram_wait产生的 Future - Send
Stream - 只能用于发送数据的流
- Server
Config - 控制入站连接的参数
- StdSystem
Time TimeSource的默认实现- Stream
Id - 特定连接中某条流的标识符
- Token
Memory Cache TokenStore的一个实现:在内存中为有限数量的服务器名称各存储最多N个 token- Token
Reuse Error - 校验 token 疑似被复用时产生的错误
- Tokio
Runtime - 用于 Tokio 的 Quinn 运行时
- Transmit
- 一个出站数据包
- Transport
Config - 控制 QUIC 核心状态机的参数
- Transport
Error Code - 传输层错误码
- UdpStats
- 连接上已发送或已接收的 UDP 数据报统计信息
- Validation
Token Config - 用于在入站连接中发送和处理校验 token 的配置
- VarInt
- 一个小于 2^62 的整数
- VarInt
Bounds Exceeded - 当使用大于等于 2^62 的值构造
VarInt时返回的错误 - Written
- 指示一次写入操作中已传输的字节数和块数
- Zero
RttAccepted - 在连接完全建立时完成的 Future
枚举§
- Config
Error - 端点配置中的错误
- Connect
Error - 用于创建新连接的参数中的错误
- Connection
Error - 连接可能丢失的原因
- Dir
- 流是双向通信还是仅由发起方单向通信
- EcnCodepoint
- 显式拥塞通知 (ECN) 码点
- Read
Error - 从流读取时产生的错误。
- Read
Exact Error - 从流读取时产生的错误。
- Read
ToEnd Error - 由
RecvStream::read_to_end产生的错误 - Reset
Error - 在等待流被重置时产生的错误
- Send
Datagram Error - 发送数据报时可能产生的错误
- Side
- 端点是连接的发起方还是接收方
- Stopped
Error - 在监视对端停止发送流时产生的错误
- Write
Error - 向流写入时产生的错误
trait§
- Async
Timer - 异步定时器的抽象实现,用于运行时无关性
- Async
UdpSocket - UDP 套接字的抽象实现,用于运行时无关性
- Connection
IdGenerator - 为入站连接生成连接 ID
- Runtime
- 对 I/O 与定时器操作的抽象,用于运行时无关性
- Time
源代码 - 用于获取当前
SystemTime的对象 - Token
Log - 负责限制客户端复用校验 token 的能力
- Token
Store - 负责存储从服务器接收到的校验 token,并在后续连接中取出使用
- UdpPoller
- 通过轮询检测关联的
AsyncUdpSocket是否可写
函数§
- default_
runtime - 从编译时启用的运行时中自动选择一个合适的运行时