facebook/mvfst
GitHub: facebook/mvfst
Facebook 开源的 IETF QUIC 传输协议的高性能 C++ 实现,适用于客户端与服务器的大规模部署场景。
Stars: 1652 | Forks: 288

[](https://github.com/facebook/mvfst/actions/workflows/getdeps_linux.yml)
[](https://github.com/facebook/mvfst/actions/workflows/getdeps_mac.yml)
[](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, 传输层, 内核驱动, 客户端/服务端, 数据擦除, 网络协议, 网络通信