private-octopus/picoquic

GitHub: private-octopus/picoquic

Picoquic 是一个用 C 语言编写的 IETF QUIC 协议极简实现,旨在为 QUIC 标准开发提供反馈验证并支持非 HTTP 应用场景的探索。

Stars: 754 | Forks: 238

# picoquic 由 IETF 定义的 QUIC 协议的极简实现。 IETF 规范始于 Google 定义并在 Chrome 中实现的 QUIC 版本,但 IETF 规范独立于 Chrome,并且不尝试向后兼容。 本项目的第一个目标是为 IETF QUIC WG 中 QUIC 标准的开发提供反馈。有关该工作组的信息可在 https://datatracker.ietf.org/wg/quic/charter/ 获取。QUIC 已作为 RFC 9000 发布,但仍有一些正在进行的工作,例如 multipath。Picoquic 使开发者能够测试这些新工作。 第二个目标是尝试非 HTTP 开发的 API,例如 DNS over QUIC——参见 RFC 9250。然后还有许多我们梦寐以求的其他功能,例如对 peer-to-peer 应用程序或 forward error correction 的支持。这些已在规划之中,但目前尚未实现。 当前版本的 Picoquic 支持 [RFC 9000](https://datatracker.ietf.org/doc/rfc9000)、 [RFC 9001](https://datatracker.ietf.org/doc/rfc9001)、 [RFC 9002](https://datatracker.ietf.org/doc/rfc9002) 和 [RFC 8999](https://datatracker.ietf.org/doc/rfc8999) 中的 QUIC 规范。 它还实现了以下扩展: * QUIC datagrams,依据 [RFC 9221]((https://datatracker.ietf.org/doc/rfc9221) * QUIC 的兼容版本协商,依据 [RFC 9368](https://www.rfc-editor.org/info/rfc9368) * QUIC Version 2,依据 [RFC 3969](https://datatracker.ietf.org/doc/rfc9369/) * Greasing the QUIC bit,依据 [RFC 9287](https://datatracker.ietf.org/doc/rfc9287/) * QUIC ACK Frequency,依据 [ACK Frequency Draft](https://datatracker.ietf.org/doc/draft-ietf-quic-ack-frequency/) 版本 04 * QUIC Spin Bit,依据 RFC 9000, * 不断发展的 [QUIC Multipath draft](https://datatracker.ietf.org/doc/draft-ietf-quic-multipath/), * 作为 QUIC Multipath draft 替代方案的 [simple multipath](https://github.com/huitema/quicmpath) * 实验性的 [BDP draft](https://datatracker.ietf.org/doc/draft-kuhn-quic-bdpframe-extension/), 已在各种卫星链路和星际链路仿真中进行了测试。 * 实验性的 [Timestamp Draft](https://datatracker.ietf.org/doc/draft-huitema-quic-ts/) * 实验性的 AEGIS TLS/QUIC cipher suites,依据 [AEGIS TLS/DTLS/QUIC draft](https://www.ietf.org/archive/id/draft-denis-tls-aegis-06.html) 版本 06。 该发行版还包括根据 [RFC 9114](https://www.rfc-editor.org/rfc/rfc9114.html) 的 HTTP3 最小实现,包括兼容 [RFC9204](https://www.rfc-editor.org/rfc/rfc9204.html) 的 QPACK 静态实现,并支持以下扩展: * HTTP Datagrams 和 Capsules,依据 [RFC 9297](https://www.rfc-editor.org/rfc/rfc9114.html) * 基于 HTTP3 的 Web Transport,依据 [Web Transport Draft](https://datatracker.ietf.org/doc/draft-ietf-webtrans-http3/) 此代码库中的代码是稳定的。性能优化工作正在进行中——最近的测试表明 picoquic 发送数据的速度高达 5Gbps。 目前有许多 QUIC 的实现,列于 https://github.com/quicwg/base-drafts/wiki/Implementations。一些实现为 "Quic Interop Runner" 项目提供了 docker 镜像,其结果每日在 https://interop.seemann.io/ 更新。 Bastian Köcher 开发了 picoquic 库的 [RUST](https://www.rust-lang.org/en-US/) 绑定。 他的代码库可以在[这里](https://github.com/bkchr/picoquic-rs)找到。 您可能需要检查一下。 # 开发 Picoquic 目前是作为 Visual Studio 2017 项目开发的,并在 Windows 和 Linux 上同时进行测试。它依赖于 [Picotls implementation of TLS 1.3](https://github.com/h2o/picotls)。 Picotls 有两种模式:一种依赖于 OpenSSL 的功能丰富版本,以及一种仅依赖于 "minicrypto" 库的精简版本。目前,Picoquic 使用 OpenSSL 版本,并具有对 OpenSSL 的依赖。 该项目由一个核心库、一个测试库 和一个测试程序 组成。所有这些都是用 C 语言编写的。在 Visual Studio 项目中,测试库被封装在 Visual Studio unittest 框架中,这使得在开发过程中进行便捷的回归测试成为可能。在 Linux 构建中,测试是通过命令行程序运行的。 # 里程碑 正如 Wiki 中所解释的,Picoquic 在 QUIC Interop 日期间针对其他实现进行了积极测试。参见 https://github.com/private-octopus/picoquic/wiki/QUIC-milestones-and-interop-testing。 当前版本与版本 1 [RFC 9000](https://datatracker.ietf.org/doc/rfc9000/) 保持一致。 DNS over QUIC 的实现可从 [Quicdoq](https://github.com/private-octopus/quicdoq) 获取。DNS over QUIC 本身很有趣,但它也提供了一个在 Picoquic 之上构建不同于 HTTP 的应用程序的示例。 我们正在花时间改进实现和文档,包括对[记录架构和 API](doc/architecture.md) 的初步尝试。最初的重点是正确性而不是性能。我们将保持正确性,但我们会提高性能,特别是根据应用程序的实际经验。为了方便进行性能测试,demo 程序包含了 [quic performance test protocol](doc/quicperf.md) 的实现。 欢迎有关文档、API、性能等方面的建议。请随时开启一个 issue。 计划中的开发包括支持 multipath 的标准版本、改进对 Real Time Media over QUIC 的支持,以及各种其他研究问题,特别是与拥塞控制相关的问题。 # 构建 Picoquic Picoquic 使用 C 语言开发,可以在 Windows 或 Linux 下构建。构建项目首先需要管理其依赖项 [Picotls](https://github.com/h2o/picotls) 和 OpenSSL。请注意,您需要最新版本的 Picotls——Picotls API 最近已进行更新,以支持最新版本的 QUIC。当前代码已针对 2023 年 10 月 31 日星期二 11:23:32 +0900、commit `af66fc4aa8853b0725fcb2c18a702e8f1c656cf1` 之后的 Picotls 版本进行了测试。(请注意,最近的这些提交通过删除现已过时的 ESNI draft 的代码更改了 Picotls API;早期版本将无法与 Picoquic 配合使用。) 该代码可以使用 OpenSSL 1.1.1 版本或 OpenSSL 3.0 版本。 更多信息可以在 [文档](doc/building_picoquic.md) 中找到。 ## Windows 上的 Picoquic 要在 Windows 上构建 Picoquic,您需要: * 在您的机器上安装并构建 Openssl * 在环境变量 OPENSSLDIR 中记录 Openssl 的安装位置(x64 构建对应 OPENSSL64DIR) * 确保在该位置有 `libcrypto.lib` 的副本,并且在 `include` 位置有 `applink.c` 的副本:win32 构建为 $(OPENSSLDIR)\include\,x64 构建为 $(OPENSSL64DIR)\include\。 * 使用 Picotls for Windows 选项克隆并编译 Picotls。picotls 项目应与 picoquic 项目处于相同的目录级别,并且文件夹名称应保持为 picotls。 * 使用源码中包含的 Visual Studio 2017 解决方案 picoquic.sln 克隆并编译 Picoquic。 * 您可以使用 Visual Studio 解决方案中包含的单元测试来验证此移植。 ## Linux 上的 Picoquic 感谢 Deb Banerjee 和 Igor Lubashev 对 Linux 构建体验的贡献。 要在 Linux 上构建 Picoquic,您可以选择单独构建 picotls,或使用集成的选项。在这两种情况下,您都需要首先在您的机器上安装并构建 Openssl。 要逐步构建,您应该: * 按照 Picotls 文档中的说明,使用 cmake 克隆并编译 Picotls。 * 克隆并编译 Picoquic: ``` cmake . make ``` 除了单独构建 picotls 外,您还可以使用集成的选项(感谢 Paul E. Jones 和 Suhas Nandakumar 的开发): * 在单个命令中克隆并编译 Picoquic 和 Picotls: ``` cmake -DPICOQUIC_FETCH_PTLS=Y . make ``` AEGIS 支持是实验性的,并且是可选的:使用 `-DWITH_AEGIS=ON` 进行构建,并配合兼容的 picotls/libaegis 支持,以通告和协商 AEGIS 套件。 无论哪种方式,您都可以验证一切是否正常: * 运行测试程序 `picoquic_ct` 来验证移植。 这些测试在 Intel 64 位虚拟机上使用 GitHub actions 验证了代码在 Ubuntu 下是否能够正确编译和运行。我们依赖用户的反馈来验证在其他架构(例如 ARM)上的行为。感谢 @defermelowie 在 ARM 32 位上的测试。 ## MacOSX 上的 Picoquic 感谢 Frederik Deweerdt 确保 Picoquic 能够在 MacOSX 上运行。构建步骤与 Linux 相同。这些测试在 Intel 64 位虚拟机上使用 GitHub actions 验证了代码在 MacOS 下是否能够正确编译和运行。我们依赖用户的反馈来验证在其他架构(例如 M1)上的行为。感谢 @defermelowie 在 M1 上的测试。 ## FreeBSD 上的 Picoquic 构建步骤与 Linux 相同。Picoquic 很可能也适用于其他 BSD 变体,但目前仅对 FreeBSD 进行了测试。 ## 在 CLI 模式下使用 Picoquic 请参阅 [用法](doc/usage.md) 了解如何从 shell 中使用各种命令。 ## 开发应用程序 抱歉,目前还没有太多的文档。随着我们充实 wiki,这些内容将会出现。您最好的选择是查看发行版中包含的演示程序 "picoquicdemo"。源代码位于 "picoquicfirst/picoquicdemo.c"。`sample` 文件夹包含了一个简单文件传输协议的代码示例,这可能是一个很好的起点。有关更多详细信息,请查看 sample 文件夹中的 README.md 文件。 ## 测试之前的版本 代码会不断更新以追踪规范的最新版本。它目前符合 Version 1,并将协商对相应版本 `0x00000001` 的支持——即 QUIC Transport version 1。Picoquic 也会接受协商向下直至 draft-27 的先前版本。 # 创建 QLOG 日志文件 请参阅 [如何使用 picoquic 生成 QLOG 文件](doc/QLOG.md)
标签:Bash脚本, QUIC, 内核驱动, 可视化界面, 安全测试工具, 客户端加密, 底层开发, 网络协议, 网络通信