大家好,我是渔夫。
今天分享主题,Cloudflare 开源的 Quiche 作为 QUIC 和 HTTP/3 的实现,提供了处理 QUIC 数据包和连接状态管理的底层 API,允许开发者在他们的应用程序中集成 QUIC 和 HTTP/3 的功能。
Quiche 是 Cloudflare 开发的一个开源项目,它是 QUIC 协议的一个实现,用 Rust 语言编写。
QUIC 是一种新的网络传输协议,由 Google 开发,旨在提高网络流量的安全性和性能。QUIC 协议默认进行加密,以减少数据传输的延迟,并提供更快的连接建立时间。
虽然,quiche 是 QUIC 实现中较新的一个,但它已经能够与其他更成熟的实现进行互操作,并展示了 QUIC 的许多特性。Quiche 和 QUIC 本身都还在不断完善中,随着在互联网上更广泛地部署 QUIC,也将不断发现并修复bug,实现新的功能,并在实践中学习和进步,拭目以待。
使用 quiche 建立 QUIC 连接的第一步是创建一个 Config 对象:
let mut config = quiche::Config::new(quiche::PROTOCOL_VERSION)?;config.set_application_protos(&[b"example-proto"]);
该 Config 对象控制 QUIC 连接的重要方面,如 QUIC 版本、ALPN ID、流量控制、拥塞控制、空闲超时和其他属性或功能。Config 还保存 TLS 配置。这可以通过现有对象上的修改器来更改,或者通过手动构建 TLS 上下文并使用with_boring_ssl_ctx_builder(),配置对象可以在多个连接之间共享。
在客户端,connect() 实用程序函数可用于创建新连接,而 accept()用于服务器端:
// Client connection.let conn = quiche::connect(Some(&server_name), &scid, local, peer, &mut config)?;// Server connection.let conn = quiche::accept(&scid, None, local, peer, &mut config)?;
在这两种情况下,应用程序负责生成新的源连接 ID,该 ID 将用于标识新连接。
应用程序还需要传递连接的远程对等点的地址:对于客户端来说,这是它尝试连接的服务器的地址,对于服务器来说,这是发起连接的客户端的地址连接。
使用连接的 recv()方法,可以处理来自网络的属于该连接的传入数据包:
let to = socket.local_addr().unwrap();loop { let (read, from) = socket.recv_from(&mut buf).unwrap(); let recv_info = quiche::RecvInfo { from, to }; let read = match conn.recv(&mut buf[..read], recv_info) { Ok(v) => v, Err(quiche::Error::Done) => { // Done reading. break; }, Err(e) => { // An error occurred, handle it. break; }, };}
传出数据包是使用连接的 send() 方法生成的。
loop { let (write, send_info) = match conn.send(&mut out) { Ok(v) => v, Err(quiche::Error::Done) => { // Done writing. break; }, Err(e) => { // An error occurred, handle it. break; }, }; socket.send_to(&out[..write], &send_info.to).unwrap();}
发送数据包时,应用程序负责维护计时器以对基于时间的连接事件做出反应。可以使用连接的方法获取计时器到期时间 timeout()。
let timeout = conn.timeout();
应用程序负责提供计时器实现,该实现可以特定于所使用的操作系统或网络框架。当计时器到期时,on_timeout()应调用连接的方法,之后可能需要在网络上发送其他数据包。
// Timeout expired, handle it.conn.on_timeout();// Send more packets as needed after timeout.loop { let (write, send_info) = match conn.send(&mut out) { Ok(v) => v, Err(quiche::Error::Done) => { // Done writing. break; }, Err(e) => { // An error occurred, handle it. break; }, }; socket.send_to(&out[..write], &send_info.to).unwrap();}
更多使用,可以到官网进行查阅丰富的文档。
本文链接:http://www.28at.com/showinfo-26-87971-0.html互联网中,速度与安全性是永恒追求的,Rust 编写的 QUIC 协议,到底有多强?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 绝妙 C++ 技巧:轻松掌握数值交换!