facebook/mvfst

GitHub: facebook/mvfst

Facebook 开源的 IETF QUIC 传输协议的高性能 C++ 实现,适用于客户端与服务器的大规模部署场景。

Stars: 1652 | Forks: 288

![替代文本](logo.png "MVFST") [![Linux 构建状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/71/71d32159d3b0c92197e32aad80cb77a042abca5c98b4dd5fbc92c51bd8808d30.svg)](https://github.com/facebook/mvfst/actions/workflows/getdeps_linux.yml) [![macOS 构建状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/54/54bc34a9a5baf473c0b622be0b92275e1fae424d28980fd95b1e13a6e4be031e.svg)](https://github.com/facebook/mvfst/actions/workflows/getdeps_mac.yml) [![Windows 构建状态](https://static.pigsec.cn/wp-content/uploads/repos/cas/62/62b5fd35f264f3a5fc8bc6e23100d91fcfb049fc788fd310b0229ad9df35b71a.svg)](https://github.com/facebook/mvfst/actions/workflows/getdeps_windows.yml) ## 简介 `mvfst`(发音为 *move fast*)是由 Facebook 使用 C++ 开发的 [IETF QUIC](https://quicwg.org/) 协议的客户端和服务器实现。QUIC 是一种基于 UDP 的可靠、多路复用传输协议,将成为一项互联网标准。`mvfst` 的目标是构建一个高性能的 QUIC 传输协议实现,使应用程序能够将其应用于互联网和数据中心的各种场景。`mvfst` 已经在 android、iOS 应用以及服务器上进行了大规模测试,并具有多项支持大规模部署的功能。 ## 功能 **服务器功能**: - 具有线程本地(thread local)架构的多线程 UDP socket 服务器,能够扩展以适应多核服务器 - 可定制的 Connection-Id 路由。默认的 Connection-Id 路由实现与 [katran](https://github.com/facebookincubator/katran) 无缝集成 - 支持服务器零停机重启的 API,以便应用程序在重启时不必断开连接 - 暴露传输层和服务器统计信息的 API,以便于调试 - Zero-Rtt 连接建立和可定制的零 RTT 路径验证 - 支持 UDP 通用分段卸载(GSO)以实现更快的 UDP 写入 **客户端功能**: - 原生支持 ipv4 和 ipv6 之间的 happy eyeballs 机制,因此应用程序无需自行实现 - 可插拔的拥塞控制,并支持关闭拥塞控制以接入应用程序特定的控制算法 ## 源码目录结构 - `quic/api`: 定义应用程序可用于与 QUIC 传输层交互的 API。 - `quic/client`: 客户端传输实现 - `quic/codec`: 协议的读写编解码器实现 - `quic/common`: 常用工具函数的实现 - `quic/congestion_control`: 不同拥塞控制算法(如 Cubic 和 Copa)的实现 - `quic/flowcontrol`: 流控函数的实现 - `quic/handshake`: 加密握手层的实现 - `quic/happyeyeballs`: IPV4 和 IPV6 连接竞速并选出优胜者机制的实现 - `quic/logging`: 日志框架的实现 - `quic/loss`: 不同丢包恢复算法的实现 - `quic/samples`: 示例客户端和服务器 - `quic/server`: 服务器传输实现 - `quic/state`: 定义并实现连接和流级别的状态构件与状态机 ## 依赖项 `mvfst` 主要依赖于两个库:[folly](https://www.github.com/facebook/folly) 和 [fizz](https://www.github.com/facebookincubator/fizz)。 ## 构建 mvfst ### 方法 1 \[推荐]:使用 Getdeps.py 该脚本被许多 Meta 的开源工具使用。它会首先下载并构建所有必要的依赖项,然后调用 cmake 等工具构建 mvfst。考虑到您系统本地安装的版本,这将有助于确保您使用所有依赖库的相关版本来进行构建。 它是用 python 编写的,因此您的 PATH 中需要有 python3.6 或更高版本。它可以在 Linux、macOS 和 Windows 上运行。 mvfst 的 cmake 构建设置保存在其 getdeps 清单文件 `build/fbcode_builder/manifests/mvfst` 中,如有需要,您可以在本地进行编辑。 #### 依赖项 如果在 Linux 或 MacOS(已安装 homebrew)上,您可以安装系统依赖项以省去构建它们的步骤: ``` # Clone 仓库 git clone https://github.com/facebook/mvfst.git # 安装依赖 cd mvfst sudo ./build/fbcode_builder/getdeps.py install-system-deps --recursive --install-prefix=$(pwd)/_build mvfst ``` 如果您想在安装前查看这些软件包: ``` ./build/fbcode_builder/getdeps.py install-system-deps --dry-run --recursive mvfst ``` 在其他平台上,或者在 Linux 上没有系统依赖项的情况下,`getdeps.py` 主要会在构建步骤中为您下载并构建它们。 #### 构建 为了简化构建,您可以使用 `getdeps.sh` 包装脚本。这将下载并构建所有必需的依赖项,然后构建 mvfst。它将使用默认的临时路径进行构建,并将结果安装在 _build 中。 ``` # Clone 仓库 git clone https://github.com/facebook/mvfst.git # 使用 wrapper script 构建 cd mvfst ./getdeps.sh ``` 在构建结束时,mvfst 的二进制文件将安装在 `_build/mvfst`。您可以从日志中或通过运行 `python3 ./build/fbcode_builder/getdeps.py show-build-dir mvfst` 找到临时路径。 为了对 `getdeps.py` 进行更多控制,您可以直接运行该工具。 ``` # 显示帮助 python3 ./build/fbcode_builder/getdeps.py build mvfst -h # 构建 mvfst,如果可用则使用系统包作为依赖 python3 ./build/fbcode_builder/getdeps.py --allow-system-packages build mvfst --install-prefix=$(pwd)/_build ``` #### 运行测试 默认情况下,`getdeps.py` 会为 mvfst 构建测试。您也可以使用它来运行测试: ``` python3 ./build/fbcode_builder/getdeps.py test mvfst --install-prefix=$(pwd)/_build ``` ### 方法 2 \[已弃用]:使用 build.sh 脚本 此方法可在 Ubuntu 18+ 和 macOS 上使用。 首先,您应该安装我们构建所需的依赖项。这主要包括来自 [folly](https://github.com/facebook/folly) 以及 [fizz](https://github.com/facebookincubator/fizz) 的依赖项。 ``` sudo apt-get install \ g++ \ cmake \ libboost-all-dev \ libevent-dev \ libdouble-conversion-dev \ libgoogle-glog-dev \ libgflags-dev \ libiberty-dev \ liblz4-dev \ liblzma-dev \ libsnappy-dev \ make \ zlib1g-dev \ binutils-dev \ libjemalloc-dev \ libssl-dev \ pkg-config \ libsodium-dev ``` 然后,构建并安装 folly 和 fizz 或者,运行此子目录中的辅助脚本 `build_helper.sh`。 它将安装并链接所需的依赖项,同时也会构建 folly 和 fizz。 首次运行这可能需要几分钟时间。 ``` ./build_helper.sh ``` 构建完成后,目录 `_build/` 将包含依赖项(位于 `_build/deps` 下),而 `_build/build` 将包含所有为 `mvfst` 构建的库和二进制文件。 您也可以通过提供 `INSTALL_PREFIX` 环境变量,使用构建脚本将 `mvfst` 及其依赖项 `folly` 和 `fizz` 安装到自定义目录中。 ``` ./build_helper.sh -i /usr/local ``` 有关更多选项,请参阅 `./build_helper.sh --help` 您可能需要以 root 用户身份运行脚本才能安装到某些特定目录。 默认情况下,构建脚本 `build_helper.sh` 会启用测试目标的构建(即使用 `-DBUILD_TEST=ON` 选项运行)。由于 `mvfst` 中的某些测试需要 Fizz 的一些测试构件,因此有必要提供 Fizz src 目录的路径(通过选项 `DFIZZ_PROJECT`),以正确构建 `mvfst` 中的所有测试目标。 ## 运行示例客户端和服务器 构建 `mvfst` 的测试目标时,应会自动将示例客户端和服务器二进制文件构建到构建目录中。 对于 `getdeps.py` 构建,您可以在以下位置找到 echo 二进制文件: ``` cd $(python3 ./build/fbcode_builder/getdeps.py show-build-dir mvfst)/quic/samples/echo ``` 对于已弃用的 `build.sh` 脚本,如果您使用了默认的构建路径,它将位于以下位置。 ``` cd ./_build/build/quic/samples/echo ``` 如果未使用 host,服务器默认会自动绑定到 `::1`,但您可以随后通过运行以下命令来启动一个简单的 echo 服务器: ``` ./echo -mode=server -host= -port= ``` 并运行客户端: ``` ./echo -mode=client -host= -port= ``` 有关更多选项,请参阅 ``` ./echo --help ``` ## HTTP/3 此仓库实现了 QUIC 传输层。有关使用 Mvfst 的 HTTP/3 实现,请查看 [Proxygen](https://github.com/facebook/proxygen)。 ## 许可证 `mvfst` 采用 MIT 许可证,详见 LICENSE 文件。 ## API 该 API 应被视为 alpha 阶段。我们无法预测人们将拥有的所有用例,因此我们正在等待一段时间,然后再宣布一个更稳定的 API。我们愿意为不同的约束条件提供几种不同的 API。 ## 报告和修复安全问题 请不要提交 GitHub issues 或 pull requests - 这会使问题立即对所有人可见,包括恶意行为者。`mvfst` 中的安全问题可以通过 Facebook 的 Whitehat Bug Bounty 计划安全地报告:https://www.facebook.com/whitehat Facebook 的安全团队将对您的报告进行分类,并确定它是否有资格获得我们计划下的赏金。
标签:Bash脚本, C++, QUIC, 传输层, 内核驱动, 客户端/服务端, 数据擦除, 网络协议, 网络通信