Quiche是IETF指定的QUIC传输协议和HTTP/3的实现。它提供了用于处理QUIC数据包和处理连接状态的低级API。该应用程序负责提供I/O(例如插座处理)以及支持计时器的事件循环。
有关乳蛋饼是如何产生的更多信息以及对其设计的一些见解,您可以在Cloudflare博客上阅读一篇文章,以详细介绍。
Quiche Powers Cloudflare Edge Network的HTTP/3支持。 CloudFlare-Quic.com网站可用于测试和实验。
Android的DNS解析器使用乳蛋饼在HTTP/3上实现DNS。
可以将乳蛋饼集成到卷发中,以提供HTTP/3的支持。
可以使用非正式贴片将乳蛋饼集成到NGINX中,以提供HTTP/3的支持。
在潜入乳蛋饼API之前,以下是一些示例,介绍了如何使用作为蛋饼应用板条箱的一部分提供的乳蛋饼工具。
根据建筑部分中提到的命令将项目克隆后,可以按以下方式运行客户端:
$ CARGO RUN-BIN QUICHE-CLIENT-https://cloudflare-quic.com/
虽然服务器可以如下运行:
$货物运行 - bin quiche-server-- -Cert Apps/src/bin/cert.crt -key Apps/src/bin/cert.key
(请注意,所提供的证书是自签名的,不应在生产中使用)
使用--help
命令行标志,以获取每个工具选项的更详细说明。
使用quiche建立Quic连接的第一步是创建一个Config
对象:
让mut config = quiche :: config :: new(quiche :: protoct_version)?; config.set_application_protos(&[b“ example-proto'']); // //其他针对应用程序和用例的其他配置...
Config
对象控制QUIC连接的重要方面,例如QUIC版本,ALPN ID,流控制,拥塞控制,空闲超时以及其他属性或功能。
QUIC是一种通用传输协议,有几种配置属性,没有合理的默认值。例如,任何特定类型的并发流数量的允许数量取决于在QUIC上运行的应用程序以及其他特定的特定问题。
Quiche将几个属性默认为零,应用程序很可能需要将其设置为其他东西以满足其需求:使用以下内容:
set_initial_max_streams_bidi()
set_initial_max_streams_uni()
set_initial_max_data()
set_initial_max_stream_data_bidi_local()
set_initial_max_stream_data_bidi_remote()
set_initial_max_stream_data_uni()
Config
还持有TLS配置。可以通过现有对象上的突变器或手动构造TLS上下文并使用with_boring_ssl_ctx_builder()
来更改这。
配置对象可以在多个连接之间共享。
在客户端上, connect()
实用程序函数可用于创建新连接,而accept()
则用于服务器:
// client connection.let conn = quiche :: connect(某些(&server_name),&scid,local,peer和mut config)?; // connect.let conn = quiche :: cack accept(&scid,none,local,local,peer,peer,,peer,,peer,,peer,peceer,peceer,peceer,peceer,peer,peer,peer,peer,peeer,connect,peer,peer,peer,peer,peceer,conterry.peer conn = quiche :: &mut config)?
使用连接的recv()
方法,应用程序可以处理网络属于该连接的传入数据包:
lay to = socket.local_addr()。unwrap(); loop {lop {lop(read,trom)= socket.Recv_from(&mut buf).unwrap(); let recv_info = quiche :: recvinfo匹配conn.recv(&mut buf [.. read],recv_info){ok(v)=> v,err(e)=> {//发生错误,ander.break;},};}
使用Connection的send()
方法生成传出数据包:
loop {let(write,send_info)=匹配conn.send(&mut out){ok(v)=> v,err(quiche :: errir :: error :: dook down) e)=> {//发生错误,whate it it.break;},}; socket.send_to(&out [.. write], &send_info.to).unwrap();}
发送数据包时,该应用程序负责维护计时器以对基于时间的连接事件做出反应。可以使用连接的timeout()
方法获得计时器到期。
让超时= conn.timeout();
该应用程序负责提供计时器实现,该计时器可以特定于操作系统或使用的网络框架。计时器到期时,应调用连接的on_timeout()
方法,之后可能需要在网络上发送其他数据包:
//超时已过期,处理it.conn.on_timeout(); // // timeout.loop {let(write,send_info)= match conn.send(&mut out){ok(v)=> v, err(quiche :: errir :: douath)=> {//完成写作。break;},err(e)=> {//发生错误,处理it.break;},}; socket.send_to(&out [.. write],&send_info.to).unwrap();}
建议应用程序的应用程序发送外发数据包,以避免创建可能导致网络中短期拥塞和损失的数据包爆发。
Quiche通过send()
方法返回的[ SendInfo
]结构的[sendinfo]结构的[sendinfo]结构的[ at
]字段公开了提示提示。该字段表示应将特定数据包发送到网络的时间。
应用程序可以通过人为地通过平台特定的机制(例如Linux上的SO_TXTIME
套接字选项)或自定义方法(例如,使用用户空间计时器)来使用这些提示。
在来回进行一些方面,连接将完成其握手,并准备好发送或接收应用程序数据。
可以使用stream_send()
方法在流上发送数据:
如果conn.is_establed(){//完成握手,请在stream 0.conn.stream_send上发送一些数据(0,b“ hello”,true)?}
该应用程序可以通过使用连接的readable()
方法来检查是否有任何可读的流,该流可以在所有具有出色数据的流中返回迭代器。
然后,可以使用stream_recv()
方法从可读流中检索应用程序数据:
如果conn.is_establed(){// iTAble readable streams.for contrable()in contrable(){//流是可读取的,请读取直到没有更多数据。当ok ok((read,fin,fin))= conn.stream_recv (stream_id,&mut buf){println!(“ rack {} {}”,读取,reats,stream_id);}}}}}}}
Quiche HTTP/3模块提供了高级API,用于在Quic传输协议之上发送和接收HTTP请求和响应。
请查看[quiche/xpless/]目录,以获取有关如何使用乳蛋白API的更完整示例,包括有关如何在C/C ++应用程序中使用Quiche的示例(有关更多信息,请参见下文)。
乳蛋饼在Rust API顶部暴露了一个薄的C API,可以更轻松地将蛋饼整合到C/C ++应用程序中(以及其他语言,这些语言允许通过某种形式的FFI调用C API)。 C API遵循与Rust One相同的设计,Modulo C语言本身施加的约束。
运行cargo build
时,将自动构建一个名为libquiche.a
的静态库。这是完全独立的,可以直接链接到C/C ++应用程序中。
请注意,为了启用FFI API,必须通过将--features ffi
给cargo
,必须启用ffi
功能(默认情况下是禁用的)。
乳蛋饼需要生锈1.67或以后才能构建。最新的稳定生锈释放可以使用Rustup安装。
一旦设置了生锈的环境,就可以使用git获取蛋饼源代码:
$ git克隆 - 恢复https://github.com/cloudflare/quiche
然后使用货物建造:
$货物建造 - 例例
货物也可以用来运行测试仪:
$货物测试
请注意,用于基于TLS实现Quic的加密握手的BoringsSL需要构建并链接到乳蛋饼。当使用货物构建乳蛋白时,这是自动完成的,但是需要在构建过程中可用cmake
命令。在窗户上,您还需要NASM。官方的BoringsSL文档有更多详细信息。
在替代方案中,您可以通过使用QUICHE_BSSL_PATH
环境变量配置boringssl目录来使用自己的自定义boringssl构建:
$ quiche_bssl_path =“/path/to/boringssl”货物构建 - 示例
另外,您可以使用openssl/quictls。为了使Quiche使用此供应商,可以将openssl
功能添加到--feature
列表中。请注意,如果使用此供应商,则不支持0-RTT
。
可以使用Cargo-NDK(v2.0或更高版本)进行Android的建筑物乳蛋饼(NDK版本19或更高版本,建议使用21个)。
首先,需要使用Android Studio或直接安装Android NDK,并且需要将ANDROID_NDK_HOME
环境变量设置为NDK安装路径,例如:
$ export android_ndk_home =/usr/local/local/share/android-ndk
然后,可以安装为Android体系结构的Rust Tool链,如下所示:
$ RUSTUP目标添加AARCH64-LINUX-ANDROID ARMV7-LINUX-ANDRIDEABI I686-LINUX-ANDOAD X86_64-LINUX-ANDOED
请注意,所有目标体系结构的最小API级别为21。
还需要安装Cargo-NDK(v2.0或更高版本):
$货物安装货物-NDK
最后,可以使用以下过程来构建Quiche库。请注意, -t <architecture>
和-p <NDK version>
选项是强制性的。
$ CARGO NDK -T ARM64 -V8A -P 21-构建-FFI -FFI
有关更多信息,请参见build_android_ndk19.sh。
要为iOS构建乳蛋饼,您需要以下内容:
安装XCode命令行工具。您可以使用XCode或以下命令安装它们:
$ xcode-select-安装
为iOS体系结构安装Rust工具链:
$ rusup target添加aarch64-apple-ios x86_64-apple-ios
安装cargo-lipo
:
$货物安装货物lipo
要构建Libquiche,请运行以下命令:
$ CARGO LIPO- FEATURES FFI
或者
$ CARGO LIPO - FEATURES FFI-释放
iOS构建在Xcode 10.1和Xcode 11.2中进行了测试。
为了构建Docker图像,只需运行以下命令:
$制造码头建造
您可以在以下Docker集线器存储库上找到Quiche Docker图像:
Cloudflare/quiche
Cloudflare/Quiche-QN
latest
标签将在乳蛋饼主分支更新时更新。
Cloudflare/quiche
提供安装在/usr/local/bin中的服务器和客户端。
Cloudflare/Quiche-QN
提供脚本来测试Quic-Interop-runner中的蛋饼。
版权(C)2018-2019,Cloudflare,Inc。
请参阅复制许可证。