跳转到内容

纯 Zig 的 QUIC 实现

从零开始用 Zig 编写的 IETF QUIC transport —— 支持 QUIC v1 与 v2、 纯 Zig TLS 1.3(含 0-RTT 与后量子密钥交换)、multipath, 握手路径已与 Go 和 Rust 协议栈完成真实线路互通验证。

quicz 的主握手和带 FIN 的 stream echo 路径由真实 UDP 探针覆盖:进程内 loopback、 独立进程 Zig,以及独立实现、启用证书校验的 Go 与 Rust 客户端。

Terminal window
$ zig-out/bin/quicz-tls13-process-echo-server 127.0.0.1 4443 2 concurrent-retry &
$ (cd examples/interop/go_echo_client && \
go run . -addr 127.0.0.1:4443 -ca ../testdata/quicz-echo-ca.pem -server-name localhost)
# quic-go client ↔ quicz server:完成 TLS 1.3 握手,随后 stream 0 / 4 上
# 分别验证带 FIN 的 "hello" / "world" echo —— 全程开启证书校验。
  • 纯 Zig TLS 1.3 + 0-RTT —— 不依赖 C 密码学库;支持后量子 X25519Kyber768。
  • QUIC v1 与 v2 transport —— stream、flow control、连接迁移、path validation、Retry、stateless reset、密钥更新、版本协商。
  • DATAGRAM、multipath、ECN、PMTU、GSO/GRO、连接池、qlog。
  • Loss recovery + NewReno / CUBIC / BBR,含报文 pacing。
  • HTTP/3 + QPACK 静态表WebTransport 基础实现。
  • 线路级互通验证:quic-go、quinn、QUIC-Interop-Runner。
var conn = try quicz.Connection.init(
std.heap.page_allocator, .client, .{
.initial_max_data = 65_536,
.initial_max_stream_data = 65_536,
.initial_max_streams_bidi = 16,
});
defer conn.deinit();
const id = try conn.openStream();
try conn.sendOnStream(id, "hello", true);
var buf: [1350]u8 = undefined;
const frame = (try conn.pollTx(0, &buf))
orelse return error.NoPendingFrame;

完整步骤见快速开始

对端 语言 / 协议栈 探针
quic-go Go 启用证书校验的 echo client/server
quinn Rust 启用证书校验的 echo client
QUIC-Interop-Runner handshake、transfer、retry 自测
quicz(独立进程) Zig loopback UDP 上独立 client + server

自己跑一遍:示例指南

权威功能矩阵在四个协议栈上追踪 37 项能力,覆盖率汇总如下:

指标 quic-go quiche s2n-quic quicz
传输层(19 项) 19/19 14/19 14/19 19/19
拥塞控制(4 项) 4/4 4/4 3/4 4/4
密码套件(5 项) 5/5 5/5 5/5 5/5
应用层(6 项) 6/6 3/6 0/6 2/6
平台(3 项) 2/3 0/3 1/3 1/3
合计(37 项) 36/37 26/37 23/37 31/37

quicz 在传输层、拥塞控制与密码套件上领先,剩余差距集中在应用层广度。完整 37 行 逐项对比与差距分析见功能对比

状态 能力
基础实现,持续完善 HTTP/3 连接管理(GOAWAY / SETTINGS / 流生命周期);WebTransport 会话
暂未实现 QPACK 动态表;HTTP Datagrams (RFC 9297);流重置部分交付;FIPS 140-3;XDP 零拷贝 I/O

权威状态与验收证据见传输任务矩阵。 API 趋于稳定但仍在演进。

  • 快速开始 —— 把 quicz 加入 Zig 构建,发出第一个 frame。
  • 功能对比 —— quicz vs quic-go / quiche / s2n-quic,37 行。
  • 架构 —— endpoint、connection 与 TLS 层如何组合。
  • 规范覆盖 —— RFC 9000/9001/9002 逐节状态。
  • 示例 —— loopback、echo server 与 Go/Rust 互通命令。